diff options
author | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-08 21:02:53 +0000 |
---|---|---|
committer | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-08 21:02:53 +0000 |
commit | 3a72b255db2dc857996b9b86f12a911c83e6f110 (patch) | |
tree | 78ad90c9935b8bbfc5d53f66a9640f8437cb95dc | |
parent | bf194880c92ebbeb57809e57cc3826528df1807e (diff) | |
download | chromium_src-3a72b255db2dc857996b9b86f12a911c83e6f110.zip chromium_src-3a72b255db2dc857996b9b86f12a911c83e6f110.tar.gz chromium_src-3a72b255db2dc857996b9b86f12a911c83e6f110.tar.bz2 |
Make ExtensionContextMenuModel hold on to a reference to itself
while waiting for the results from the uninstall dialog. Otherwise
uninstallation will be cancelled because the observer went away.
BUG=40066
TEST=None
Review URL: http://codereview.chromium.org/1593016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44001 0039d316-1c4b-4281-b951-d872f2087c98
13 files changed, 28 insertions, 20 deletions
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc index 0a0438f..0878de9 100644 --- a/chrome/browser/extensions/extension_context_menu_model.cc +++ b/chrome/browser/extensions/extension_context_menu_model.cc @@ -109,6 +109,7 @@ void ExtensionContextMenuModel::ExecuteCommand(int command_id) { break; } case UNINSTALL: { + AddRef(); // Balanced in InstallUIProceed and InstallUIAbort. install_ui_.reset(new ExtensionInstallUI(profile_)); install_ui_->ConfirmUninstall(this, extension_); break; @@ -133,4 +134,10 @@ void ExtensionContextMenuModel::InstallUIProceed(bool create_app) { std::string id = extension_->id(); profile_->GetExtensionsService()->UninstallExtension(id, false); + + Release(); +} + +void ExtensionContextMenuModel::InstallUIAbort() { + Release(); } diff --git a/chrome/browser/extensions/extension_context_menu_model.h b/chrome/browser/extensions/extension_context_menu_model.h index 14b3574..c7cb845 100644 --- a/chrome/browser/extensions/extension_context_menu_model.h +++ b/chrome/browser/extensions/extension_context_menu_model.h @@ -16,7 +16,8 @@ class Profile; // The menu model for the context menu for extension action icons (browser and // page actions). class ExtensionContextMenuModel - : public menus::SimpleMenuModel, + : public base::RefCounted<ExtensionContextMenuModel>, + public menus::SimpleMenuModel, public menus::SimpleMenuModel::Delegate, public ExtensionInstallUI::Delegate { public: @@ -46,7 +47,7 @@ class ExtensionContextMenuModel // ExtensionInstallUI::Delegate overrides. virtual void InstallUIProceed(bool create_app); - virtual void InstallUIAbort() {} + virtual void InstallUIAbort(); private: void InitCommonCommands(); diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc index be26bb6..f74a35a 100644 --- a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc @@ -182,8 +182,8 @@ class BrowserActionButton : public NotificationObserver, } MenuGtk* GetContextMenu() { - context_menu_model_.reset( - new ExtensionContextMenuModel(extension_, toolbar_->browser(), this)); + context_menu_model_ = + new ExtensionContextMenuModel(extension_, toolbar_->browser(), this); context_menu_.reset( new MenuGtk(this, context_menu_model_.get())); return context_menu_.get(); @@ -311,7 +311,7 @@ class BrowserActionButton : public NotificationObserver, // The context menu view and model for this extension action. scoped_ptr<MenuGtk> context_menu_; - scoped_ptr<ExtensionContextMenuModel> context_menu_model_; + scoped_refptr<ExtensionContextMenuModel> context_menu_model_; friend class BrowserActionsToolbarGtk; }; diff --git a/chrome/browser/gtk/location_bar_view_gtk.cc b/chrome/browser/gtk/location_bar_view_gtk.cc index ed089bc..c0093bb 100644 --- a/chrome/browser/gtk/location_bar_view_gtk.cc +++ b/chrome/browser/gtk/location_bar_view_gtk.cc @@ -1294,8 +1294,8 @@ gboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed( Extension* extension = profile_->GetExtensionsService()->GetExtensionById( page_action()->extension_id(), false); - context_menu_model_.reset( - new ExtensionContextMenuModel(extension, owner_->browser_, this)); + context_menu_model_ = + new ExtensionContextMenuModel(extension, owner_->browser_, this); context_menu_.reset( new MenuGtk(NULL, context_menu_model_.get())); context_menu_->Popup(sender, event); diff --git a/chrome/browser/gtk/location_bar_view_gtk.h b/chrome/browser/gtk/location_bar_view_gtk.h index 500619b..adb47b0 100644 --- a/chrome/browser/gtk/location_bar_view_gtk.h +++ b/chrome/browser/gtk/location_bar_view_gtk.h @@ -254,7 +254,7 @@ class LocationBarViewGtk : public AutocompleteEditController, // The context menu view and model for this extension action. scoped_ptr<MenuGtk> context_menu_; - scoped_ptr<ExtensionContextMenuModel> context_menu_model_; + scoped_refptr<ExtensionContextMenuModel> context_menu_model_; DISALLOW_COPY_AND_ASSIGN(PageActionViewGtk); }; diff --git a/chrome/browser/views/browser_actions_container.cc b/chrome/browser/views/browser_actions_container.cc index fe1bff3..c74e333 100644 --- a/chrome/browser/views/browser_actions_container.cc +++ b/chrome/browser/views/browser_actions_container.cc @@ -236,8 +236,8 @@ bool BrowserActionButton::OnMousePressed(const views::MouseEvent& e) { point.Offset(0, height()); // Reconstructs the menu every time because the menu's contents are dynamic. - context_menu_contents_.reset(new ExtensionContextMenuModel( - extension(), panel_->browser(), panel_)); + context_menu_contents_ = new ExtensionContextMenuModel( + extension(), panel_->browser(), panel_); context_menu_menu_.reset(new views::Menu2(context_menu_contents_.get())); context_menu_menu_->RunContextMenuAt(point); diff --git a/chrome/browser/views/browser_actions_container.h b/chrome/browser/views/browser_actions_container.h index 1432727..ac263ef 100644 --- a/chrome/browser/views/browser_actions_container.h +++ b/chrome/browser/views/browser_actions_container.h @@ -123,7 +123,7 @@ class BrowserActionButton : public views::MenuButton, // The browser action shelf. BrowserActionsContainer* panel_; - scoped_ptr<ExtensionContextMenuModel> context_menu_contents_; + scoped_refptr<ExtensionContextMenuModel> context_menu_contents_; scoped_ptr<views::Menu2> context_menu_menu_; NotificationRegistrar registrar_; diff --git a/chrome/browser/views/extensions/browser_action_overflow_menu_controller.cc b/chrome/browser/views/extensions/browser_action_overflow_menu_controller.cc index 2c379c1..2a07adb 100644 --- a/chrome/browser/views/extensions/browser_action_overflow_menu_controller.cc +++ b/chrome/browser/views/extensions/browser_action_overflow_menu_controller.cc @@ -94,10 +94,10 @@ bool BrowserActionOverflowMenuController::ShowContextMenu( int id, const gfx::Point& p, bool is_mouse_gesture) { - context_menu_contents_.reset(new ExtensionContextMenuModel( + context_menu_contents_ = new ExtensionContextMenuModel( (*views_)[start_index_ + id - 1]->button()->extension(), owner_->browser(), - owner_)); + owner_); context_menu_menu_.reset(new views::Menu2(context_menu_contents_.get())); // This blocks until the user choses something or dismisses the menu. context_menu_menu_->RunContextMenuAt(p); diff --git a/chrome/browser/views/extensions/browser_action_overflow_menu_controller.h b/chrome/browser/views/extensions/browser_action_overflow_menu_controller.h index 0efa964..2695bb3 100644 --- a/chrome/browser/views/extensions/browser_action_overflow_menu_controller.h +++ b/chrome/browser/views/extensions/browser_action_overflow_menu_controller.h @@ -105,7 +105,7 @@ class BrowserActionOverflowMenuController : public views::MenuDelegate { bool for_drop_; // The browser action context menu and model. - scoped_ptr<ExtensionContextMenuModel> context_menu_contents_; + scoped_refptr<ExtensionContextMenuModel> context_menu_contents_; scoped_ptr<views::Menu2> context_menu_menu_; friend class DeleteTask<BrowserActionOverflowMenuController>; diff --git a/chrome/browser/views/infobars/extension_infobar.cc b/chrome/browser/views/infobars/extension_infobar.cc index 379c47a..bbfc4ac 100644 --- a/chrome/browser/views/infobars/extension_infobar.cc +++ b/chrome/browser/views/infobars/extension_infobar.cc @@ -140,8 +140,8 @@ void ExtensionInfoBar::RunMenu(View* source, const gfx::Point& pt) { Browser* browser = BrowserView::GetBrowserViewForNativeWindow( platform_util::GetTopLevel(source->GetWidget()->GetNativeView()))-> browser(); - options_menu_contents_.reset(new ExtensionContextMenuModel( - delegate_->extension_host()->extension(), browser, NULL)); + options_menu_contents_ = new ExtensionContextMenuModel( + delegate_->extension_host()->extension(), browser, NULL); } options_menu_menu_.reset(new views::Menu2(options_menu_contents_.get())); diff --git a/chrome/browser/views/infobars/extension_infobar.h b/chrome/browser/views/infobars/extension_infobar.h index 236f3af..9b9b987 100644 --- a/chrome/browser/views/infobars/extension_infobar.h +++ b/chrome/browser/views/infobars/extension_infobar.h @@ -58,7 +58,7 @@ class ExtensionInfoBar : public InfoBar, ExtensionInfoBarDelegate* delegate_; // The dropdown menu for accessing the contextual extension actions. - scoped_ptr<ExtensionContextMenuModel> options_menu_contents_; + scoped_refptr<ExtensionContextMenuModel> options_menu_contents_; scoped_ptr<views::Menu2> options_menu_menu_; views::MenuButton* menu_; diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc index 8b36a7d..35b8f8e 100644 --- a/chrome/browser/views/location_bar_view.cc +++ b/chrome/browser/views/location_bar_view.cc @@ -1381,8 +1381,8 @@ void LocationBarView::PageActionImageView::OnMouseReleased( page_action()->extension_id(), false); Browser* browser = BrowserView::GetBrowserViewForNativeWindow( platform_util::GetTopLevel(GetWidget()->GetNativeView()))->browser(); - context_menu_contents_.reset(new ExtensionContextMenuModel( - extension, browser, this)); + context_menu_contents_ = new ExtensionContextMenuModel( + extension, browser, this); context_menu_menu_.reset(new views::Menu2(context_menu_contents_.get())); context_menu_menu_->RunContextMenuAt(point); return; diff --git a/chrome/browser/views/location_bar_view.h b/chrome/browser/views/location_bar_view.h index 39b6fba..306a490 100644 --- a/chrome/browser/views/location_bar_view.h +++ b/chrome/browser/views/location_bar_view.h @@ -413,7 +413,7 @@ class LocationBarView : public LocationBar, PageActionMap page_action_icons_; // The context menu for this page action. - scoped_ptr<ExtensionContextMenuModel> context_menu_contents_; + scoped_refptr<ExtensionContextMenuModel> context_menu_contents_; scoped_ptr<views::Menu2> context_menu_menu_; // The object that is waiting for the image loading to complete |