diff options
author | wittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-15 10:45:34 +0000 |
---|---|---|
committer | wittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-15 10:45:34 +0000 |
commit | 723d521213dc5818e7ebf919703f59ed3cffaf69 (patch) | |
tree | 6a2950b2d11db1db63ebbca33658c0be4d7713d9 | |
parent | f2fba8ee9c9ed55f858bfd9e87705aa0ee81ae03 (diff) | |
download | chromium_src-723d521213dc5818e7ebf919703f59ed3cffaf69.zip chromium_src-723d521213dc5818e7ebf919703f59ed3cffaf69.tar.gz chromium_src-723d521213dc5818e7ebf919703f59ed3cffaf69.tar.bz2 |
Remove ConstrainedWindowGtkDelegate
Part 3/5 of the Gtk ContstrainedWindow API rework towards removing
ConstrainedWindowGtk in favor of using a native Widget.
Use "destroy" signal to destroy web contents modal dialog contents
classes, rather than explicit requests from ConstrainedWindowGtk.
Remove ConstrainedWindowGtkDelegate.
BUG=157161
Review URL: https://chromiumcodereview.appspot.com/12851002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188325 0039d316-1c4b-4281-b951-d872f2087c98
13 files changed, 117 insertions, 180 deletions
diff --git a/chrome/browser/ui/gtk/collected_cookies_gtk.cc b/chrome/browser/ui/gtk/collected_cookies_gtk.cc index d38e2af..46de438 100644 --- a/chrome/browser/ui/gtk/collected_cookies_gtk.cc +++ b/chrome/browser/ui/gtk/collected_cookies_gtk.cc @@ -121,6 +121,7 @@ CollectedCookiesGtk::CollectedCookiesGtk(GtkWindow* parent, void CollectedCookiesGtk::Init() { dialog_ = gtk_vbox_new(FALSE, ui::kContentAreaSpacing); gtk_box_set_spacing(GTK_BOX(dialog_), ui::kContentAreaSpacing); + g_signal_connect(dialog_, "destroy", G_CALLBACK(OnDestroyThunk), this); GtkWidget* label = gtk_label_new( l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_DIALOG_TITLE).c_str()); @@ -190,7 +191,9 @@ void CollectedCookiesGtk::Init() { blocked_cookies_tree_adapter_->Init(); EnableControls(); ShowCookieInfo(gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook_))); - window_ = CreateWebContentsModalDialogGtk(web_contents_, this); + window_ = CreateWebContentsModalDialogGtk(web_contents_, + dialog_, + close_button_); WebContentsModalDialogManager* web_contents_modal_dialog_manager = WebContentsModalDialogManager::FromWebContents(web_contents_); @@ -400,18 +403,6 @@ CollectedCookiesGtk::~CollectedCookiesGtk() { gtk_widget_destroy(dialog_); } -GtkWidget* CollectedCookiesGtk::GetWidgetRoot() { - return dialog_; -} - -GtkWidget* CollectedCookiesGtk::GetFocusWidget() { - return close_button_; -} - -void CollectedCookiesGtk::DeleteDelegate() { - delete this; -} - bool CollectedCookiesGtk::SelectionContainsHostNode( GtkTreeSelection* selection, gtk_tree::TreeAdapter* adapter) { // Check whether at least one "origin" node is selected. @@ -550,3 +541,7 @@ void CollectedCookiesGtk::OnTreeViewSelectionChange(GtkWidget* selection) { EnableControls(); ShowCookieInfo(gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook_))); } + +void CollectedCookiesGtk::OnDestroy(GtkWidget* widget) { + delete this; +} diff --git a/chrome/browser/ui/gtk/collected_cookies_gtk.h b/chrome/browser/ui/gtk/collected_cookies_gtk.h index 208b6d3c..e951400 100644 --- a/chrome/browser/ui/gtk/collected_cookies_gtk.h +++ b/chrome/browser/ui/gtk/collected_cookies_gtk.h @@ -29,17 +29,11 @@ class WebContents; // ShowCollectedCookiesDialog() on the delegate of the web contents's // content settings tab helper. -class CollectedCookiesGtk : public ConstrainedWindowGtkDelegate, - public gtk_tree::TreeAdapter::Delegate, +class CollectedCookiesGtk : public gtk_tree::TreeAdapter::Delegate, public content::NotificationObserver { public: CollectedCookiesGtk(GtkWindow* parent, content::WebContents* web_contents); - // ConstrainedWindowGtkDelegate methods. - virtual GtkWidget* GetWidgetRoot() OVERRIDE; - virtual GtkWidget* GetFocusWidget() OVERRIDE; - virtual void DeleteDelegate() OVERRIDE; - private: virtual ~CollectedCookiesGtk(); @@ -84,6 +78,7 @@ class CollectedCookiesGtk : public ConstrainedWindowGtkDelegate, OnForSessionBlockedButtonClicked); CHROMEGTK_CALLBACK_2(CollectedCookiesGtk, void, OnSwitchPage, gpointer, guint); + CHROMEGTK_CALLBACK_0(CollectedCookiesGtk, void, OnDestroy); content::NotificationRegistrar registrar_; diff --git a/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc b/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc index a456722..679d429 100644 --- a/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc +++ b/chrome/browser/ui/gtk/constrained_web_dialog_delegate_gtk.cc @@ -45,11 +45,16 @@ class ConstrainedWebDialogDelegateGtk 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 ConstrainedWindowGtkDelegate, - public ConstrainedWebDialogDelegate { + : public ConstrainedWebDialogDelegate { public: ConstrainedWebDialogDelegateViewGtk( content::BrowserContext* browser_context, @@ -79,23 +84,6 @@ class ConstrainedWebDialogDelegateViewGtk return impl_->GetWebContents(); } - // ConstrainedWindowGtkDelegate interface - virtual GtkWidget* GetWidgetRoot() OVERRIDE { - return GetWebContents()->GetView()->GetNativeView(); - } - virtual GtkWidget* GetFocusWidget() OVERRIDE { - return GetWebContents()->GetView()->GetContentNativeView(); - } - virtual void DeleteDelegate() OVERRIDE { - if (!impl_->closed_via_webui()) - GetWebDialogDelegate()->OnDialogClosed(""); - delete this; - } - virtual bool GetBackgroundColor(GdkColor* color) OVERRIDE { - *color = ui::kGdkWhite; - return true; - } - void SetWindow(GtkWidget* window) { impl_->set_window(window); } @@ -105,6 +93,8 @@ class ConstrainedWebDialogDelegateViewGtk } private: + CHROMEGTK_CALLBACK_0(ConstrainedWebDialogDelegateViewGtk, void, OnDestroy); + scoped_ptr<ConstrainedWebDialogDelegateGtk> impl_; DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewGtk); @@ -120,11 +110,21 @@ ConstrainedWebDialogDelegateViewGtk::ConstrainedWebDialogDelegateViewGtk( tab_delegate)) { gfx::Size dialog_size; delegate->GetDialogSize(&dialog_size); - gtk_widget_set_size_request(GTK_WIDGET(GetWidgetRoot()), + GtkWidget* contents = + GTK_WIDGET(GetWebContents()->GetView()->GetNativeView()); + gtk_widget_set_size_request(contents, dialog_size.width(), dialog_size.height()); - gtk_widget_show_all(GetWidgetRoot()); + 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(""); + delete this; } ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( @@ -136,7 +136,12 @@ ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( new ConstrainedWebDialogDelegateViewGtk( browser_context, delegate, tab_delegate); GtkWidget* window = - CreateWebContentsModalDialogGtk(web_contents, constrained_delegate); + CreateWebContentsModalDialogGtk( + web_contents, + constrained_delegate->GetWebContents()->GetView()->GetNativeView(), + constrained_delegate->GetWebContents()->GetView()-> + GetContentNativeView()); + SetBackgroundColor(window, ui::kGdkWhite); constrained_delegate->SetWindow(window); WebContentsModalDialogManager* web_contents_modal_dialog_manager = diff --git a/chrome/browser/ui/gtk/constrained_window_gtk.cc b/chrome/browser/ui/gtk/constrained_window_gtk.cc index dbc1e29..2b69014 100644 --- a/chrome/browser/ui/gtk/constrained_window_gtk.cc +++ b/chrome/browser/ui/gtk/constrained_window_gtk.cc @@ -21,22 +21,14 @@ using content::BrowserThread; -ConstrainedWindowGtkDelegate::~ConstrainedWindowGtkDelegate() { -} - -bool ConstrainedWindowGtkDelegate::GetBackgroundColor(GdkColor* color) { - return false; -} - ConstrainedWindowGtk::ConstrainedWindowGtk( content::WebContents* web_contents, - ConstrainedWindowGtkDelegate* delegate) + GtkWidget* contents, + GtkWidget* focus_widget) : web_contents_(web_contents), - delegate_(delegate), + focus_widget_(focus_widget), visible_(false) { DCHECK(web_contents); - DCHECK(delegate); - GtkWidget* dialog = delegate->GetWidgetRoot(); // Unlike other users of CreateBorderBin, we need a dedicated frame around // our "window". @@ -50,23 +42,16 @@ ConstrainedWindowGtk::ConstrainedWindowGtk( ui::kContentAreaBorder, ui::kContentAreaBorder, ui::kContentAreaBorder, ui::kContentAreaBorder); - if (gtk_widget_get_parent(dialog)) - gtk_widget_reparent(dialog, alignment); + if (gtk_widget_get_parent(contents)) + gtk_widget_reparent(contents, alignment); else - gtk_container_add(GTK_CONTAINER(alignment), dialog); + gtk_container_add(GTK_CONTAINER(alignment), contents); gtk_container_add(GTK_CONTAINER(frame), alignment); gtk_container_add(GTK_CONTAINER(border_), frame); - GdkColor background; - if (delegate_->GetBackgroundColor(&background)) { - gtk_widget_modify_base(border_, GTK_STATE_NORMAL, &background); - gtk_widget_modify_fg(border_, GTK_STATE_NORMAL, &background); - gtk_widget_modify_bg(border_, GTK_STATE_NORMAL, &background); - } - - gtk_widget_add_events(border_, GDK_KEY_PRESS_MASK); - g_signal_connect(border_, "key-press-event", G_CALLBACK(OnKeyPressThunk), + gtk_widget_add_events(widget(), GDK_KEY_PRESS_MASK); + g_signal_connect(widget(), "key-press-event", G_CALLBACK(OnKeyPressThunk), this); g_signal_connect(border_, "hierarchy-changed", G_CALLBACK(OnHierarchyChangedThunk), this); @@ -93,16 +78,15 @@ void ConstrainedWindowGtk::ShowWebContentsModalDialog() { } void ConstrainedWindowGtk::FocusWebContentsModalDialog() { - GtkWidget* focus_widget = delegate_->GetFocusWidget(); - if (!focus_widget) + if (!focus_widget_) return; // The user may have focused another tab. In this case do not grab focus // until this tab is refocused. - if (gtk_util::IsWidgetAncestryVisible(focus_widget)) - gtk_widget_grab_focus(focus_widget); + if (gtk_util::IsWidgetAncestryVisible(focus_widget_)) + gtk_widget_grab_focus(focus_widget_); else - ContainingView()->focus_store()->SetWidget(focus_widget); + ContainingView()->focus_store()->SetWidget(focus_widget_); } void ConstrainedWindowGtk::PulseWebContentsModalDialog() { @@ -140,7 +124,6 @@ void ConstrainedWindowGtk::OnHierarchyChanged(GtkWidget* sender, void ConstrainedWindowGtk::OnDestroy(GtkWidget* sender) { if (visible_) ContainingView()->RemoveWebContentsModalDialog(border_); - delegate_->DeleteDelegate(); WebContentsModalDialogManager* web_contents_modal_dialog_manager = WebContentsModalDialogManager::FromWebContents(web_contents_); web_contents_modal_dialog_manager->WillClose(border_); @@ -153,8 +136,9 @@ void ConstrainedWindowGtk::OnDestroy(GtkWidget* sender) { GtkWidget* CreateWebContentsModalDialogGtk( content::WebContents* web_contents, - ConstrainedWindowGtkDelegate* delegate) { + GtkWidget* contents, + GtkWidget* focus_widget) { ConstrainedWindowGtk* window = - new ConstrainedWindowGtk(web_contents, delegate); + new ConstrainedWindowGtk(web_contents, contents, focus_widget); return window->widget(); } diff --git a/chrome/browser/ui/gtk/constrained_window_gtk.h b/chrome/browser/ui/gtk/constrained_window_gtk.h index 92884db..5d783bac 100644 --- a/chrome/browser/ui/gtk/constrained_window_gtk.h +++ b/chrome/browser/ui/gtk/constrained_window_gtk.h @@ -20,25 +20,6 @@ namespace content { class WebContents; } -class ConstrainedWindowGtkDelegate { - public: - // Returns the widget that will be put in the constrained window's container. - virtual GtkWidget* GetWidgetRoot() = 0; - - // Returns the widget that should get focus when ConstrainedWindowGtk is - // focused. - virtual GtkWidget* GetFocusWidget() = 0; - - // Tells the delegate to either delete itself or set up a task to delete - // itself later. - virtual void DeleteDelegate() = 0; - - virtual bool GetBackgroundColor(GdkColor* color); - - protected: - virtual ~ConstrainedWindowGtkDelegate(); -}; - // Web contents modal dialog implementation for the GTK port. Unlike the Win32 // system, ConstrainedWindowGtk doesn't draw draggable fake windows and instead // just centers the dialog. It is thus an order of magnitude simpler. @@ -47,7 +28,8 @@ class ConstrainedWindowGtk { typedef ChromeWebContentsViewDelegateGtk TabContentsViewType; ConstrainedWindowGtk(content::WebContents* web_contents, - ConstrainedWindowGtkDelegate* delegate); + GtkWidget* contents, + GtkWidget* focus_widget); virtual ~ConstrainedWindowGtk(); void ShowWebContentsModalDialog(); @@ -75,8 +57,8 @@ class ConstrainedWindowGtk { // The top level widget container that exports to our WebContentsView. GtkWidget* border_; - // Delegate that provides the contents of this constrained window. - ConstrainedWindowGtkDelegate* delegate_; + // The widget that should get focus when ConstrainedWindowGtk is focused. + GtkWidget* focus_widget_; // Stores if |ShowWebContentsModalDialog()| has been called. bool visible_; @@ -86,6 +68,7 @@ class ConstrainedWindowGtk { GtkWidget* CreateWebContentsModalDialogGtk( content::WebContents* web_contents, - ConstrainedWindowGtkDelegate* delegate); + GtkWidget* contents, + GtkWidget* focus_widget); #endif // CHROME_BROWSER_UI_GTK_CONSTRAINED_WINDOW_GTK_H_ diff --git a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc index abbb1b9..a49609c 100644 --- a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc +++ b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.cc @@ -30,7 +30,9 @@ MediaGalleriesDialogGtk::MediaGalleriesDialogGtk( // May be NULL during tests. if (controller->web_contents()) { - window_ = CreateWebContentsModalDialogGtk(controller->web_contents(), this); + window_ = CreateWebContentsModalDialogGtk(controller->web_contents(), + contents_.get(), + confirm_); WebContentsModalDialogManager* web_contents_modal_dialog_manager = WebContentsModalDialogManager::FromWebContents( @@ -44,6 +46,10 @@ MediaGalleriesDialogGtk::~MediaGalleriesDialogGtk() { void MediaGalleriesDialogGtk::InitWidgets() { contents_.Own(gtk_vbox_new(FALSE, ui::kContentAreaSpacing)); + g_signal_connect(contents_.get(), + "destroy", + G_CALLBACK(OnDestroyThunk), + this); GtkWidget* header = gtk_util::CreateBoldLabel(UTF16ToUTF8(controller_->GetHeader())); @@ -135,18 +141,6 @@ void MediaGalleriesDialogGtk::ForgetGallery( checkbox_map_.erase(iter); } -GtkWidget* MediaGalleriesDialogGtk::GetWidgetRoot() { - return contents_.get(); -} - -GtkWidget* MediaGalleriesDialogGtk::GetFocusWidget() { - return confirm_; -} - -void MediaGalleriesDialogGtk::DeleteDelegate() { - controller_->DialogFinished(accepted_); -} - void MediaGalleriesDialogGtk::OnToggled(GtkWidget* widget) { if (confirm_) gtk_widget_set_sensitive(confirm_, TRUE); @@ -180,6 +174,10 @@ void MediaGalleriesDialogGtk::OnCancel(GtkWidget* widget) { gtk_widget_destroy(window_); } +void MediaGalleriesDialogGtk::OnDestroy(GtkWidget* widget) { + controller_->DialogFinished(accepted_); +} + // MediaGalleriesDialogController ---------------------------------------------- // static diff --git a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h index 113c89d..dab8248 100644 --- a/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h +++ b/chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h @@ -23,8 +23,7 @@ class MediaGalleriesDialogTest; // The media galleries configuration view for Gtk. It will immediately show // upon construction. -class MediaGalleriesDialogGtk : public MediaGalleriesDialog, - public ConstrainedWindowGtkDelegate { +class MediaGalleriesDialogGtk : public MediaGalleriesDialog { public: explicit MediaGalleriesDialogGtk(MediaGalleriesDialogController* controller); virtual ~MediaGalleriesDialogGtk(); @@ -34,11 +33,6 @@ class MediaGalleriesDialogGtk : public MediaGalleriesDialog, bool permitted) OVERRIDE; virtual void ForgetGallery(const MediaGalleryPrefInfo* gallery) OVERRIDE; - // ConstrainedWindowGtkDelegate implementation: - virtual GtkWidget* GetWidgetRoot() OVERRIDE; - virtual GtkWidget* GetFocusWidget() OVERRIDE; - virtual void DeleteDelegate() OVERRIDE; - // Event callbacks. CHROMEGTK_CALLBACK_0(MediaGalleriesDialogGtk, void, OnToggled); CHROMEGTK_CALLBACK_0(MediaGalleriesDialogGtk, void, OnAddFolder); @@ -59,6 +53,8 @@ class MediaGalleriesDialogGtk : public MediaGalleriesDialog, // Updates the state of the confirm button. It will be disabled when void UpdateConfirmButtonState(); + CHROMEGTK_CALLBACK_0(MediaGalleriesDialogGtk, void, OnDestroy); + MediaGalleriesDialogController* controller_; GtkWidget* window_; diff --git a/chrome/browser/ui/gtk/login_prompt_gtk.cc b/chrome/browser/ui/gtk/login_prompt_gtk.cc index e3f501b..ed523fd 100644 --- a/chrome/browser/ui/gtk/login_prompt_gtk.cc +++ b/chrome/browser/ui/gtk/login_prompt_gtk.cc @@ -36,8 +36,7 @@ using content::WebContents; // the UI thread) to the net::URLRequest (on the I/O thread). // This class uses ref counting to ensure that it lives until all InvokeLaters // have been called. -class LoginHandlerGtk : public LoginHandler, - public ConstrainedWindowGtkDelegate { +class LoginHandlerGtk : public LoginHandler { public: LoginHandlerGtk(net::AuthChallengeInfo* auth_info, net::URLRequest* request) : LoginHandler(auth_info, request), @@ -70,6 +69,8 @@ class LoginHandlerGtk : public LoginHandler, DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); root_.Own(gtk_vbox_new(FALSE, ui::kContentAreaBorder)); + g_signal_connect(root_.get(), "destroy", G_CALLBACK(OnDestroyThunk), this); + GtkWidget* label = gtk_label_new(UTF16ToUTF8(explanation).c_str()); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(root_.get()), label, FALSE, FALSE, 0); @@ -116,7 +117,9 @@ class LoginHandlerGtk : public LoginHandler, WebContents* requesting_contents = GetWebContentsForLogin(); DCHECK(requesting_contents); - dialog_ = CreateWebContentsModalDialogGtk(requesting_contents, this); + dialog_ = CreateWebContentsModalDialogGtk(requesting_contents, + root_.get(), + username_entry_); WebContentsModalDialogManager* web_contents_modal_dialog_manager = WebContentsModalDialogManager::FromWebContents(requesting_contents); @@ -131,25 +134,6 @@ class LoginHandlerGtk : public LoginHandler, gtk_widget_destroy(dialog_); } - // Overridden from ConstrainedWindowGtkDelegate: - virtual GtkWidget* GetWidgetRoot() OVERRIDE { - return root_.get(); - } - - virtual GtkWidget* GetFocusWidget() OVERRIDE { - return username_entry_; - } - - virtual void DeleteDelegate() OVERRIDE { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - - // The constrained window is going to delete itself; clear our pointer. - dialog_ = NULL; - SetModel(NULL); - - ReleaseSoon(); - } - protected: virtual ~LoginHandlerGtk() { root_.Destroy(); @@ -162,6 +146,7 @@ class LoginHandlerGtk : public LoginHandler, CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnCancelClicked); CHROMEGTK_CALLBACK_1(LoginHandlerGtk, void, OnPromptHierarchyChanged, GtkWidget*); + CHROMEGTK_CALLBACK_0(LoginHandlerGtk, void, OnDestroy); // The GtkWidgets that form our visual hierarchy: // The root container we pass to our parent. @@ -205,3 +190,13 @@ LoginHandler* LoginHandler::Create(net::AuthChallengeInfo* auth_info, net::URLRequest* request) { return new LoginHandlerGtk(auth_info, request); } + +void LoginHandlerGtk::OnDestroy(GtkWidget* widget) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + // The web contents modal dialog is going to delete itself; clear our pointer. + dialog_ = NULL; + SetModel(NULL); + + ReleaseSoon(); +} diff --git a/chrome/browser/ui/gtk/ssl_client_certificate_selector.cc b/chrome/browser/ui/gtk/ssl_client_certificate_selector.cc index 8c5e250..6fec1f2 100644 --- a/chrome/browser/ui/gtk/ssl_client_certificate_selector.cc +++ b/chrome/browser/ui/gtk/ssl_client_certificate_selector.cc @@ -43,8 +43,7 @@ enum { /////////////////////////////////////////////////////////////////////////////// // SSLClientCertificateSelector -class SSLClientCertificateSelector : public SSLClientAuthObserver, - public ConstrainedWindowGtkDelegate { +class SSLClientCertificateSelector : public SSLClientAuthObserver { public: explicit SSLClientCertificateSelector( WebContents* parent, @@ -58,11 +57,6 @@ class SSLClientCertificateSelector : public SSLClientAuthObserver, // SSLClientAuthObserver implementation: virtual void OnCertSelectedByNotification() OVERRIDE; - // ConstrainedWindowGtkDelegate implementation: - virtual GtkWidget* GetWidgetRoot() OVERRIDE { return root_widget_.get(); } - virtual GtkWidget* GetFocusWidget() OVERRIDE; - virtual void DeleteDelegate() OVERRIDE; - private: void PopulateCerts(); @@ -83,6 +77,7 @@ class SSLClientCertificateSelector : public SSLClientAuthObserver, CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnOkClicked); CHROMEGTK_CALLBACK_1(SSLClientCertificateSelector, void, OnPromptShown, GtkWidget*); + CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnDestroy); std::vector<std::string> details_strings_; @@ -108,6 +103,10 @@ SSLClientCertificateSelector::SSLClientCertificateSelector( web_contents_(web_contents), window_(NULL) { root_widget_.Own(gtk_vbox_new(FALSE, ui::kControlSpacing)); + g_signal_connect(root_widget_.get(), + "destroy", + G_CALLBACK(OnDestroyThunk), + this); GtkWidget* site_vbox = gtk_vbox_new(FALSE, ui::kControlSpacing); gtk_box_pack_start(GTK_BOX(root_widget_.get()), site_vbox, @@ -198,7 +197,9 @@ SSLClientCertificateSelector::~SSLClientCertificateSelector() { void SSLClientCertificateSelector::Show() { DCHECK(!window_); - window_ = CreateWebContentsModalDialogGtk(web_contents_, this); + window_ = CreateWebContentsModalDialogGtk(web_contents_, + root_widget_.get(), + select_button_); WebContentsModalDialogManager* web_contents_modal_dialog_manager = WebContentsModalDialogManager::FromWebContents(web_contents_); @@ -210,17 +211,6 @@ void SSLClientCertificateSelector::OnCertSelectedByNotification() { gtk_widget_destroy(window_); } -GtkWidget* SSLClientCertificateSelector::GetFocusWidget() { - return select_button_; -} - -void SSLClientCertificateSelector::DeleteDelegate() { - // The dialog was closed by escape key. - StopObserving(); - CertificateSelected(NULL); - delete this; -} - void SSLClientCertificateSelector::PopulateCerts() { std::vector<std::string> nicknames; x509_certificate_model::GetNicknameStringsFromCertList( @@ -385,6 +375,13 @@ void SSLClientCertificateSelector::OnPromptShown(GtkWidget* widget, gtk_widget_grab_default(select_button_); } +void SSLClientCertificateSelector::OnDestroy(GtkWidget* widget) { + // The dialog was closed by escape key. + StopObserving(); + CertificateSelected(NULL); + delete this; +} + } // namespace namespace chrome { diff --git a/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.cc b/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.cc index 28c74f2..4a8eac8 100644 --- a/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.cc +++ b/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.cc @@ -52,6 +52,7 @@ ChromeWebContentsViewDelegateGtk::ChromeWebContentsViewDelegateGtk( web_contents_(web_contents), expanded_container_(NULL), focus_store_(NULL) { + g_object_ref_sink(floating_.get()); gtk_widget_set_name(floating_.get(), "chrome-tab-contents-view"); g_signal_connect(floating_.get(), "set-floating-position", G_CALLBACK(OnSetFloatingPositionThunk), this); @@ -62,7 +63,6 @@ ChromeWebContentsViewDelegateGtk::ChromeWebContentsViewDelegateGtk( } ChromeWebContentsViewDelegateGtk::~ChromeWebContentsViewDelegateGtk() { - floating_.Destroy(); } void ChromeWebContentsViewDelegateGtk::AttachWebContentsModalDialog( diff --git a/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.h b/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.h index 95ce5b9..eac550f 100644 --- a/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.h +++ b/chrome/browser/ui/gtk/tab_contents/chrome_web_contents_view_delegate_gtk.h @@ -9,7 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "content/public/browser/web_contents_view_delegate.h" #include "ui/base/gtk/gtk_signal.h" -#include "ui/base/gtk/owned_widget_gtk.h" +#include "ui/base/gtk/scoped_gobject.h" class RenderViewContextMenuGtk; class WebDragBookmarkHandlerGtk; @@ -57,7 +57,7 @@ class ChromeWebContentsViewDelegateGtk GtkAllocation*); // Contains |expanded_| as its GtkBin member. - ui::OwnedWidgetGtk floating_; + ui::ScopedGObject<GtkWidget>::Type floating_; // The UI for the web contents modal dialog currently displayed. This is owned // by WebContents, not the view. diff --git a/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.cc b/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.cc index 6b214ae..55c70a7 100644 --- a/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.cc +++ b/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.cc @@ -71,7 +71,9 @@ TabModalConfirmDialogGtk::TabModalConfirmDialogGtk( g_signal_connect(ok_, "clicked", G_CALLBACK(OnAcceptThunk), this); gtk_box_pack_end(GTK_BOX(buttonBox), ok_, FALSE, TRUE, 0); - window_ = CreateWebContentsModalDialogGtk(web_contents, this); + g_signal_connect(dialog_, "destroy", G_CALLBACK(OnDestroyThunk), this); + + window_ = CreateWebContentsModalDialogGtk(web_contents, dialog_, cancel_); delegate_->set_close_delegate(this); WebContentsModalDialogManager* web_contents_modal_dialog_manager = @@ -79,18 +81,6 @@ TabModalConfirmDialogGtk::TabModalConfirmDialogGtk( web_contents_modal_dialog_manager->ShowDialog(window_); } -GtkWidget* TabModalConfirmDialogGtk::GetWidgetRoot() { - return dialog_; -} - -GtkWidget* TabModalConfirmDialogGtk::GetFocusWidget() { - return cancel_; -} - -void TabModalConfirmDialogGtk::DeleteDelegate() { - delete this; -} - TabModalConfirmDialogGtk::~TabModalConfirmDialogGtk() { gtk_widget_destroy(dialog_); } @@ -114,3 +104,7 @@ void TabModalConfirmDialogGtk::OnAccept(GtkWidget* widget) { void TabModalConfirmDialogGtk::OnCancel(GtkWidget* widget) { delegate_->Cancel(); } + +void TabModalConfirmDialogGtk::OnDestroy(GtkWidget* widget) { + delete this; +} diff --git a/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.h b/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.h index 7fb7893..543d148 100644 --- a/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.h +++ b/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.h @@ -24,17 +24,11 @@ class WebContents; // To display the dialog, allocate this object on the heap. It will open the // dialog from its constructor and then delete itself when the user dismisses // the dialog. -class TabModalConfirmDialogGtk : public TabModalConfirmDialog, - public ConstrainedWindowGtkDelegate { +class TabModalConfirmDialogGtk : public TabModalConfirmDialog { public: TabModalConfirmDialogGtk(TabModalConfirmDialogDelegate* delegate, content::WebContents* web_contents); - // ConstrainedWindowGtkDelegate: - virtual GtkWidget* GetWidgetRoot() OVERRIDE; - virtual GtkWidget* GetFocusWidget() OVERRIDE; - virtual void DeleteDelegate() OVERRIDE; - private: friend class TabModalConfirmDialogTest; @@ -50,6 +44,7 @@ class TabModalConfirmDialogGtk : public TabModalConfirmDialog, // Callbacks: CHROMEGTK_CALLBACK_0(TabModalConfirmDialogGtk, void, OnAccept); CHROMEGTK_CALLBACK_0(TabModalConfirmDialogGtk, void, OnCancel); + CHROMEGTK_CALLBACK_0(TabModalConfirmDialogGtk, void, OnDestroy); scoped_ptr<TabModalConfirmDialogDelegate> delegate_; |