diff options
author | wittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 22:37:00 +0000 |
---|---|---|
committer | wittman@chromium.org <wittman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 22:37:00 +0000 |
commit | fa6b2463d5c7e034e05dddd21dd7ca8678917f66 (patch) | |
tree | 2ca88956d5e5cf747be227656f7f7694e830ddbb | |
parent | 09222d11244b5daa0d92724b57b88914e964d494 (diff) | |
download | chromium_src-fa6b2463d5c7e034e05dddd21dd7ca8678917f66.zip chromium_src-fa6b2463d5c7e034e05dddd21dd7ca8678917f66.tar.gz chromium_src-fa6b2463d5c7e034e05dddd21dd7ca8678917f66.tar.bz2 |
Revert 212528 "Cleanup: remove redundant tab close observation f..."
First of two-part revert of r212329 due to print preview dialog
breakage. r212528 builds on top of r212329 and must be reverted first.
> Cleanup: remove redundant tab close observation from TabModalConfirmDialogDelegate
>
> The WebContentsModalDialogManager closes web contents modal dialogs
> when their corresponding WebContents is destroyed. This supersedes the
> TabModalConfirmDialogDelegate handling of the tab close event.
>
> BUG=157161
>
> Review URL: https://chromiumcodereview.appspot.com/18786005
TBR=wittman@chromium.org
Review URL: https://codereview.chromium.org/21113005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214449 0039d316-1c4b-4281-b951-d872f2087c98
13 files changed, 54 insertions, 28 deletions
diff --git a/chrome/browser/download/download_danger_prompt.cc b/chrome/browser/download/download_danger_prompt.cc index 09c1624..7368b0b 100644 --- a/chrome/browser/download/download_danger_prompt.cc +++ b/chrome/browser/download/download_danger_prompt.cc @@ -23,6 +23,7 @@ class DownloadDangerPromptImpl public TabModalConfirmDialogDelegate { public: DownloadDangerPromptImpl(content::DownloadItem* item, + content::WebContents* web_contents, bool show_context, const OnDone& done); virtual ~DownloadDangerPromptImpl(); @@ -52,9 +53,11 @@ class DownloadDangerPromptImpl DownloadDangerPromptImpl::DownloadDangerPromptImpl( content::DownloadItem* download, + content::WebContents* web_contents, bool show_context, const OnDone& done) - : download_(download), + : TabModalConfirmDialogDelegate(web_contents), + download_(download), show_context_(show_context), done_(done) { DCHECK(!done_.is_null()); @@ -162,7 +165,7 @@ DownloadDangerPrompt* DownloadDangerPrompt::Create( bool show_context, const OnDone& done) { DownloadDangerPromptImpl* prompt = new DownloadDangerPromptImpl( - item, show_context, done); + item, web_contents, show_context, done); // |prompt| will be deleted when the dialog is done. TabModalConfirmDialog::Create(prompt, web_contents); return prompt; diff --git a/chrome/browser/plugins/plugin_observer.cc b/chrome/browser/plugins/plugin_observer.cc index 7668168..19751e9 100644 --- a/chrome/browser/plugins/plugin_observer.cc +++ b/chrome/browser/plugins/plugin_observer.cc @@ -82,7 +82,8 @@ ConfirmInstallDialogDelegate::ConfirmInstallDialogDelegate( content::WebContents* web_contents, PluginInstaller* installer, scoped_ptr<PluginMetadata> plugin_metadata) - : WeakPluginInstallerObserver(installer), + : TabModalConfirmDialogDelegate(web_contents), + WeakPluginInstallerObserver(installer), web_contents_(web_contents), plugin_metadata_(plugin_metadata.Pass()) { } diff --git a/chrome/browser/repost_form_warning_controller.cc b/chrome/browser/repost_form_warning_controller.cc index 517036a7..e665b29 100644 --- a/chrome/browser/repost_form_warning_controller.cc +++ b/chrome/browser/repost_form_warning_controller.cc @@ -15,7 +15,8 @@ RepostFormWarningController::RepostFormWarningController( content::WebContents* web_contents) - : content::WebContentsObserver(web_contents) { + : TabModalConfirmDialogDelegate(web_contents), + content::WebContentsObserver(web_contents) { } RepostFormWarningController::~RepostFormWarningController() { diff --git a/chrome/browser/ui/browser_command_controller_browsertest.cc b/chrome/browser/ui/browser_command_controller_browsertest.cc index 9710148..1f71986 100644 --- a/chrome/browser/ui/browser_command_controller_browsertest.cc +++ b/chrome/browser/ui/browser_command_controller_browsertest.cc @@ -22,7 +22,7 @@ IN_PROC_BROWSER_TEST_F(BrowserCommandControllerBrowserTest, DisableFind) { content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); MockTabModalConfirmDialogDelegate* delegate = - new MockTabModalConfirmDialogDelegate(NULL); + new MockTabModalConfirmDialogDelegate(web_contents, NULL); TabModalConfirmDialog::Create(delegate, web_contents); EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FIND)); diff --git a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h index 6651e69..d6f0715 100644 --- a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h +++ b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h @@ -56,9 +56,6 @@ class ConstrainedWindowMac { // This is true if the constrained window has been shown. bool shown_; - - // This is true while the constrained window is closing. - bool closing_; }; #endif // CHROME_BROWSER_UI_COCOA_CONSTRAINED_WINDOW_CONSTRAINED_WINDOW_MAC_ diff --git a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm index a7cb5be..49d753f 100644 --- a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm +++ b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm @@ -25,8 +25,7 @@ ConstrainedWindowMac::ConstrainedWindowMac( : delegate_(delegate), web_contents_(web_contents), sheet_([sheet retain]), - shown_(false), - closing_(false) { + shown_(false) { DCHECK(web_contents); DCHECK(sheet_.get()); WebContentsModalDialogManager* web_contents_modal_dialog_manager = @@ -55,10 +54,6 @@ void ConstrainedWindowMac::ShowWebContentsModalDialog() { } void ConstrainedWindowMac::CloseWebContentsModalDialog() { - if (closing_) - return; - - closing_ = true; [[ConstrainedWindowSheetController controllerForSheet:sheet_] closeSheet:sheet_]; WebContentsModalDialogManager* web_contents_modal_dialog_manager = diff --git a/chrome/browser/ui/cocoa/tab_modal_confirm_dialog_mac.mm b/chrome/browser/ui/cocoa/tab_modal_confirm_dialog_mac.mm index 6966adc..a006fe9 100644 --- a/chrome/browser/ui/cocoa/tab_modal_confirm_dialog_mac.mm +++ b/chrome/browser/ui/cocoa/tab_modal_confirm_dialog_mac.mm @@ -112,8 +112,5 @@ void TabModalConfirmDialogMac::SetPreventCloseOnLoadStart(bool prevent) { void TabModalConfirmDialogMac::OnConstrainedWindowClosed( ConstrainedWindowMac* window) { - // Provide a disposition in case the dialog was closed without accepting or - // cancelling. - delegate_->Cancel(); delete this; } 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 7f419a3..625b7c8 100644 --- a/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.cc +++ b/chrome/browser/ui/gtk/tab_modal_confirm_dialog_gtk.cc @@ -109,10 +109,6 @@ TabModalConfirmDialogGtk::TabModalConfirmDialogGtk( } TabModalConfirmDialogGtk::~TabModalConfirmDialogGtk() { - // Provide a disposition in case the dialog was closed without accepting or - // cancelling. - delegate_->Cancel(); - gtk_widget_destroy(dialog_); } diff --git a/chrome/browser/ui/sync/one_click_signin_helper.cc b/chrome/browser/ui/sync/one_click_signin_helper.cc index 22f1299..5573022 100644 --- a/chrome/browser/ui/sync/one_click_signin_helper.cc +++ b/chrome/browser/ui/sync/one_click_signin_helper.cc @@ -423,7 +423,8 @@ ConfirmEmailDialogDelegate::ConfirmEmailDialogDelegate( const std::string& last_email, const std::string& email, Callback callback) - : last_email_(last_email), + : TabModalConfirmDialogDelegate(contents), + last_email_(last_email), email_(email), callback_(callback) { } diff --git a/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc b/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc index b4355ba..1ced79b 100644 --- a/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc +++ b/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc @@ -14,8 +14,10 @@ #include "testing/gtest/include/gtest/gtest.h" MockTabModalConfirmDialogDelegate::MockTabModalConfirmDialogDelegate( + content::WebContents* web_contents, Delegate* delegate) - : delegate_(delegate) { + : TabModalConfirmDialogDelegate(web_contents), + delegate_(delegate) { } MockTabModalConfirmDialogDelegate::~MockTabModalConfirmDialogDelegate() { @@ -47,7 +49,8 @@ TabModalConfirmDialogTest::TabModalConfirmDialogTest() } void TabModalConfirmDialogTest::SetUpOnMainThread() { - delegate_ = new MockTabModalConfirmDialogDelegate(this); + delegate_ = new MockTabModalConfirmDialogDelegate( + browser()->tab_strip_model()->GetActiveWebContents(), this); dialog_ = TabModalConfirmDialog::Create( delegate_, browser()->tab_strip_model()->GetActiveWebContents()); content::RunAllPendingInMessageLoop(); diff --git a/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.h b/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.h index 0c0fd15..0f22b37 100644 --- a/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.h +++ b/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.h @@ -21,7 +21,8 @@ class MockTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate { virtual ~Delegate() {} }; - MockTabModalConfirmDialogDelegate(Delegate* delegate); + MockTabModalConfirmDialogDelegate(content::WebContents* web_contents, + Delegate* delegate); virtual ~MockTabModalConfirmDialogDelegate(); virtual string16 GetTitle() OVERRIDE; diff --git a/chrome/browser/ui/tab_modal_confirm_dialog_delegate.cc b/chrome/browser/ui/tab_modal_confirm_dialog_delegate.cc index d2711dc..c8e1a58 100644 --- a/chrome/browser/ui/tab_modal_confirm_dialog_delegate.cc +++ b/chrome/browser/ui/tab_modal_confirm_dialog_delegate.cc @@ -4,14 +4,23 @@ #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h" +#include "chrome/browser/chrome_notification_types.h" +#include "content/public/browser/navigation_controller.h" +#include "content/public/browser/notification_source.h" +#include "content/public/browser/web_contents.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" +using content::NavigationController; using content::WebContents; -TabModalConfirmDialogDelegate::TabModalConfirmDialogDelegate() +TabModalConfirmDialogDelegate::TabModalConfirmDialogDelegate( + WebContents* web_contents) : operations_delegate_(NULL), closing_(false) { + NavigationController* controller = &web_contents->GetController(); + registrar_.Add(this, chrome::NOTIFICATION_TAB_CLOSING, + content::Source<NavigationController>(controller)); } TabModalConfirmDialogDelegate::~TabModalConfirmDialogDelegate() { @@ -52,6 +61,18 @@ void TabModalConfirmDialogDelegate::LinkClicked( CloseDialog(); } +void TabModalConfirmDialogDelegate::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + // Close the dialog if the tab is closed. + if (type == chrome::NOTIFICATION_TAB_CLOSING) { + Cancel(); + } else { + NOTREACHED(); + } +} + gfx::Image* TabModalConfirmDialogDelegate::GetIcon() { return NULL; } diff --git a/chrome/browser/ui/tab_modal_confirm_dialog_delegate.h b/chrome/browser/ui/tab_modal_confirm_dialog_delegate.h index 29413a1..4f20b07 100644 --- a/chrome/browser/ui/tab_modal_confirm_dialog_delegate.h +++ b/chrome/browser/ui/tab_modal_confirm_dialog_delegate.h @@ -8,6 +8,8 @@ #include "base/callback.h" #include "base/compiler_specific.h" #include "base/strings/string16.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" #include "ui/base/window_open_disposition.h" namespace content { @@ -34,9 +36,9 @@ class TabModalConfirmDialogOperationsDelegate { // This class acts as the delegate for a simple tab-modal dialog confirming // whether the user wants to execute a certain action. -class TabModalConfirmDialogDelegate { +class TabModalConfirmDialogDelegate : public content::NotificationObserver { public: - TabModalConfirmDialogDelegate(); + explicit TabModalConfirmDialogDelegate(content::WebContents* web_contents); virtual ~TabModalConfirmDialogDelegate(); void set_operations_delegate( @@ -87,6 +89,14 @@ class TabModalConfirmDialogDelegate { return operations_delegate_; } + // content::NotificationObserver implementation. + // Watch for a closed tab and dismiss the dialog if it occurs. + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE; + + content::NotificationRegistrar registrar_; + private: // It is guaranteed that exactly one of |OnAccepted|, |OnCanceled| or // |OnLinkClicked| is eventually called. These method are private to |