Index: chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm |
diff --git a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm |
index 6d587d001fee6f8f91534870114350d5fd7d189e..c596cb3fbcef985f95aa140a42d427898c1689eb 100644 |
--- a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm |
+++ b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm |
@@ -2,31 +2,22 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include <cmath> |
- |
#import "chrome/browser/ui/cocoa/location_bar/page_action_decoration.h" |
#include "base/strings/sys_string_conversions.h" |
#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
#include "chrome/browser/extensions/extension_action.h" |
-#include "chrome/browser/extensions/extension_tab_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_window.h" |
#import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu_controller.h" |
#import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h" |
-#include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
-#include "chrome/browser/ui/webui/extensions/extension_info_ui.h" |
-#include "components/sessions/session_id.h" |
+#include "chrome/browser/ui/extensions/extension_action_view_controller.h" |
#include "content/public/browser/notification_details.h" |
#include "content/public/browser/notification_source.h" |
#include "content/public/browser/web_contents.h" |
#include "extensions/browser/extension_registry.h" |
-#include "extensions/common/manifest_handlers/icons_handler.h" |
-#include "skia/ext/skia_utils_mac.h" |
-#include "ui/gfx/canvas_skia_paint.h" |
#include "ui/gfx/image/image.h" |
using content::WebContents; |
@@ -47,24 +38,23 @@ PageActionDecoration::PageActionDecoration( |
Browser* browser, |
ExtensionAction* page_action) |
: owner_(NULL), |
- browser_(browser), |
- page_action_(page_action), |
- current_tab_id_(-1), |
preview_enabled_(false) { |
const Extension* extension = extensions::ExtensionRegistry::Get( |
browser->profile())->enabled_extensions().GetByID( |
page_action->extension_id()); |
DCHECK(extension); |
- icon_factory_.reset(new ExtensionActionIconFactory( |
- browser_->profile(), extension, page_action, this)); |
+ viewController_.reset( |
+ new ExtensionActionViewController(extension, browser, page_action)); |
+ // TODO(devlin): Move these notifications to |
+ // ExtensionActionPlatformDelegateCocoa. |
registrar_.Add(this, |
extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
- content::Source<Profile>(browser_->profile())); |
+ content::Source<Profile>(browser->profile())); |
registrar_.Add(this, |
extensions::NOTIFICATION_EXTENSION_COMMAND_PAGE_ACTION_MAC, |
- content::Source<Profile>(browser_->profile())); |
+ content::Source<Profile>(browser->profile())); |
// We set the owner last of all so that we can determine whether we are in |
// the process of initializing this class or not. |
@@ -86,61 +76,37 @@ bool PageActionDecoration::AcceptsMousePress() { |
// Either notify listeners or show a popup depending on the Page |
// Action. |
bool PageActionDecoration::OnMousePressed(NSRect frame, NSPoint location) { |
- ActivatePageAction(frame, true); |
+ ActivatePageAction(true); |
// We don't want other code to try and handle this click. Returning true |
// prevents this by indicating that we handled it. |
return true; |
} |
bool PageActionDecoration::ActivatePageAction(bool grant_active_tab) { |
- return ActivatePageAction( |
- owner_->GetPageActionFrame(page_action_), grant_active_tab); |
-} |
- |
-bool PageActionDecoration::ActivatePageAction( |
- NSRect frame, bool grant_active_tab) { |
WebContents* web_contents = owner_->GetWebContents(); |
if (!web_contents) |
return false; |
- switch (extensions::ExtensionActionAPI::Get(browser_->profile())-> |
- ExecuteExtensionAction( |
- GetExtension(), browser_, grant_active_tab)) { |
- case ExtensionAction::ACTION_NONE: |
- break; |
- |
- case ExtensionAction::ACTION_SHOW_POPUP: |
- ShowPopup(frame, page_action_->GetPopupUrl(current_tab_id_)); |
- break; |
- } |
- |
+ viewController_->ExecuteAction(grant_active_tab); |
return true; |
} |
-void PageActionDecoration::OnIconUpdated() { |
- // If we have no owner, that means this class is still being constructed. |
- WebContents* web_contents = owner_ ? owner_->GetWebContents() : NULL; |
- if (web_contents) { |
- UpdateVisibility(web_contents, current_url_); |
- owner_->RedrawDecoration(this); |
- } |
+const extensions::Extension* PageActionDecoration::GetExtension() { |
+ return viewController_->extension(); |
} |
-void PageActionDecoration::UpdateVisibility(WebContents* contents, |
- const GURL& url) { |
- // Save this off so we can pass it back to the extension when the action gets |
- // executed. See PageActionDecoration::OnMousePressed. |
- current_tab_id_ = |
- contents ? extensions::ExtensionTabUtil::GetTabId(contents) : -1; |
- current_url_ = url; |
+ExtensionAction* PageActionDecoration::GetPageAction() { |
+ return viewController_->extension_action(); |
+} |
- bool visible = contents && |
- (preview_enabled_ || page_action_->GetIsVisible(current_tab_id_)); |
+void PageActionDecoration::UpdateVisibility(WebContents* contents) { |
+ bool visible = |
+ contents && (preview_enabled_ || viewController_->IsEnabled(contents)); |
if (visible) { |
- SetToolTip(page_action_->GetTitle(current_tab_id_)); |
+ SetToolTip(viewController_->GetTooltip(contents)); |
// Set the image. |
- gfx::Image icon = icon_factory_->GetIcon(current_tab_id_); |
+ gfx::Image icon = viewController_->GetIcon(contents); |
if (!icon.IsEmpty()) { |
SetImage(icon.ToNSImage()); |
} else if (!GetImage()) { |
@@ -155,14 +121,6 @@ void PageActionDecoration::UpdateVisibility(WebContents* contents, |
SetVisible(visible); |
} |
-void PageActionDecoration::SetToolTip(NSString* tooltip) { |
- tooltip_.reset([tooltip retain]); |
-} |
- |
-void PageActionDecoration::SetToolTip(std::string tooltip) { |
- SetToolTip(tooltip.empty() ? nil : base::SysUTF8ToNSString(tooltip)); |
-} |
- |
NSString* PageActionDecoration::GetToolTip() { |
return tooltip_.get(); |
} |
@@ -184,40 +142,51 @@ NSPoint PageActionDecoration::GetBubblePointInFrame(NSRect frame) { |
} |
NSMenu* PageActionDecoration::GetMenu() { |
- const Extension* extension = GetExtension(); |
+ const Extension* extension = viewController_->extension(); |
if (!extension->ShowConfigureContextMenus()) |
return nil; |
contextMenuController_.reset([[ExtensionActionContextMenuController alloc] |
initWithExtension:extension |
- browser:browser_ |
- extensionAction:page_action_]); |
+ browser:viewController_->browser() |
+ extensionAction:GetPageAction()]); |
base::scoped_nsobject<NSMenu> contextMenu([[NSMenu alloc] initWithTitle:@""]); |
[contextMenuController_ populateMenu:contextMenu]; |
return contextMenu.autorelease(); |
} |
-void PageActionDecoration::ShowPopup(const NSRect& frame, |
- const GURL& popup_url) { |
- // Anchor popup at the bottom center of the page action icon. |
- AutocompleteTextField* field = owner_->GetAutocompleteTextField(); |
- NSPoint anchor = GetBubblePointInFrame(frame); |
- anchor = [field convertPoint:anchor toView:nil]; |
+void PageActionDecoration::SetToolTip(const base::string16& tooltip) { |
+ NSString* nsTooltip = |
+ tooltip.empty() ? nil : base::SysUTF16ToNSString(tooltip); |
+ tooltip_.reset([nsTooltip retain]); |
+} |
- [ExtensionPopupController showURL:popup_url |
- inBrowser:chrome::GetLastActiveBrowser() |
- anchoredAt:anchor |
- arrowLocation:info_bubble::kTopRight |
- devMode:NO]; |
+ToolbarActionViewController* |
+PageActionDecoration::GetPreferredPopupViewController() { |
+ return viewController_.get(); |
} |
-const Extension* PageActionDecoration::GetExtension() { |
- const Extension* extension = extensions::ExtensionRegistry::Get( |
- browser_->profile())->enabled_extensions().GetByID( |
- page_action_->extension_id()); |
- DCHECK(extension); |
- return extension; |
+content::WebContents* PageActionDecoration::GetCurrentWebContents() const { |
+ return owner_ ? owner_->GetWebContents() : nullptr; |
+} |
+ |
+void PageActionDecoration::UpdateState() { |
+ // If we have no owner, that means this class is still being constructed. |
+ WebContents* web_contents = owner_ ? owner_->GetWebContents() : NULL; |
+ if (web_contents) { |
+ UpdateVisibility(web_contents); |
+ owner_->RedrawDecoration(this); |
+ } |
+} |
+ |
+NSPoint PageActionDecoration::GetPopupPoint() { |
+ // Anchor popup at the bottom center of the page action icon. |
+ AutocompleteTextField* field = owner_->GetAutocompleteTextField(); |
+ NSPoint anchor = GetBubblePointInFrame( |
+ owner_->GetPageActionFrame(viewController_->extension_action())); |
+ anchor = [field convertPoint:anchor toView:nil]; |
+ return anchor; |
} |
void PageActionDecoration::Observe( |
@@ -236,11 +205,11 @@ void PageActionDecoration::Observe( |
std::pair<const std::string, gfx::NativeWindow>* payload = |
content::Details<std::pair<const std::string, gfx::NativeWindow> >( |
details).ptr(); |
- std::string extension_id = payload->first; |
+ const std::string& extension_id = payload->first; |
gfx::NativeWindow window = payload->second; |
- if (window != browser_->window()->GetNativeWindow()) |
+ if (window != viewController_->browser()->window()->GetNativeWindow()) |
break; |
- if (extension_id != page_action_->extension_id()) |
+ if (extension_id != GetExtension()->id()) |
break; |
if (IsVisible()) |
ActivatePageAction(true); |