Chromium Code Reviews| 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 182a90eeab6ae47308477d7300ccf35e6b55d19c..298370f5d7318dcdb7fef12fcc2ec605f324acf7 100644 |
| --- a/chrome/browser/ui/extensions/extension_action_view_controller.cc |
| +++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc |
| @@ -17,10 +17,11 @@ |
| #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/pref_names.h" |
| #include "extensions/browser/extension_host.h" |
| #include "extensions/browser/extension_registry.h" |
| #include "extensions/common/extension.h" |
| @@ -148,14 +149,15 @@ 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 can close asynchronously, and we need to keep the view |
| - // delegate up-to-date. |
| - 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 can close asynchronously, and we need to keep the view |
| + // delegate up-to-date. |
| + OnPopupClosed(); |
| } |
| gfx::NativeView ExtensionActionViewController::GetPopupNativeView() { |
| @@ -215,8 +217,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( |
|
Devlin
2015/07/30 17:56:46
The fact that so much of this code seems to be cop
ltilve
2015/08/07 16:15:02
We need to handle a case which opens a popup when
|
| + popup_url); |
| + else |
| + return GetPreferredPopupViewController()->TriggerPopupWithUrl( |
| + show_action, popup_url, grant_tab_permissions); |
| } |
| return false; |
| } |
| @@ -300,20 +307,16 @@ 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; |
| + } |
| scoped_ptr<extensions::ExtensionViewHost> host( |
| extensions::ExtensionViewHostFactory::CreatePopupHost(popup_url, |
| @@ -326,21 +329,32 @@ bool ExtensionActionViewController::TriggerPopupWithUrl( |
| if (toolbar_actions_bar_) |
| toolbar_actions_bar_->SetPopupOwner(this); |
| - if (toolbar_actions_bar_ && |
| - !toolbar_actions_bar_->IsActionVisible(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& popup_url) { |
| + if (sidebar_container_) { |
| + HideActiveSidebar(); |
| + return false; |
| } |
| + HideActiveSidebar(); |
| + |
| + content::WebContents* web_contents = view_delegate_->GetCurrentWebContents(); |
| + sidebar_container_.reset( |
| + new extensions::SidebarContainer(browser_, web_contents, popup_url)); |
| + |
| + if (toolbar_actions_bar_) |
| + toolbar_actions_bar_->SetSidebarOwner(this); |
| + |
| + PressButtonWithSlideOutIfEnabled( |
|
Devlin
2015/07/30 17:56:46
Wait, what? This calls into PressButtonWithSlideO
ltilve
2015/08/07 16:15:02
Fixed. You were totally right, good catch.
|
| + base::Bind(&ExtensionActionViewController::PressButton, |
| + weak_factory_.GetWeakPtr(), true)); |
| return true; |
| } |
| @@ -354,17 +368,67 @@ 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 (popup_host_) { |
| + popup_host_observer_.Remove(popup_host_); |
| + popup_host_ = nullptr; |
| + } |
| + toolbar_actions_bar_->SetPopupOwner(nullptr); |
| + RaiseButton(); |
| +} |
| + |
| +void ExtensionActionViewController::HideActiveSidebar() { |
| + if (toolbar_actions_bar_) { |
| + toolbar_actions_bar_->HideActiveSidebar(); |
| + } else { |
| + DCHECK_EQ(ActionInfo::TYPE_PAGE, extension_action_->action_type()); |
| + // In the traditional toolbar, page actions only know how to close their own |
|
Devlin
2015/07/30 17:56:46
Obviously from copy paste (another reason not to d
ltilve
2015/08/07 16:15:02
Done. Because the sidebar extension is only instan
|
| + // sidebar. |
| + HideSidebar(); |
| + } |
| +} |
| + |
| +void ExtensionActionViewController::HideSidebar() { |
| + if (!sidebar_container_) |
| + return; |
| + |
| + sidebar_container_.reset(); |
| + if (toolbar_actions_bar_) |
| + toolbar_actions_bar_->SetSidebarOwner(nullptr); |
| + |
| + RaiseButton(); |
| +} |
| + |
| +void ExtensionActionViewController::RaiseButton() { |
| + // Reset button state |
| if (toolbar_actions_bar_) { |
| - toolbar_actions_bar_->SetPopupOwner(nullptr); |
| 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_->IsActionVisible(this) || |
| + !extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) { |
| + closure.Run(); |
| + return; |
| + } |
| + |
| + // We disabled PopOutAction for sidebar |
| + if (extension_action_->open_in_sidebar()) |
| + return; |
| + |
| + platform_delegate_->CloseOverflowMenu(); |
| + toolbar_actions_bar_->PopOutAction(this, closure); |
| +} |
| + |
| +void ExtensionActionViewController::PressButton(bool grant_tab_permissions) { |
| + view_delegate_->OnPopupShown(grant_tab_permissions); |
| +} |