Index: chrome/browser/ui/cocoa/tabs/tab_controller.mm |
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_controller.mm |
index 831974f69ea4a964a206c050bc5d6dfe72e608d6..08428b141c70620b975ee43b52b1873d4c4ef5a0 100644 |
--- a/chrome/browser/ui/cocoa/tabs/tab_controller.mm |
+++ b/chrome/browser/ui/cocoa/tabs/tab_controller.mm |
@@ -13,10 +13,11 @@ |
#import "chrome/browser/themes/theme_properties.h" |
#import "chrome/browser/themes/theme_service.h" |
#import "chrome/browser/ui/cocoa/sprite_view.h" |
-#import "chrome/browser/ui/cocoa/tabs/media_indicator_view.h" |
+#import "chrome/browser/ui/cocoa/tabs/media_indicator_button.h" |
#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h" |
#import "chrome/browser/ui/cocoa/tabs/tab_view.h" |
#import "chrome/browser/ui/cocoa/themed_window.h" |
+#include "content/public/browser/user_metrics.h" |
#import "extensions/common/extension.h" |
#import "ui/base/cocoa/menu_controller.h" |
@@ -127,7 +128,6 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
} |
- (void)dealloc { |
- [mediaIndicatorView_ setAnimationDoneCallbackObject:nil withSelector:nil]; |
[[NSNotificationCenter defaultCenter] removeObserver:self]; |
[[self tabView] setController:nil]; |
[super dealloc]; |
@@ -163,7 +163,29 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
return [contextMenuController_ menu]; |
} |
+- (void)toggleMute:(id)sender { |
+ if ([[self target] respondsToSelector:@selector(toggleMute:)]) { |
+ [[self target] performSelector:@selector(toggleMute:) |
+ withObject:[self view]]; |
+ } |
+} |
+ |
- (void)closeTab:(id)sender { |
+ using base::UserMetricsAction; |
+ |
+ if (mediaIndicatorButton_ && ![mediaIndicatorButton_ isHidden]) { |
+ if ([mediaIndicatorButton_ isEnabled]) { |
+ content::RecordAction(UserMetricsAction("CloseTab_MuteToggleAvailable")); |
+ } else if ([mediaIndicatorButton_ showingMediaState] == |
+ TAB_MEDIA_STATE_AUDIO_PLAYING) { |
+ content::RecordAction(UserMetricsAction("CloseTab_AudioIndicator")); |
+ } else { |
+ content::RecordAction(UserMetricsAction("CloseTab_RecordingIndicator")); |
+ } |
+ } else { |
+ content::RecordAction(UserMetricsAction("CloseTab_NoMediaIndicator")); |
+ } |
+ |
if ([[self target] respondsToSelector:@selector(closeTab:)]) { |
[[self target] performSelector:@selector(closeTab:) |
withObject:[self view]]; |
@@ -230,21 +252,21 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
[[self view] addSubview:iconView_]; |
} |
-- (MediaIndicatorView*)mediaIndicatorView { |
- return mediaIndicatorView_; |
+- (MediaIndicatorButton*)mediaIndicatorButton { |
+ return mediaIndicatorButton_; |
} |
-- (void)setMediaIndicatorView:(MediaIndicatorView*)mediaIndicatorView { |
- [mediaIndicatorView_ removeFromSuperview]; |
- mediaIndicatorView_.reset([mediaIndicatorView retain]); |
- [self updateVisibility]; |
- if (mediaIndicatorView_) { |
- [[self view] addSubview:mediaIndicatorView_]; |
- [mediaIndicatorView_ |
- setAnimationDoneCallbackObject:self |
- withSelector:@selector(updateVisibility)]; |
- |
+- (void)setMediaState:(TabMediaState)mediaState { |
+ if (!mediaIndicatorButton_ && mediaState != TAB_MEDIA_STATE_NONE) { |
+ mediaIndicatorButton_.reset([[MediaIndicatorButton alloc] init]); |
+ [self updateVisibility]; // Do layout and visibility before adding subview. |
+ [[self view] addSubview:mediaIndicatorButton_]; |
+ [mediaIndicatorButton_ setAnimationDoneTarget:self |
+ withAction:@selector(updateVisibility)]; |
+ [mediaIndicatorButton_ setClickTarget:self |
+ withAction:@selector(toggleMute:)]; |
} |
+ [mediaIndicatorButton_ transitionToMediaState:mediaState]; |
} |
- (HoverCloseButton*)closeButton { |
@@ -273,16 +295,15 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
- (BOOL)shouldShowIcon { |
return chrome::ShouldTabShowFavicon( |
[self iconCapacity], [self mini], [self active], iconView_ != nil, |
- !mediaIndicatorView_ ? TAB_MEDIA_STATE_NONE : |
- [mediaIndicatorView_ animatingMediaState]); |
+ !mediaIndicatorButton_ ? TAB_MEDIA_STATE_NONE : |
+ [mediaIndicatorButton_ showingMediaState]); |
} |
- (BOOL)shouldShowMediaIndicator { |
- if (!mediaIndicatorView_) |
- return NO; |
return chrome::ShouldTabShowMediaIndicator( |
[self iconCapacity], [self mini], [self active], iconView_ != nil, |
- [mediaIndicatorView_ animatingMediaState]); |
+ !mediaIndicatorButton_ ? TAB_MEDIA_STATE_NONE : |
+ [mediaIndicatorButton_ showingMediaState]); |
} |
- (BOOL)shouldShowCloseButton { |
@@ -321,9 +342,6 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
[iconView_ setFrame:originalIconFrame_]; |
} |
} |
- // Ensure that the icon is suppressed if no icon is set or if the tab is too |
- // narrow to display one. |
- [self updateVisibility]; |
} |
- (void)updateVisibility { |
@@ -345,10 +363,11 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
BOOL newShowMediaIndicator = [self shouldShowMediaIndicator]; |
- [mediaIndicatorView_ setHidden:!newShowMediaIndicator]; |
+ [mediaIndicatorButton_ setHidden:!newShowMediaIndicator]; |
if (newShowMediaIndicator) { |
- NSRect newFrame = [mediaIndicatorView_ frame]; |
+ NSRect newFrame = [mediaIndicatorButton_ frame]; |
+ newFrame.size = [[mediaIndicatorButton_ image] size]; |
if ([self app] || [self mini]) { |
// Tab is pinned: Position the media indicator in the center. |
const CGFloat tabWidth = [self app] ? |
@@ -357,7 +376,7 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
newFrame.origin.y = NSMinY(originalIconFrame_) - |
std::floor((NSHeight(newFrame) - NSHeight(originalIconFrame_)) / 2); |
} else { |
- // The Frame for the mediaIndicatorView_ depends on whether iconView_ |
+ // The Frame for the mediaIndicatorButton_ depends on whether iconView_ |
// and/or closeButton_ are visible, and where they have been positioned. |
const NSRect closeButtonFrame = [closeButton_ frame]; |
newFrame.origin.x = NSMinX(closeButtonFrame); |
@@ -368,7 +387,7 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
newFrame.origin.y = NSMinY(closeButtonFrame) - |
std::floor((NSHeight(newFrame) - NSHeight(closeButtonFrame)) / 2); |
} |
- [mediaIndicatorView_ setFrame:newFrame]; |
+ [mediaIndicatorButton_ setFrame:newFrame]; |
} |
// Adjust the title view based on changes to the icon's and close button's |
@@ -385,7 +404,7 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate { |
} |
if (newShowMediaIndicator) { |
- newTitleFrame.size.width = NSMinX([mediaIndicatorView_ frame]) - |
+ newTitleFrame.size.width = NSMinX([mediaIndicatorButton_ frame]) - |
newTitleFrame.origin.x; |
} else if (newShowCloseButton) { |
newTitleFrame.size.width = NSMinX([closeButton_ frame]) - |