Chromium Code Reviews| Index: chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
| diff --git a/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc b/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
| index e8a01e2c702ba00aa8a543baa18238ff35e56cb9..42f2f450813c1d4ecae4a6e1b0e8190ff0f518d5 100644 |
| --- a/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
| +++ b/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
| @@ -7,6 +7,7 @@ |
| #include "chrome/browser/ui/views/frame/browser_view.h" |
| #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" |
| #include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
| +#include "chrome/browser/ui/views/toolbar/wrench_menu.h" |
| #include "ui/views/controls/menu/menu_item_view.h" |
| namespace { |
| @@ -18,15 +19,29 @@ const int kVerticalPadding = 8; |
| } // namespace |
| -ExtensionToolbarMenuView::ExtensionToolbarMenuView(Browser* browser) |
| - : browser_(browser) { |
| - BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); |
| +ExtensionToolbarMenuView::ExtensionToolbarMenuView(Browser* browser, |
| + WrenchMenu* wrench_menu) |
| + : browser_(browser), |
| + wrench_menu_(wrench_menu), |
| + container_(NULL), |
| + browser_actions_container_observer_(this), |
| + weak_factory_(this) { |
| + BrowserActionsContainer* main = |
| + BrowserView::GetBrowserViewForBrowser(browser) |
| + ->toolbar()->browser_actions(); |
| container_ = new BrowserActionsContainer( |
| browser_, |
| NULL, // No owner view, means no extra keybindings are registered. |
| - browser_view->GetToolbarView()->browser_actions()); |
| + main); |
| container_->Init(); |
| AddChildView(container_); |
| + |
| + // If we were opened for a drop command, we have to wait for the drop to |
| + // finish so we can close the wrench menu. |
| + if (wrench_menu_->for_drop()) { |
| + browser_actions_container_observer_.Add(container_); |
| + browser_actions_container_observer_.Add(main); |
| + } |
| } |
| ExtensionToolbarMenuView::~ExtensionToolbarMenuView() { |
| @@ -48,3 +63,18 @@ void ExtensionToolbarMenuView::Layout() { |
| SetBounds(views::MenuItemView::label_start(), 0, sz.width(), height); |
| container_->SetBounds(0, 0, sz.width(), height); |
| } |
| + |
| +void ExtensionToolbarMenuView::OnBrowserActionDragDone() { |
| + DCHECK(wrench_menu_->for_drop()); |
| + // We have to post this in a message loop because it results in the menu being |
| + // closed, which deletes this view. Since this is in an observer method, that |
| + // could break the BrowserActionsContainer's observer list if done here. |
|
sky
2014/07/18 19:36:53
observer list handles removal while notifying.
Devlin
2014/07/18 21:38:31
Oh, nifty. Coulda sworn it didn't... Done.
|
| + base::MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ExtensionToolbarMenuView::CloseWrenchMenu, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void ExtensionToolbarMenuView::CloseWrenchMenu() { |
| + wrench_menu_->CloseMenu(); |
| +} |