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 ec259a9c6fbe9a67cd2dcc126fa27a1809fd4260..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() { |
@@ -44,8 +59,22 @@ gfx::Size ExtensionToolbarMenuView::GetPreferredSize() const { |
void ExtensionToolbarMenuView::Layout() { |
// All buttons are given the same width. |
gfx::Size sz = container_->GetPreferredSize(); |
- container_->SetBounds(views::MenuItemView::label_start(), |
- 0, |
- sz.width(), |
- sz.height() + (kVerticalPadding / 2)); |
+ int height = sz.height() + kVerticalPadding / 2; |
+ 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. |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ExtensionToolbarMenuView::CloseWrenchMenu, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
+void ExtensionToolbarMenuView::CloseWrenchMenu() { |
+ wrench_menu_->CloseMenu(); |
} |