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

Unified Diff: chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm

Issue 670463004: Make a platform-independent ToolbarActionViewController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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_actions_controller.mm
diff --git a/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm b/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm
index 76a374c07de9c44b375d21fddbdd4e41f57e1497..d86dc90d390f060393fc3c0d529ef817bfc8d44f 100644
--- a/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm
@@ -13,21 +13,20 @@
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_toolbar_model.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#import "chrome/browser/ui/cocoa/extensions/browser_action_button.h"
#import "chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h"
+#import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu_controller.h"
#import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h"
#import "chrome/browser/ui/cocoa/image_button_cell.h"
#import "chrome/browser/ui/cocoa/menu_button.h"
+#include "chrome/browser/ui/extensions/extension_action_view_controller.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/extensions/api/extension_action/action_info.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_source.h"
-#include "extensions/browser/extension_registry.h"
#include "grit/theme_resources.h"
#import "third_party/google_toolbox_for_mac/src/AppKit/GTMNSAnimation+Duration.h"
@@ -90,9 +89,9 @@ const CGFloat kBrowserActionBubbleYOffset = 3.0;
// position of the button.
- (void)updateButtonOpacity;
-// Returns the existing button with the given extension backing it; nil if it
-// cannot be found or the extension's ID is invalid.
-- (BrowserActionButton*)buttonForExtension:(const Extension*)extension;
+// Returns the existing button associated with the given id; nil if it cannot be
+// found.
+- (BrowserActionButton*)buttonForId:(const std::string&)id;
// Returns the preferred width of the container given the number of visible
// buttons |buttonCount|.
@@ -166,9 +165,6 @@ const CGFloat kBrowserActionBubbleYOffset = 3.0;
// Updates the container's grippy cursor based on the number of hidden buttons.
- (void)updateGrippyCursors;
-
-// Returns the ID of the currently selected tab or -1 if none exists.
-- (int)currentTabId;
@end
// A helper class to proxy extension notifications to the view controller's
@@ -231,7 +227,7 @@ class ExtensionServiceObserverBridge
void ToolbarExtensionMoved(const Extension* extension, int index) override {}
void ToolbarExtensionUpdated(const Extension* extension) override {
- BrowserActionButton* button = [owner_ buttonForExtension:extension];
+ BrowserActionButton* button = [owner_ buttonForId:extension->id()];
if (button)
[button updateState];
}
@@ -243,9 +239,8 @@ class ExtensionServiceObserverBridge
if (popup || !browser_->window()->IsActive())
return false;
- BrowserActionButton* button = [owner_ buttonForExtension:extension];
- return button && [owner_ browserActionClicked:button
- shouldGrant:grant_active_tab];
+ BrowserActionButton* button = [owner_ buttonForId:extension->id()];
+ return button && [button viewController]->ExecuteAction(grant_active_tab);
}
void ToolbarVisibleCountChanged() override {}
@@ -347,10 +342,8 @@ class ExtensionServiceObserverBridge
}
- (void)update {
- for (BrowserActionButton* button in [buttons_ allValues]) {
- [button setTabId:[self currentTabId]];
+ for (BrowserActionButton* button in [buttons_ allValues])
[button updateState];
- }
}
- (NSUInteger)buttonCount {
@@ -380,15 +373,6 @@ class ExtensionServiceObserverBridge
}
}
-- (NSView*)browserActionViewForExtension:(const Extension*)extension {
- for (BrowserActionButton* button in [buttons_ allValues]) {
- if ([button extension] == extension)
- return button;
- }
- NOTREACHED();
- return nil;
-}
-
- (CGFloat)savedWidth {
if (!toolbarModel_)
return 0;
@@ -400,13 +384,8 @@ class ExtensionServiceObserverBridge
return [self containerWidthWithButtonCount:savedButtonCount];
}
-- (NSPoint)popupPointForBrowserAction:(const Extension*)extension {
- if (!extensions::ExtensionActionManager::Get(profile_)->
- GetBrowserAction(*extension)) {
- return NSZeroPoint;
- }
-
- NSButton* button = [self buttonForExtension:extension];
+- (NSPoint)popupPointForId:(const std::string&)id {
+ NSButton* button = [self buttonForId:id];
if (!button)
return NSZeroPoint;
@@ -444,18 +423,17 @@ class ExtensionServiceObserverBridge
return YES;
}
-- (void)activateBrowserAction:(const std::string&)extension_id {
- const Extension* extension = extensions::ExtensionRegistry::Get(
- browser_->profile())->enabled_extensions().GetByID(extension_id);
- if (!extension)
- return;
-
- BrowserActionButton* button = [self buttonForExtension:extension];
+- (void)activateBrowserAction:(const std::string&)id {
+ BrowserActionButton* button = [self buttonForId:id];
// |button| can be nil when the browser action has its button hidden.
if (button)
[self browserActionClicked:button];
}
+- (content::WebContents*)currentWebContents {
+ return browser_->tab_strip_model()->GetActiveWebContents();
+}
+
#pragma mark -
#pragma mark NSMenuDelegate
@@ -466,7 +444,8 @@ class ExtensionServiceObserverBridge
[menu addItemWithTitle:@"" action:nil keyEquivalent:@""];
for (BrowserActionButton* button in hiddenButtons_.get()) {
- NSString* name = base::SysUTF8ToNSString([button extension]->name());
+ NSString* name =
+ base::SysUTF16ToNSString([button viewController]->GetActionName());
NSMenuItem* item =
[menu addItemWithTitle:name
action:@selector(chevronItemSelected:)
@@ -505,12 +484,26 @@ class ExtensionServiceObserverBridge
NSRect buttonFrame = NSMakeRect(0.0, kBrowserActionOriginYOffset,
kBrowserActionWidth, kBrowserActionHeight);
+ ExtensionAction* extensionAction =
+ extensions::ExtensionActionManager::Get(browser_->profile())->
+ GetExtensionAction(*extension);
+ DCHECK(extensionAction)
+ << "Don't create a BrowserActionButton if there is no browser action.";
+ scoped_ptr<ToolbarActionViewController> viewController(
+ new ExtensionActionViewController(extension, browser_, extensionAction));
+ // TODO(devlin): Move ContextMenuController stuff to
+ // ExtensionActionViewController.
+ ExtensionActionContextMenuController* menuController =
+ [[ExtensionActionContextMenuController alloc]
+ initWithExtension:extension
+ browser:browser_
+ extensionAction:extensionAction];
BrowserActionButton* newButton =
[[[BrowserActionButton alloc]
initWithFrame:buttonFrame
- extension:extension
- browser:browser_
- tabId:[self currentTabId]] autorelease];
+ viewController:viewController.Pass()
+ controller:self
+ menuController:menuController] autorelease];
[newButton setTarget:self];
[newButton setAction:@selector(browserActionClicked:)];
NSString* buttonKey = base::SysUTF8ToNSString(extension->id());
@@ -561,7 +554,7 @@ class ExtensionServiceObserverBridge
for (ExtensionList::const_iterator iter =
toolbarModel_->toolbar_items().begin();
iter != toolbarModel_->toolbar_items().end(); ++iter) {
- BrowserActionButton* button = [self buttonForExtension:(iter->get())];
+ BrowserActionButton* button = [self buttonForId:(iter->get()->id())];
if (!button)
continue;
if (![button isBeingDragged])
@@ -588,12 +581,12 @@ class ExtensionServiceObserverBridge
}
}
-- (BrowserActionButton*)buttonForExtension:(const Extension*)extension {
- NSString* extensionId = base::SysUTF8ToNSString(extension->id());
- DCHECK(extensionId);
- if (!extensionId)
+- (BrowserActionButton*)buttonForId:(const std::string&)id {
+ NSString* nsId = base::SysUTF8ToNSString(id);
+ DCHECK(nsId);
+ if (!nsId)
return nil;
- return [buttons_ objectForKey:extensionId];
+ return [buttons_ objectForKey:nsId];
}
- (CGFloat)containerWidthWithButtonCount:(NSUInteger)buttonCount {
@@ -654,7 +647,7 @@ class ExtensionServiceObserverBridge
for (ExtensionList::const_iterator iter =
toolbarModel_->toolbar_items().begin();
iter != toolbarModel_->toolbar_items().end(); ++iter) {
- BrowserActionButton* button = [self buttonForExtension:(iter->get())];
+ BrowserActionButton* button = [self buttonForId:(iter->get()->id())];
NSRect buttonFrame = [button frame];
if (NSContainsRect([containerView_ bounds], buttonFrame))
continue;
@@ -700,13 +693,14 @@ class ExtensionServiceObserverBridge
for (ExtensionList::const_iterator iter =
toolbarModel_->toolbar_items().begin();
iter != toolbarModel_->toolbar_items().end(); ++iter) {
- BrowserActionButton* button = [self buttonForExtension:(iter->get())];
+ BrowserActionButton* button = [self buttonForId:(iter->get()->id())];
CGFloat intersectionWidth =
NSWidth(NSIntersectionRect(draggedButtonFrame, [button frame]));
if (intersectionWidth > dragThreshold && button != draggedButton &&
![button isAnimating] && index < [self visibleButtonCount]) {
- toolbarModel_->MoveExtensionIcon([draggedButton extension]->id(), index);
+ toolbarModel_->MoveExtensionIcon([draggedButton viewController]->GetId(),
+ index);
[self positionActionButtonsAndAnimate:YES];
return;
}
@@ -744,24 +738,7 @@ class ExtensionServiceObserverBridge
- (BOOL)browserActionClicked:(BrowserActionButton*)button
shouldGrant:(BOOL)shouldGrant {
- const Extension* extension = [button extension];
- switch (extensions::ExtensionActionAPI::Get(profile_)->ExecuteExtensionAction(
- extension, browser_, shouldGrant)) {
- case ExtensionAction::ACTION_NONE:
- break;
- case ExtensionAction::ACTION_SHOW_POPUP: {
- GURL popupUrl = extensions::ExtensionActionManager::Get(profile_)->
- GetBrowserAction(*extension)->GetPopupUrl([self currentTabId]);
- NSPoint arrowPoint = [self popupPointForBrowserAction:extension];
- [ExtensionPopupController showURL:popupUrl
- inBrowser:browser_
- anchoredAt:arrowPoint
- arrowLocation:info_bubble::kTopRight
- devMode:NO];
- return YES;
- }
- }
- return NO;
+ return [button viewController]->ExecuteAction(shouldGrant);
}
- (BOOL)browserActionClicked:(BrowserActionButton*)button {
@@ -849,15 +826,6 @@ class ExtensionServiceObserverBridge
[[containerView_ window] invalidateCursorRectsForView:containerView_];
}
-- (int)currentTabId {
- content::WebContents* active_tab =
- browser_->tab_strip_model()->GetActiveWebContents();
- if (!active_tab)
- return -1;
-
- return SessionTabHelper::FromWebContents(active_tab)->session_id().id();
-}
-
#pragma mark -
#pragma mark Testing Methods

Powered by Google App Engine
This is Rietveld 408576698