Index: chrome/browser/views/browser_actions_container.cc |
diff --git a/chrome/browser/views/browser_actions_container.cc b/chrome/browser/views/browser_actions_container.cc |
index a8fa36212fcaf3338a46bbe75e121087c9bc6204..32f0f028bbdd98f02c6b751d3a52acd719853973 100644 |
--- a/chrome/browser/views/browser_actions_container.cc |
+++ b/chrome/browser/views/browser_actions_container.cc |
@@ -13,6 +13,7 @@ |
#include "chrome/browser/browser_theme_provider.h" |
#include "chrome/browser/browser_window.h" |
#include "chrome/browser/extensions/extension_browser_event_router.h" |
+#include "chrome/browser/extensions/extension_host.h" |
#include "chrome/browser/extensions/extensions_service.h" |
#include "chrome/browser/extensions/extension_tabs_module.h" |
#include "chrome/browser/renderer_host/render_widget_host_view.h" |
@@ -133,9 +134,9 @@ gfx::Insets BrowserActionButton::GetInsets() const { |
return zero_inset; |
} |
-void BrowserActionButton::ButtonPressed( |
- views::Button* sender, const views::Event& event) { |
- panel_->OnBrowserActionExecuted(this); |
+void BrowserActionButton::ButtonPressed(views::Button* sender, |
+ const views::Event& event) { |
+ panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools |
} |
void BrowserActionButton::OnImageLoaded(SkBitmap* image, size_t index) { |
@@ -198,7 +199,7 @@ GURL BrowserActionButton::GetPopupUrl() { |
bool BrowserActionButton::Activate() { |
if (IsPopup()) { |
- panel_->OnBrowserActionExecuted(this); |
+ panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools |
// TODO(erikkay): Run a nested modal loop while the mouse is down to |
// enable menu-like drag-select behavior. |
@@ -224,7 +225,8 @@ bool BrowserActionButton::OnMousePressed(const views::MouseEvent& e) { |
// Make the menu appear below the button. |
point.Offset(0, height()); |
- panel_->GetContextMenu()->Run(extension(), point); |
+ panel_->GetContextMenu()->Run(extension(), extension()->browser_action(), |
+ panel_, panel_->profile()->GetPrefs(), point); |
SetButtonNotPushed(); |
return false; |
@@ -340,9 +342,6 @@ BrowserActionsContainer::BrowserActionsContainer( |
if (!extension_service) // The |extension_service| can be NULL in Incognito. |
return; |
- registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
- Source<Profile>(profile_)); |
- |
model_ = extension_service->toolbar_model(); |
model_->AddObserver(this); |
@@ -484,29 +483,13 @@ void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { |
} |
void BrowserActionsContainer::HidePopup() { |
- if (popup_) { |
- // This sometimes gets called via a timer (See BubbleLostFocus), so clear |
- // the task factory in case one is pending. |
- task_factory_.RevokeAll(); |
- |
- // Save these variables in local temporaries since destroying the popup |
- // calls BubbleLostFocus to be called, which will try to call HidePopup() |
- // again if popup_ is non-null. |
- ExtensionPopup* closing_popup = popup_; |
- BrowserActionButton* closing_button = popup_button_; |
- popup_ = NULL; |
- popup_button_ = NULL; |
- |
- closing_popup->DetachFromBrowser(); |
- delete closing_popup; |
- closing_button->SetButtonNotPushed(); |
- return; |
- } |
+ if (popup_) |
+ popup_->Close(); |
} |
void BrowserActionsContainer::TestExecuteBrowserAction(int index) { |
BrowserActionButton* button = browser_action_views_[index]->button(); |
- OnBrowserActionExecuted(button); |
+ OnBrowserActionExecuted(button, false); // inspect_with_devtools |
} |
void BrowserActionsContainer::TestSetIconVisibilityCount(size_t icons) { |
@@ -517,7 +500,7 @@ void BrowserActionsContainer::TestSetIconVisibilityCount(size_t icons) { |
} |
void BrowserActionsContainer::OnBrowserActionExecuted( |
- BrowserActionButton* button) { |
+ BrowserActionButton* button, bool inspect_with_devtools) { |
ExtensionAction* browser_action = button->browser_action(); |
// Popups just display. No notification to the extension. |
@@ -548,18 +531,15 @@ void BrowserActionsContainer::OnBrowserActionExecuted( |
BubbleBorder::ArrowLocation arrow_location = UILayoutIsRightToLeft() ? |
BubbleBorder::TOP_LEFT : BubbleBorder::TOP_RIGHT; |
- popup_ = ExtensionPopup::Show( |
- button->GetPopupUrl(), |
- browser_, |
- browser_->profile(), |
- frame_window, |
- rect, |
- arrow_location, |
+ popup_ = ExtensionPopup::Show(button->GetPopupUrl(), browser_, |
+ browser_->profile(), frame_window, rect, arrow_location, |
true, // Activate the popup window. |
- ExtensionPopup::BUBBLE_CHROME); |
- popup_->set_delegate(this); |
+ inspect_with_devtools, |
+ ExtensionPopup::BUBBLE_CHROME, |
+ this); // ExtensionPopupDelegate |
popup_button_ = button; |
popup_button_->SetButtonPushed(); |
+ |
return; |
} |
@@ -809,54 +789,6 @@ void BrowserActionsContainer::MoveBrowserAction( |
SchedulePaint(); |
} |
-void BrowserActionsContainer::Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- switch (type.value) { |
- case NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE: |
- // If we aren't the host of the popup, then disregard the notification. |
- if (!popup_ || Details<ExtensionHost>(popup_->host()) != details) |
- return; |
- |
- HidePopup(); |
- break; |
- |
- default: |
- NOTREACHED() << "Unexpected notification"; |
- } |
-} |
- |
-void BrowserActionsContainer::BubbleBrowserWindowMoved(BrowserBubble* bubble) { |
-} |
- |
-void BrowserActionsContainer::BubbleBrowserWindowClosing( |
- BrowserBubble* bubble) { |
- HidePopup(); |
-} |
- |
-void BrowserActionsContainer::BubbleGotFocus(BrowserBubble* bubble) { |
- if (!popup_) |
- return; |
- |
- // Forward the focus to the renderer. |
- popup_->host()->render_view_host()->view()->Focus(); |
-} |
- |
-void BrowserActionsContainer::BubbleLostFocus(BrowserBubble* bubble, |
- bool lost_focus_to_child) { |
- // Don't close when we are losing focus to a child window, this is the case |
- // for select popups and alert for example. |
- if (!popup_ || lost_focus_to_child) |
- return; |
- |
- // This is a bit annoying. If you click on the button that generated the |
- // current popup, then we first get this lost focus message, and then |
- // we get the click action. This results in the popup being immediately |
- // shown again. To workaround this, we put in a delay. |
- MessageLoop::current()->PostTask(FROM_HERE, |
- task_factory_.NewRunnableMethod(&BrowserActionsContainer::HidePopup)); |
-} |
- |
void BrowserActionsContainer::RunMenu(View* source, const gfx::Point& pt) { |
if (source == chevron_) { |
overflow_menu_ = new BrowserActionOverflowMenuController( |
@@ -1142,6 +1074,20 @@ void BrowserActionsContainer::NotifyMenuDeleted( |
overflow_menu_ = NULL; |
} |
+void BrowserActionsContainer::ShowPopupForDevToolsWindow(Extension* extension, |
+ ExtensionAction* extension_action) { |
+ OnBrowserActionExecuted(GetBrowserActionView(extension)->button(), |
+ true); // inspect_with_devtools |
+} |
+ |
+void BrowserActionsContainer::ExtensionPopupClosed(ExtensionPopup* popup) { |
+ // ExtensionPopup is ref-counted, so we don't need to delete it. |
+ DCHECK_EQ(popup_, popup); |
+ popup_ = NULL; |
+ popup_button_->SetButtonNotPushed(); |
+ popup_button_ = NULL; |
+} |
+ |
bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) { |
// Only display incognito-enabled extensions while in incognito mode. |
return (!profile_->IsOffTheRecord() || |