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 19f9ac8aea7d2423ded80b52a3906d777e4384cc..ff5a3b23635517dd97a92c19722bc1751dfcb641 100644 |
--- a/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm |
+++ b/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm |
@@ -7,16 +7,19 @@ |
#include <string> |
#include "base/strings/sys_string_conversions.h" |
+#include "chrome/browser/extensions/extension_message_bubble_controller.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_window.h" |
#import "chrome/browser/ui/cocoa/browser_window_controller.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_message_bubble_bridge.h" |
#import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h" |
-#import "chrome/browser/ui/cocoa/extensions/extension_toolbar_icon_surfacing_bubble_mac.h" |
+#import "chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.h" |
#import "chrome/browser/ui/cocoa/image_button_cell.h" |
#import "chrome/browser/ui/cocoa/menu_button.h" |
#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
+#include "chrome/browser/ui/extensions/extension_toolbar_icon_surfacing_bubble_delegate.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h" |
#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" |
@@ -141,6 +144,11 @@ const CGFloat kBrowserActionBubbleYOffset = 3.0; |
// Returns the associated ToolbarController. |
- (ToolbarController*)toolbarController; |
+// Creates a message bubble anchored to the first action in the toolbar (or the |
+// overflow menu, if no actions are present). |
+- (ToolbarActionsBarBubbleMac*)createMessageBubble: |
+ (scoped_ptr<ToolbarActionsBarBubbleDelegate>)delegate; |
+ |
@end |
namespace { |
@@ -253,7 +261,17 @@ void ToolbarActionsBarBridge::OnOverflowedActionWantsToRunChanged( |
void ToolbarActionsBarBridge::ShowExtensionMessageBubble( |
scoped_ptr<extensions::ExtensionMessageBubbleController> controller) { |
- NOTREACHED(); // Not yet implemented on Mac. |
+ // This goop is a by-product of needing to wire together abstract classes, |
+ // C++/Cocoa bridges, and ExtensionMessageBubbleController's somewhat strange |
+ // Show() interface. It's ugly, but it's pretty confined, so it's probably |
+ // okay (but if we ever need to expand, it might need to be reconsidered). |
+ scoped_ptr<ExtensionMessageBubbleBridge> bridge( |
+ new ExtensionMessageBubbleBridge(controller.Pass())); |
+ ExtensionMessageBubbleBridge* weak_bridge = bridge.get(); |
+ ToolbarActionsBarBubbleMac* bubble = |
+ [controller_ createMessageBubble:bridge.Pass()]; |
+ weak_bridge->SetBubble(bubble); |
+ weak_bridge->controller()->Show(weak_bridge); |
} |
} // namespace |
@@ -325,7 +343,8 @@ void ToolbarActionsBarBridge::ShowExtensionMessageBubble( |
[self showChevronIfNecessaryInFrame:[containerView_ frame]]; |
[self updateGrippyCursors]; |
[container setResizable:!isOverflow_]; |
- if (toolbarActionsBar_->ShouldShowInfoBubble()) { |
+ if (ExtensionToolbarIconSurfacingBubbleDelegate::ShouldShowForProfile( |
+ browser_->profile())) { |
[containerView_ setTrackingEnabled:YES]; |
[[NSNotificationCenter defaultCenter] |
addObserver:self |
@@ -488,6 +507,8 @@ void ToolbarActionsBarBridge::ShowExtensionMessageBubble( |
if (![self updateContainerVisibility]) |
return; // Container is hidden; no need to update. |
+ [containerView_ setIsHighlighting:toolbarActionsBar_->is_highlighting()]; |
+ |
std::vector<ToolbarActionViewController*> toolbar_actions = |
toolbarActionsBar_->toolbar_actions(); |
for (NSUInteger i = 0; i < [buttons_ count]; ++i) { |
@@ -670,15 +691,12 @@ void ToolbarActionsBarBridge::ShowExtensionMessageBubble( |
} |
- (void)containerMouseEntered:(NSNotification*)notification { |
- if (toolbarActionsBar_->ShouldShowInfoBubble()) { |
- NSPoint anchor = [self popupPointForId:[[buttons_ objectAtIndex:0] |
- viewController]->GetId()]; |
- anchor = [[containerView_ window] convertBaseToScreen:anchor]; |
- ExtensionToolbarIconSurfacingBubbleMac* bubble = |
- [[ExtensionToolbarIconSurfacingBubbleMac alloc] |
- initWithParentWindow:[containerView_ window] |
- anchorPoint:anchor |
- delegate:toolbarActionsBar_.get()]; |
+ if (ExtensionToolbarIconSurfacingBubbleDelegate::ShouldShowForProfile( |
+ browser_->profile())) { |
+ ToolbarActionsBarBubbleMac* bubble = |
+ [self createMessageBubble:scoped_ptr<ToolbarActionsBarBubbleDelegate>( |
+ new ExtensionToolbarIconSurfacingBubbleDelegate( |
+ browser_->profile()))]; |
[bubble showWindow:nil]; |
} |
[containerView_ setTrackingEnabled:NO]; |
@@ -868,6 +886,18 @@ void ToolbarActionsBarBridge::ShowExtensionMessageBubble( |
browser_->window()->GetNativeWindow()] toolbarController]; |
} |
+- (ToolbarActionsBarBubbleMac*)createMessageBubble: |
+ (scoped_ptr<ToolbarActionsBarBubbleDelegate>)delegate { |
+ DCHECK_GE([buttons_ count], 0u); |
+ NSPoint anchor = [self popupPointForId:[[buttons_ objectAtIndex:0] |
+ viewController]->GetId()]; |
+ anchor = [[containerView_ window] convertBaseToScreen:anchor]; |
+ return [[ToolbarActionsBarBubbleMac alloc] |
+ initWithParentWindow:[containerView_ window] |
+ anchorPoint:anchor |
+ delegate:delegate.Pass()]; |
+} |
+ |
#pragma mark - |
#pragma mark Testing Methods |