| 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]) -
|
|
|