Index: chrome/browser/ui/extensions/extension_action_view_controller.cc |
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc |
index 77fe17118465f93a23daa36a3052f7a2b2e7cc87..984ed1eccf0e0895e05aea5865be079c24fefbd0 100644 |
--- a/chrome/browser/ui/extensions/extension_action_view_controller.cc |
+++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc |
@@ -17,11 +17,12 @@ |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/extensions/accelerator_priority.h" |
#include "chrome/browser/ui/extensions/extension_action_platform_delegate.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h" |
#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" |
-#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" |
#include "chrome/common/extensions/api/extension_action/action_info.h" |
#include "chrome/common/icon_with_badge_image_source.h" |
+#include "chrome/common/pref_names.h" |
#include "extensions/browser/extension_host.h" |
#include "extensions/browser/extension_registry.h" |
#include "extensions/common/extension.h" |
@@ -72,7 +73,7 @@ void ExtensionActionViewController::SetDelegate( |
view_delegate_ = delegate; |
platform_delegate_->OnDelegateSet(); |
} else { |
- if (is_showing_popup()) |
+ if (popup_host_) |
HidePopup(); |
platform_delegate_.reset(); |
view_delegate_ = nullptr; |
@@ -138,15 +139,16 @@ bool ExtensionActionViewController::HasPopup( |
} |
void ExtensionActionViewController::HidePopup() { |
- if (is_showing_popup()) { |
- popup_host_->Close(); |
- // We need to do these actions synchronously (instead of closing and then |
- // performing the rest of the cleanup in OnExtensionHostDestroyed()) because |
- // the extension host may close asynchronously, and we need to keep the view |
- // delegate up-to-date. |
- if (popup_host_) |
- OnPopupClosed(); |
- } |
+ if (!is_showing_popup()) |
+ return; |
+ |
+ popup_host_->Close(); |
+ // We need to do these actions synchronously (instead of closing and then |
+ // performing the rest of the cleanup in OnExtensionHostDestroyed()) because |
+ // the extension host may close asynchronously, and we need to keep the view |
+ // delegate up-to-date. |
+ if (popup_host_) |
+ OnPopupClosed(); |
} |
gfx::NativeView ExtensionActionViewController::GetPopupNativeView() { |
@@ -202,8 +204,13 @@ bool ExtensionActionViewController::ExecuteAction(PopupShowAction show_action, |
ExtensionAction::ACTION_SHOW_POPUP) { |
GURL popup_url = extension_action_->GetPopupUrl( |
SessionTabHelper::IdForTab(view_delegate_->GetCurrentWebContents())); |
- return GetPreferredPopupViewController() |
- ->TriggerPopupWithUrl(show_action, popup_url, grant_tab_permissions); |
+ |
+ if (extension_action_->open_in_sidebar()) |
+ return GetPreferredPopupViewController()->TriggerSidebarWithUrl( |
+ popup_url); |
+ else |
+ return GetPreferredPopupViewController()->TriggerPopupWithUrl( |
+ show_action, popup_url, grant_tab_permissions); |
} |
return false; |
} |
@@ -288,20 +295,18 @@ bool ExtensionActionViewController::TriggerPopupWithUrl( |
PopupShowAction show_action, |
const GURL& popup_url, |
bool grant_tab_permissions) { |
- if (!ExtensionIsValid()) |
- return false; |
- |
- bool already_showing = is_showing_popup(); |
- |
- // Always hide the current popup, even if it's not owned by this extension. |
- // Only one popup should be visible at a time. |
- HideActivePopup(); |
// If we were showing a popup already, then we treat the action to open the |
// same one as a desire to close it (like clicking a menu button that was |
// already open). |
- if (already_showing) |
+ if (is_showing_popup()) { |
+ HideActivePopup(); |
return false; |
+ } |
+ |
+ // Always hide the current popup, even if it's not owned by this extension. |
+ // Only one popup should be visible at a time. |
+ HideActivePopup(); |
scoped_ptr<extensions::ExtensionViewHost> host( |
extensions::ExtensionViewHostFactory::CreatePopupHost(popup_url, |
@@ -314,21 +319,40 @@ bool ExtensionActionViewController::TriggerPopupWithUrl( |
if (toolbar_actions_bar_) |
toolbar_actions_bar_->SetPopupOwner(this); |
- if (toolbar_actions_bar_ && |
- !toolbar_actions_bar_->IsActionVisibleOnMainBar(this) && |
- extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) { |
- platform_delegate_->CloseOverflowMenu(); |
- toolbar_actions_bar_->PopOutAction( |
- this, |
- base::Bind(&ExtensionActionViewController::ShowPopup, |
- weak_factory_.GetWeakPtr(), |
- base::Passed(host.Pass()), |
- grant_tab_permissions, |
- show_action)); |
- } else { |
- ShowPopup(host.Pass(), grant_tab_permissions, show_action); |
+ PressButtonWithSlideOutIfEnabled(base::Bind( |
+ &ExtensionActionViewController::ShowPopup, weak_factory_.GetWeakPtr(), |
+ base::Passed(host.Pass()), grant_tab_permissions, show_action)); |
+ |
+ return true; |
+} |
+ |
+bool ExtensionActionViewController::TriggerSidebarWithUrl( |
+ const GURL& sidebar_url) { |
+ // Sidebar is only allowed via browser action |
+ if (ActionInfo::TYPE_BROWSER != extension_action_->action_type()) |
+ return false; |
+ |
+ DCHECK(toolbar_actions_bar_); |
+ |
+ if (sidebar_host_) { |
+ HideActiveSidebar(); |
+ return false; |
} |
+ HideActiveSidebar(); |
+ |
+ sidebar_host_.reset(extensions::ExtensionViewHostFactory::CreateSidebarHost( |
+ sidebar_url, browser_)); |
+ |
+ sidebar_host_->CreateRenderViewSoon(); |
+ sidebar_host_->host_contents()->SetInitialFocus(); |
+ |
+ DCHECK(toolbar_actions_bar_); |
+ toolbar_actions_bar_->SetSidebarOwner(this); |
+ |
+ PressButtonWithSlideOutIfEnabled( |
+ base::Bind(&ExtensionActionViewController::PressButton, |
+ weak_factory_.GetWeakPtr(), true)); |
return true; |
} |
@@ -342,21 +366,71 @@ void ExtensionActionViewController::ShowPopup( |
return; |
platform_delegate_->ShowPopup( |
popup_host.Pass(), grant_tab_permissions, show_action); |
- view_delegate_->OnPopupShown(grant_tab_permissions); |
+ PressButton(grant_tab_permissions); |
} |
void ExtensionActionViewController::OnPopupClosed() { |
- popup_host_observer_.Remove(popup_host_); |
- popup_host_ = nullptr; |
- if (toolbar_actions_bar_) { |
+ if (popup_host_) { |
+ popup_host_observer_.Remove(popup_host_); |
+ popup_host_ = nullptr; |
+ } |
+ if (toolbar_actions_bar_) |
toolbar_actions_bar_->SetPopupOwner(nullptr); |
+ |
+ RaiseButton(); |
+} |
+ |
+void ExtensionActionViewController::HideActiveSidebar() { |
+ DCHECK(toolbar_actions_bar_); |
+ DCHECK_EQ(ActionInfo::TYPE_BROWSER, extension_action_->action_type()); |
+ toolbar_actions_bar_->HideActiveSidebar(); |
+} |
+ |
+void ExtensionActionViewController::HideSidebar() { |
+ if (!sidebar_host_) |
+ return; |
+ |
+ sidebar_host_.reset(); |
+ if (toolbar_actions_bar_) |
+ toolbar_actions_bar_->SetSidebarOwner(nullptr); |
+ |
+ RaiseButton(); |
+} |
+ |
+void ExtensionActionViewController::RaiseButton() { |
+ // Reset button state |
+ if (toolbar_actions_bar_) { |
if (toolbar_actions_bar_->popped_out_action() == this && |
- !view_delegate_->IsMenuRunning()) |
+ !view_delegate_->IsMenuRunning()) { |
toolbar_actions_bar_->UndoPopOut(); |
+ } |
} |
view_delegate_->OnPopupClosed(); |
} |
+void ExtensionActionViewController::PressButtonWithSlideOutIfEnabled( |
+ const base::Closure& closure) { |
+ if (!toolbar_actions_bar_ || |
+ toolbar_actions_bar_->IsActionVisibleOnMainBar(this) || |
+ !extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) { |
+ closure.Run(); |
+ return; |
+ } |
+ |
+ // We disabled PopOutAction for sidebar |
+ if (extension_action_->open_in_sidebar()) { |
+ closure.Run(); |
+ return; |
+ } |
+ |
+ platform_delegate_->CloseOverflowMenu(); |
+ toolbar_actions_bar_->PopOutAction(this, closure); |
+} |
+ |
+void ExtensionActionViewController::PressButton(bool grant_tab_permissions) { |
+ view_delegate_->OnPopupShown(grant_tab_permissions); |
+} |
+ |
scoped_ptr<IconWithBadgeImageSource> |
ExtensionActionViewController::GetIconImageSource( |
content::WebContents* web_contents, |