Commit 0f0ed150 authored by spqchan's avatar spqchan Committed by Commit bot

[Mac] Add Home button to Default Touch Bar

BUG=700057

Review-Url: https://codereview.chromium.org/2743633005
Cr-Commit-Position: refs/heads/master@{#456209}
parent b3adecac
...@@ -390,6 +390,9 @@ class Command; ...@@ -390,6 +390,9 @@ class Command;
// Returns the BrowserWindowTouchBar object associated with the window. // Returns the BrowserWindowTouchBar object associated with the window.
- (BrowserWindowTouchBar*)browserWindowTouchBar; - (BrowserWindowTouchBar*)browserWindowTouchBar;
// Invalidates the browser's touch bar.
- (void)invalidateTouchBar;
@end // @interface BrowserWindowController @end // @interface BrowserWindowController
......
...@@ -1009,8 +1009,7 @@ bool IsTabDetachingInFullscreenEnabled() { ...@@ -1009,8 +1009,7 @@ bool IsTabDetachingInFullscreenEnabled() {
[toolbarController_ setStarredState:isStarred]; [toolbarController_ setStarredState:isStarred];
[touchBar_ setIsStarred:isStarred]; [touchBar_ setIsStarred:isStarred];
if ([[self window] respondsToSelector:@selector(setTouchBar:)]) [self invalidateTouchBar];
[[self window] performSelector:@selector(setTouchBar:) withObject:nil];
} }
- (void)setCurrentPageIsTranslated:(BOOL)on { - (void)setCurrentPageIsTranslated:(BOOL)on {
...@@ -1149,8 +1148,7 @@ bool IsTabDetachingInFullscreenEnabled() { ...@@ -1149,8 +1148,7 @@ bool IsTabDetachingInFullscreenEnabled() {
- (void)setIsLoading:(BOOL)isLoading force:(BOOL)force { - (void)setIsLoading:(BOOL)isLoading force:(BOOL)force {
[toolbarController_ setIsLoading:isLoading force:force]; [toolbarController_ setIsLoading:isLoading force:force];
[touchBar_ setIsPageLoading:isLoading]; [touchBar_ setIsPageLoading:isLoading];
if ([[self window] respondsToSelector:@selector(setTouchBar:)]) [self invalidateTouchBar];
[[self window] performSelector:@selector(setTouchBar:) withObject:nil];
} }
// Make the location bar the first responder, if possible. // Make the location bar the first responder, if possible.
...@@ -1853,13 +1851,19 @@ willAnimateFromState:(BookmarkBar::State)oldState ...@@ -1853,13 +1851,19 @@ willAnimateFromState:(BookmarkBar::State)oldState
- (BrowserWindowTouchBar*)browserWindowTouchBar { - (BrowserWindowTouchBar*)browserWindowTouchBar {
if (!touchBar_) { if (!touchBar_) {
touchBar_.reset( touchBar_.reset([[BrowserWindowTouchBar alloc]
[[BrowserWindowTouchBar alloc] initWithBrowser:browser_.get()]); initWithBrowser:browser_.get()
browserWindowController:self]);
} }
return touchBar_.get(); return touchBar_.get();
} }
- (void)invalidateTouchBar {
if ([[self window] respondsToSelector:@selector(setTouchBar:)])
[[self window] performSelector:@selector(setTouchBar:) withObject:nil];
}
@end // @implementation BrowserWindowController @end // @implementation BrowserWindowController
@implementation BrowserWindowController(Fullscreen) @implementation BrowserWindowController(Fullscreen)
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#import "ui/base/cocoa/touch_bar_forward_declarations.h" #import "ui/base/cocoa/touch_bar_forward_declarations.h"
class Browser; class Browser;
@class BrowserWindowController;
// Provides a touch bar for the browser window. This class implements the // Provides a touch bar for the browser window. This class implements the
// NSTouchBarDelegate and handles the items in the touch bar. // NSTouchBarDelegate and handles the items in the touch bar.
...@@ -22,7 +23,8 @@ class Browser; ...@@ -22,7 +23,8 @@ class Browser;
@property(nonatomic, assign) BOOL isStarred; @property(nonatomic, assign) BOOL isStarred;
// Designated initializer. // Designated initializer.
- (instancetype)initWithBrowser:(Browser*)browser; - (instancetype)initWithBrowser:(Browser*)browser
browserWindowController:(BrowserWindowController*)bwc;
// Creates and returns a touch bar for the browser window. // Creates and returns a touch bar for the browser window.
- (NSTouchBar*)makeTouchBar; - (NSTouchBar*)makeTouchBar;
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#import "chrome/browser/ui/cocoa/browser_window_touch_bar.h" #import "chrome/browser/ui/cocoa/browser_window_touch_bar.h"
#include <memory>
#include "base/mac/mac_util.h" #include "base/mac/mac_util.h"
#import "base/mac/scoped_nsobject.h" #import "base/mac/scoped_nsobject.h"
#import "base/mac/sdk_forward_declarations.h" #import "base/mac/sdk_forward_declarations.h"
...@@ -11,12 +13,16 @@ ...@@ -11,12 +13,16 @@
#include "chrome/app/chrome_command_ids.h" #include "chrome/app/chrome_command_ids.h"
#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/command_updater.h" #include "chrome/browser/command_updater.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_command_controller.h" #include "chrome/browser/ui/browser_command_controller.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "components/omnibox/browser/vector_icons.h" #include "components/omnibox/browser/vector_icons.h"
#include "components/prefs/pref_member.h"
#include "components/search_engines/util.h" #include "components/search_engines/util.h"
#include "components/toolbar/vector_icons.h" #include "components/toolbar/vector_icons.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
...@@ -36,6 +42,7 @@ const NSTouchBarCustomizationIdentifier kBrowserWindowTouchBarId = ...@@ -36,6 +42,7 @@ const NSTouchBarCustomizationIdentifier kBrowserWindowTouchBarId =
// Touch bar items identifiers. // Touch bar items identifiers.
const NSTouchBarItemIdentifier kBackForwardTouchId = @"BackForwardTouchId"; const NSTouchBarItemIdentifier kBackForwardTouchId = @"BackForwardTouchId";
const NSTouchBarItemIdentifier kReloadOrStopTouchId = @"ReloadOrStopTouchId"; const NSTouchBarItemIdentifier kReloadOrStopTouchId = @"ReloadOrStopTouchId";
const NSTouchBarItemIdentifier kHomeTouchId = @"HomeTouchId";
const NSTouchBarItemIdentifier kSearchTouchId = @"SearchTouchId"; const NSTouchBarItemIdentifier kSearchTouchId = @"SearchTouchId";
const NSTouchBarItemIdentifier kStarTouchId = @"StarTouchId"; const NSTouchBarItemIdentifier kStarTouchId = @"StarTouchId";
const NSTouchBarItemIdentifier kNewTabTouchId = @"NewTabTouchId"; const NSTouchBarItemIdentifier kNewTabTouchId = @"NewTabTouchId";
...@@ -52,7 +59,8 @@ const SkColor kTouchBarStarActiveColor = gfx::kGoogleBlue500; ...@@ -52,7 +59,8 @@ const SkColor kTouchBarStarActiveColor = gfx::kGoogleBlue500;
const int kTouchBarIconSize = 16; const int kTouchBarIconSize = 16;
// The width of the search button in the touch bar. // The width of the search button in the touch bar.
const int kTouchBarSearchButtonWidth = 280; const int kSearchBtnWidthWithHomeBtn = 205;
const int kSearchBtnWidthWithoutHomeBtn = 280;
// Creates an NSImage from the given VectorIcon. // Creates an NSImage from the given VectorIcon.
NSImage* CreateNSImageFromIcon(const gfx::VectorIcon& icon, NSImage* CreateNSImageFromIcon(const gfx::VectorIcon& icon,
...@@ -75,6 +83,23 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon, ...@@ -75,6 +83,23 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon,
return button; return button;
} }
// A class registered for C++ notifications. This is used to detect changes in
// the home button preferences and update the Touch Bar.
class HomePrefNotificationBridge {
public:
explicit HomePrefNotificationBridge(BrowserWindowController* bwc)
: bwc_(bwc) {}
~HomePrefNotificationBridge() {}
void UpdateTouchBar() { [bwc_ invalidateTouchBar]; }
private:
BrowserWindowController* bwc_; // Weak.
DISALLOW_COPY_AND_ASSIGN(HomePrefNotificationBridge);
};
} // namespace } // namespace
@interface BrowserWindowTouchBar () { @interface BrowserWindowTouchBar () {
...@@ -83,6 +108,14 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon, ...@@ -83,6 +108,14 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon,
// The browser associated with the touch bar. // The browser associated with the touch bar.
Browser* browser_; // Weak. Browser* browser_; // Weak.
BrowserWindowController* bwc_; // Weak, own us.
// Used to monitor the optional home button pref.
BooleanPrefMember showHomeButton_;
// Used to receive and handle notifications for the home button pref.
std::unique_ptr<HomePrefNotificationBridge> notificationBridge_;
} }
// Creates and return the back and forward segmented buttons. // Creates and return the back and forward segmented buttons.
...@@ -97,11 +130,20 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon, ...@@ -97,11 +130,20 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon,
@synthesize isPageLoading = isPageLoading_; @synthesize isPageLoading = isPageLoading_;
@synthesize isStarred = isStarred_; @synthesize isStarred = isStarred_;
- (instancetype)initWithBrowser:(Browser*)browser { - (instancetype)initWithBrowser:(Browser*)browser
browserWindowController:(BrowserWindowController*)bwc {
if ((self = [self init])) { if ((self = [self init])) {
DCHECK(browser); DCHECK(browser);
commandUpdater_ = browser->command_controller()->command_updater(); commandUpdater_ = browser->command_controller()->command_updater();
browser_ = browser; browser_ = browser;
bwc_ = bwc;
notificationBridge_.reset(new HomePrefNotificationBridge(bwc_));
PrefService* prefs = browser->profile()->GetPrefs();
showHomeButton_.Init(
prefs::kShowHomeButton, prefs,
base::Bind(&HomePrefNotificationBridge::UpdateTouchBar,
base::Unretained(notificationBridge_.get())));
} }
return self; return self;
...@@ -113,10 +155,19 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon, ...@@ -113,10 +155,19 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon,
base::scoped_nsobject<NSTouchBar> touchBar( base::scoped_nsobject<NSTouchBar> touchBar(
[[NSClassFromString(@"NSTouchBar") alloc] init]); [[NSClassFromString(@"NSTouchBar") alloc] init]);
NSArray* touchBarItemIdentifiers = @[ NSArray* touchBarItemIdentifiers;
if (showHomeButton_.GetValue()) {
touchBarItemIdentifiers = @[
kBackForwardTouchId, kReloadOrStopTouchId, kHomeTouchId, kSearchTouchId,
kStarTouchId, kNewTabTouchId
];
} else {
touchBarItemIdentifiers = @[
kBackForwardTouchId, kReloadOrStopTouchId, kSearchTouchId, kStarTouchId, kBackForwardTouchId, kReloadOrStopTouchId, kSearchTouchId, kStarTouchId,
kNewTabTouchId kNewTabTouchId
]; ];
}
[touchBar setCustomizationIdentifier:kBrowserWindowTouchBarId]; [touchBar setCustomizationIdentifier:kBrowserWindowTouchBarId];
[touchBar setDefaultItemIdentifiers:touchBarItemIdentifiers]; [touchBar setDefaultItemIdentifiers:touchBarItemIdentifiers];
[touchBar setCustomizationAllowedItemIdentifiers:touchBarItemIdentifiers]; [touchBar setCustomizationAllowedItemIdentifiers:touchBarItemIdentifiers];
...@@ -139,6 +190,9 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon, ...@@ -139,6 +190,9 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon,
isPageLoading_ ? kNavigateStopIcon : kNavigateReloadIcon; isPageLoading_ ? kNavigateStopIcon : kNavigateReloadIcon;
int command_id = isPageLoading_ ? IDC_STOP : IDC_RELOAD; int command_id = isPageLoading_ ? IDC_STOP : IDC_RELOAD;
[touchBarItem setView:CreateTouchBarButton(icon, self, command_id)]; [touchBarItem setView:CreateTouchBarButton(icon, self, command_id)];
} else if ([identifier isEqualTo:kHomeTouchId]) {
[touchBarItem
setView:CreateTouchBarButton(kNavigateHomeIcon, self, IDC_HOME)];
} else if ([identifier isEqualTo:kNewTabTouchId]) { } else if ([identifier isEqualTo:kNewTabTouchId]) {
[touchBarItem setView:CreateTouchBarButton(kNewTabMacTouchbarIcon, self, [touchBarItem setView:CreateTouchBarButton(kNewTabMacTouchbarIcon, self,
IDC_NEW_TAB)]; IDC_NEW_TAB)];
...@@ -206,9 +260,9 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon, ...@@ -206,9 +260,9 @@ NSButton* CreateTouchBarButton(const gfx::VectorIcon& icon,
action:@selector(executeCommand:)]; action:@selector(executeCommand:)];
searchButton.imageHugsTitle = YES; searchButton.imageHugsTitle = YES;
searchButton.tag = IDC_FOCUS_LOCATION; searchButton.tag = IDC_FOCUS_LOCATION;
[searchButton.widthAnchor int width = showHomeButton_.GetValue() ? kSearchBtnWidthWithHomeBtn
constraintEqualToConstant:kTouchBarSearchButtonWidth] : kSearchBtnWidthWithoutHomeBtn;
.active = YES; [searchButton.widthAnchor constraintEqualToConstant:width].active = YES;
return searchButton; return searchButton;
} }
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include "chrome/app/chrome_command_ids.h" #include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/ui/cocoa/browser_window_touch_bar.h" #import "chrome/browser/ui/cocoa/browser_window_touch_bar.h"
#include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h" #include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
class BrowserWindowTouchBarUnitTest : public CocoaProfileTest { class BrowserWindowTouchBarUnitTest : public CocoaProfileTest {
...@@ -16,8 +18,9 @@ class BrowserWindowTouchBarUnitTest : public CocoaProfileTest { ...@@ -16,8 +18,9 @@ class BrowserWindowTouchBarUnitTest : public CocoaProfileTest {
void SetUp() override { void SetUp() override {
CocoaProfileTest::SetUp(); CocoaProfileTest::SetUp();
ASSERT_TRUE(browser()); ASSERT_TRUE(browser());
browserWindowTouchBar_.reset( browserWindowTouchBar_.reset([[BrowserWindowTouchBar alloc]
[[BrowserWindowTouchBar alloc] initWithBrowser:browser()]); initWithBrowser:browser()
browserWindowController:nil]);
} }
void TearDown() override { CocoaProfileTest::TearDown(); } void TearDown() override { CocoaProfileTest::TearDown(); }
...@@ -29,10 +32,24 @@ TEST_F(BrowserWindowTouchBarUnitTest, TouchBarItems) { ...@@ -29,10 +32,24 @@ TEST_F(BrowserWindowTouchBarUnitTest, TouchBarItems) {
if (!base::mac::IsAtLeastOS10_12()) if (!base::mac::IsAtLeastOS10_12())
return; return;
NSTouchBar* touchBar = [browserWindowTouchBar_ makeTouchBar]; PrefService* prefs = profile()->GetPrefs();
NSArray* touchBarItemIds = [touchBar itemIdentifiers]; DCHECK(prefs);
prefs->SetBoolean(prefs::kShowHomeButton, true);
NSArray* touchBarItemIds =
[[browserWindowTouchBar_ makeTouchBar] itemIdentifiers];
EXPECT_TRUE([touchBarItemIds containsObject:@"BackForwardTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"ReloadOrStopTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"HomeTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"SearchTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"NewTabTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"StarTouchId"]);
prefs->SetBoolean(prefs::kShowHomeButton, false);
touchBarItemIds = [[browserWindowTouchBar_ makeTouchBar] itemIdentifiers];
EXPECT_TRUE([touchBarItemIds containsObject:@"BackForwardTouchId"]); EXPECT_TRUE([touchBarItemIds containsObject:@"BackForwardTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"ReloadOrStopTouchId"]); EXPECT_TRUE([touchBarItemIds containsObject:@"ReloadOrStopTouchId"]);
EXPECT_FALSE([touchBarItemIds containsObject:@"HomeTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"SearchTouchId"]); EXPECT_TRUE([touchBarItemIds containsObject:@"SearchTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"NewTabTouchId"]); EXPECT_TRUE([touchBarItemIds containsObject:@"NewTabTouchId"]);
EXPECT_TRUE([touchBarItemIds containsObject:@"StarTouchId"]); EXPECT_TRUE([touchBarItemIds containsObject:@"StarTouchId"]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment