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

Unified Diff: chrome/browser/ui/cocoa/extensions/browser_action_button.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/extensions/browser_action_button.mm
diff --git a/chrome/browser/ui/cocoa/extensions/browser_action_button.mm b/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
index fec50ea7952442e11ed36749108dc4f7678fe406..9083657221deaf7f030806e453f7b247b288c914 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
+++ b/chrome/browser/ui/cocoa/extensions/browser_action_button.mm
@@ -9,13 +9,12 @@
#include "base/logging.h"
#include "base/strings/sys_string_conversions.h"
-#include "chrome/browser/extensions/extension_action.h"
-#include "chrome/browser/extensions/extension_action_icon_factory.h"
-#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/cocoa/extensions/extension_action_context_menu_controller.h"
-#include "extensions/common/extension.h"
+#include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h"
+#import "chrome/browser/ui/cocoa/toolbar/toolbar_action_view_delegate_cocoa.h"
+#import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu_controller.h"
+#import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
Avi (use Gerrit) 2014/10/30 23:21:25 alphabetize prev 4 lines
Devlin 2014/10/31 17:50:43 Whoops! (Clearly I became reliant on the presubmit
#include "grit/theme_resources.h"
#include "skia/ext/skia_utils_mac.h"
#import "third_party/google_toolbox_for_mac/src/AppKit/GTMNSAnimation+Duration.h"
@@ -23,9 +22,6 @@
#include "ui/gfx/image/image.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
-#include "ui/gfx/size.h"
-
-using extensions::Extension;
NSString* const kBrowserActionButtonDraggingNotification =
@"BrowserActionButtonDraggingNotification";
@@ -36,43 +32,57 @@ static const CGFloat kBrowserActionBadgeOriginYOffset = 5;
static const CGFloat kAnimationDuration = 0.2;
static const CGFloat kMinimumDragDistance = 5;
-// A helper class to bridge the asynchronous Skia bitmap loading mechanism to
-// the extension's button.
-class ExtensionActionIconFactoryBridge
- : public ExtensionActionIconFactory::Observer {
+// A class to bridge the ToolbarActionViewController and the
+// BrowserActionButton.
+class ToolbarActionViewDelegateBridge : public ToolbarActionViewDelegateCocoa {
public:
- ExtensionActionIconFactoryBridge(BrowserActionButton* owner,
- Profile* profile,
- const Extension* extension)
- : owner_(owner),
- browser_action_([[owner cell] extensionAction]),
- icon_factory_(profile, extension, browser_action_, this) {
- }
+ ToolbarActionViewDelegateBridge(BrowserActionButton* owner,
+ BrowserActionsController* controller);
+ ~ToolbarActionViewDelegateBridge();
- ~ExtensionActionIconFactoryBridge() override {}
+ private:
+ // ToolbarActionViewDelegateCocoa:
+ ToolbarActionViewController* GetPreferredPopupViewController() override;
+ content::WebContents* GetCurrentWebContents() const override;
+ void UpdateState() override;
+ NSPoint GetPopupPoint() override;
- // ExtensionActionIconFactory::Observer implementation.
- void OnIconUpdated() override { [owner_ updateState]; }
+ // The owning button. Weak.
+ BrowserActionButton* owner_;
- gfx::Image GetIcon(int tabId) {
- return icon_factory_.GetIcon(tabId);
- }
+ // The BrowserActionsController that owns the button. Weak.
+ BrowserActionsController* controller_;
- private:
- // Weak. Owns us.
- BrowserActionButton* owner_;
+ DISALLOW_COPY_AND_ASSIGN(ToolbarActionViewDelegateBridge);
+};
- // The browser action whose images we're loading.
- ExtensionAction* const browser_action_;
+ToolbarActionViewDelegateBridge::ToolbarActionViewDelegateBridge(
+ BrowserActionButton* owner,
+ BrowserActionsController* controller)
+ : owner_(owner),
+ controller_(controller) {
+}
- // The object that will be used to get the browser action icon for us.
- // It may load the icon asynchronously (in which case the initial icon
- // returned by the factory will be transparent), so we have to observe it for
- // updates to the icon.
- ExtensionActionIconFactory icon_factory_;
+ToolbarActionViewDelegateBridge::~ToolbarActionViewDelegateBridge() {
+}
- DISALLOW_COPY_AND_ASSIGN(ExtensionActionIconFactoryBridge);
-};
+ToolbarActionViewController*
+ToolbarActionViewDelegateBridge::GetPreferredPopupViewController() {
+ return [owner_ viewController];
+}
+
+content::WebContents* ToolbarActionViewDelegateBridge::GetCurrentWebContents()
+ const {
+ return [controller_ currentWebContents];
+}
+
+void ToolbarActionViewDelegateBridge::UpdateState() {
+ [owner_ updateState];
+}
+
+NSPoint ToolbarActionViewDelegateBridge::GetPopupPoint() {
+ return [controller_ popupPointForId:[owner_ viewController]->GetId()];
+}
@interface BrowserActionCell (Internals)
- (void)drawBadgeWithinFrame:(NSRect)frame;
@@ -85,17 +95,15 @@ class ExtensionActionIconFactoryBridge
@implementation BrowserActionButton
@synthesize isBeingDragged = isBeingDragged_;
-@synthesize extension = extension_;
-@synthesize tabId = tabId_;
+ (Class)cellClass {
return [BrowserActionCell class];
}
- (id)initWithFrame:(NSRect)frame
- extension:(const Extension*)extension
- browser:(Browser*)browser
- tabId:(int)tabId {
+ viewController:(scoped_ptr<ToolbarActionViewController>)viewController
+ controller:(BrowserActionsController*)controller
+ menuController:(ExtensionActionContextMenuController*)menuController {
if ((self = [super initWithFrame:frame])) {
BrowserActionCell* cell = [[[BrowserActionCell alloc] init] autorelease];
// [NSButton setCell:] warns to NOT use setCell: other than in the
@@ -104,15 +112,18 @@ class ExtensionActionIconFactoryBridge
// object. To honor the assumed semantics, we do nothing with
// NSButton between alloc/init and setCell:.
[self setCell:cell];
- [cell setTabId:tabId];
- ExtensionAction* browser_action =
- extensions::ExtensionActionManager::Get(browser->profile())->
- GetExtensionAction(*extension);
- CHECK(browser_action)
- << "Don't create a BrowserActionButton if there is no browser action.";
- [cell setExtensionAction:browser_action];
+
+ browserActionsController_ = controller;
+ viewControllerDelegate_.reset(
+ new ToolbarActionViewDelegateBridge(self, controller));
+ viewController_ = viewController.Pass();
+ viewController_->SetDelegate(viewControllerDelegate_.get());
+
+ [cell setBrowserActionsController:controller];
+ [cell setViewController:viewController_.get()];
[cell
- accessibilitySetOverrideValue:base::SysUTF8ToNSString(extension->name())
+ accessibilitySetOverrideValue:base::SysUTF16ToNSString(
+ viewController_->GetAccessibleName([controller currentWebContents]))
forAttribute:NSAccessibilityDescriptionAttribute];
[cell setImageID:IDR_BROWSER_ACTION
forButtonState:image_button_cell::kDefaultState];
@@ -127,20 +138,13 @@ class ExtensionActionIconFactoryBridge
[self setButtonType:NSMomentaryChangeButton];
[self setShowsBorderOnlyWhileMouseInside:YES];
- contextMenuController_.reset([[ExtensionActionContextMenuController alloc]
- initWithExtension:extension
- browser:browser
- extensionAction:browser_action]);
+ contextMenuController_.reset(menuController);
+
base::scoped_nsobject<NSMenu> contextMenu(
[[NSMenu alloc] initWithTitle:@""]);
[contextMenu setDelegate:self];
[self setMenu:contextMenu];
- tabId_ = tabId;
- extension_ = extension;
- iconFactoryBridge_.reset(new ExtensionActionIconFactoryBridge(
- self, browser->profile(), extension));
-
moveAnimation_.reset([[NSViewAnimation alloc] init]);
[moveAnimation_ gtm_setDuration:kAnimationDuration
eventMask:NSLeftMouseUpMask];
@@ -240,25 +244,20 @@ class ExtensionActionIconFactoryBridge
}
- (void)updateState {
- if (tabId_ < 0)
+ content::WebContents* webContents =
+ [browserActionsController_ currentWebContents];
+ if (!webContents)
return;
- std::string tooltip = [[self cell] extensionAction]->GetTitle(tabId_);
- if (tooltip.empty()) {
- [self setToolTip:nil];
- } else {
- [self setToolTip:base::SysUTF8ToNSString(tooltip)];
- }
+ base::string16 tooltip = viewController_->GetTooltip(webContents);
+ [self setToolTip:(tooltip.empty() ? nil : base::SysUTF16ToNSString(tooltip))];
- gfx::Image image = iconFactoryBridge_->GetIcon(tabId_);
+ gfx::Image image = viewController_->GetIcon(webContents);
if (!image.IsEmpty())
[self setImage:image.ToNSImage()];
- [[self cell] setTabId:tabId_];
-
- bool enabled = [[self cell] extensionAction]->GetIsVisible(tabId_);
- [self setEnabled:enabled];
+ [self setEnabled:viewController_->IsEnabled(webContents)];
[self setNeedsDisplay:YES];
}
@@ -267,6 +266,10 @@ class ExtensionActionIconFactoryBridge
return [moveAnimation_ isAnimating];
}
+- (ToolbarActionViewController*)viewController {
+ return viewController_.get();
+}
+
- (NSImage*)compositedImage {
NSRect bounds = [self bounds];
NSImage* image = [[[NSImage alloc] initWithSize:bounds.size] autorelease];
@@ -304,21 +307,24 @@ class ExtensionActionIconFactoryBridge
@implementation BrowserActionCell
-@synthesize tabId = tabId_;
-@synthesize extensionAction = extensionAction_;
+@synthesize browserActionsController = browserActionsController_;
+@synthesize viewController = viewController_;
-- (void)drawBadgeWithinFrame:(NSRect)frame {
+- (void)drawBadgeWithinFrame:(NSRect)frame
+ webContents:(content::WebContents*)webContents {
gfx::CanvasSkiaPaint canvas(frame, false);
canvas.set_composite_alpha(true);
gfx::Rect boundingRect(NSRectToCGRect(frame));
- extensionAction_->PaintBadge(&canvas, boundingRect, tabId_);
+ viewController_->PaintExtra(&canvas, boundingRect, webContents);
}
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
gfx::ScopedNSGraphicsContextSaveGState scopedGState;
[super drawWithFrame:cellFrame inView:controlView];
- CHECK(extensionAction_);
- bool enabled = extensionAction_->GetIsVisible(tabId_);
+ CHECK(viewController_);
Avi (use Gerrit) 2014/10/30 23:21:25 Why CHECK and not DCHECK? Usually that's saved for
Devlin 2014/10/31 17:50:43 Was just matching the previous CHECK(extensionActi
+ content::WebContents* webContents =
+ [browserActionsController_ currentWebContents];
+ bool enabled = viewController_->IsEnabled(webContents);
const NSSize imageSize = self.image.size;
const NSRect imageRect =
NSMakeRect(std::floor((NSWidth(cellFrame) - imageSize.width) / 2.0),
@@ -332,7 +338,8 @@ class ExtensionActionIconFactoryBridge
hints:nil];
cellFrame.origin.y += kBrowserActionBadgeOriginYOffset;
- [self drawBadgeWithinFrame:cellFrame];
+ [self drawBadgeWithinFrame:cellFrame
+ webContents:webContents];
}
@end

Powered by Google App Engine
This is Rietveld 408576698