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

Unified Diff: chrome/browser/ui/cocoa/tabs/tab_controller.mm

Issue 688523002: [Cocoa] Tab audio mute control, behind a switch (off by default). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Prevent TabStripController from unconditionally causing creation of MediaIndicatorButton. 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/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]) -

Powered by Google App Engine
This is Rietveld 408576698