summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfinnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-08 21:02:53 +0000
committerfinnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-08 21:02:53 +0000
commit3a72b255db2dc857996b9b86f12a911c83e6f110 (patch)
tree78ad90c9935b8bbfc5d53f66a9640f8437cb95dc
parentbf194880c92ebbeb57809e57cc3826528df1807e (diff)
downloadchromium_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
-rw-r--r--chrome/browser/extensions/extension_context_menu_model.cc7
-rw-r--r--chrome/browser/extensions/extension_context_menu_model.h5
-rw-r--r--chrome/browser/gtk/browser_actions_toolbar_gtk.cc6
-rw-r--r--chrome/browser/gtk/location_bar_view_gtk.cc4
-rw-r--r--chrome/browser/gtk/location_bar_view_gtk.h2
-rw-r--r--chrome/browser/views/browser_actions_container.cc4
-rw-r--r--chrome/browser/views/browser_actions_container.h2
-rw-r--r--chrome/browser/views/extensions/browser_action_overflow_menu_controller.cc4
-rw-r--r--chrome/browser/views/extensions/browser_action_overflow_menu_controller.h2
-rw-r--r--chrome/browser/views/infobars/extension_infobar.cc4
-rw-r--r--chrome/browser/views/infobars/extension_infobar.h2
-rw-r--r--chrome/browser/views/location_bar_view.cc4
-rw-r--r--chrome/browser/views/location_bar_view.h2
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