Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Unified Diff: chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm

Issue 670463004: Make a platform-independent ToolbarActionViewController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..ef5341af5abdce1c543ebec1eb5f77a0bdbf47e1 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_action_view_controller_cocoa.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 "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 ExtensionActionViewControllerCocoa(
+ extension, browser, page_action));
+ // TODO(devlin): Move these notifications to
+ // ExtensionActionViewControllerCocoa.
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);

Powered by Google App Engine
This is Rietveld 408576698