| // Copyright 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h" |
| |
| #include <gdk/gdk.h> |
| #include <gtk/gtk.h> |
| |
| #include "chrome/browser/ui/gtk/constrained_window_gtk.h" |
| #include "components/web_modal/web_contents_modal_dialog_manager.h" |
| #include "content/public/browser/notification_source.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/browser/web_contents_view.h" |
| #include "ui/base/gtk/gtk_hig_constants.h" |
| #include "ui/base/gtk/gtk_signal.h" |
| #include "ui/gfx/size.h" |
| #include "ui/web_dialogs/web_dialog_delegate.h" |
| #include "ui/web_dialogs/web_dialog_ui.h" |
| |
| using content::WebContents; |
| using ui::WebDialogDelegate; |
| using ui::WebDialogWebContentsDelegate; |
| using web_modal::WebContentsModalDialogManager; |
| |
| namespace { |
| |
| class ConstrainedWebDialogDelegateGtk |
| : public ConstrainedWebDialogDelegateBase { |
| public: |
| ConstrainedWebDialogDelegateGtk( |
| content::BrowserContext* browser_context, |
| WebDialogDelegate* delegate, |
| WebDialogWebContentsDelegate* tab_delegate) |
| : ConstrainedWebDialogDelegateBase( |
| browser_context, delegate, tab_delegate), |
| window_(NULL) {} |
| |
| // WebDialogWebContentsDelegate interface. |
| virtual void CloseContents(WebContents* source) OVERRIDE { |
| gtk_widget_destroy(window_); |
| } |
| |
| void set_window(GtkWidget* window) { window_ = window; } |
| GtkWidget* window() const { return window_; } |
| |
| private: |
| GtkWidget* window_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateGtk); |
| }; |
| |
| void SetBackgroundColor(GtkWidget* widget, const GdkColor &color) { |
| gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &color); |
| gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color); |
| gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color); |
| } |
| |
| } // namespace |
| |
| class ConstrainedWebDialogDelegateViewGtk |
| : public ConstrainedWebDialogDelegate { |
| public: |
| ConstrainedWebDialogDelegateViewGtk( |
| content::BrowserContext* browser_context, |
| WebDialogDelegate* delegate, |
| WebDialogWebContentsDelegate* tab_delegate); |
| |
| virtual ~ConstrainedWebDialogDelegateViewGtk() {} |
| |
| // ConstrainedWebDialogDelegate interface |
| virtual const WebDialogDelegate* |
| GetWebDialogDelegate() const OVERRIDE { |
| return impl_->GetWebDialogDelegate(); |
| } |
| virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE { |
| return impl_->GetWebDialogDelegate(); |
| } |
| virtual void OnDialogCloseFromWebUI() OVERRIDE { |
| return impl_->OnDialogCloseFromWebUI(); |
| } |
| virtual void ReleaseWebContentsOnDialogClose() OVERRIDE { |
| return impl_->ReleaseWebContentsOnDialogClose(); |
| } |
| virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() OVERRIDE { |
| return impl_->window(); |
| } |
| virtual WebContents* GetWebContents() OVERRIDE { |
| return impl_->GetWebContents(); |
| } |
| |
| void SetWindow(GtkWidget* window) { |
| impl_->set_window(window); |
| } |
| |
| GtkWidget* GetWindow() { |
| return impl_->window(); |
| } |
| |
| private: |
| CHROMEGTK_CALLBACK_0(ConstrainedWebDialogDelegateViewGtk, void, OnDestroy); |
| |
| scoped_ptr<ConstrainedWebDialogDelegateGtk> impl_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewGtk); |
| }; |
| |
| ConstrainedWebDialogDelegateViewGtk::ConstrainedWebDialogDelegateViewGtk( |
| content::BrowserContext* browser_context, |
| WebDialogDelegate* delegate, |
| WebDialogWebContentsDelegate* tab_delegate) |
| : impl_(new ConstrainedWebDialogDelegateGtk( |
| browser_context, |
| delegate, |
| tab_delegate)) { |
| gfx::Size dialog_size; |
| delegate->GetDialogSize(&dialog_size); |
| GtkWidget* contents = |
| GTK_WIDGET(GetWebContents()->GetView()->GetNativeView()); |
| gtk_widget_set_size_request(contents, |
| dialog_size.width(), |
| dialog_size.height()); |
| |
| gtk_widget_show_all(contents); |
| |
| g_signal_connect(contents, "destroy", G_CALLBACK(OnDestroyThunk), this); |
| } |
| |
| void ConstrainedWebDialogDelegateViewGtk::OnDestroy(GtkWidget* widget) { |
| if (!impl_->closed_via_webui()) |
| GetWebDialogDelegate()->OnDialogClosed(std::string()); |
| delete this; |
| } |
| |
| ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( |
| content::BrowserContext* browser_context, |
| WebDialogDelegate* delegate, |
| WebDialogWebContentsDelegate* tab_delegate, |
| content::WebContents* web_contents) { |
| ConstrainedWebDialogDelegateViewGtk* constrained_delegate = |
| new ConstrainedWebDialogDelegateViewGtk( |
| browser_context, delegate, tab_delegate); |
| GtkWidget* window = |
| CreateWebContentsModalDialogGtk( |
| constrained_delegate->GetWebContents()->GetView()->GetNativeView(), |
| constrained_delegate->GetWebContents()->GetView()-> |
| GetContentNativeView()); |
| SetBackgroundColor(window, ui::kGdkWhite); |
| constrained_delegate->SetWindow(window); |
| |
| WebContentsModalDialogManager* web_contents_modal_dialog_manager = |
| WebContentsModalDialogManager::FromWebContents(web_contents); |
| web_contents_modal_dialog_manager->ShowDialog(window); |
| |
| return constrained_delegate; |
| } |