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

Side by Side Diff: chrome/browser/ui/cocoa/browser_window_touch_bar.mm

Issue 2816743006: [Mac] Fullscreen Touch Bar Support (Closed)
Patch Set: Moved ScopedFeatureList Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "chrome/browser/ui/cocoa/browser_window_touch_bar.h" 5 #import "chrome/browser/ui/cocoa/browser_window_touch_bar.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/mac/foundation_util.h" 9 #include "base/mac/foundation_util.h"
10 #include "base/mac/mac_util.h" 10 #include "base/mac/mac_util.h"
11 #import "base/mac/scoped_nsobject.h" 11 #import "base/mac/scoped_nsobject.h"
12 #import "base/mac/sdk_forward_declarations.h" 12 #import "base/mac/sdk_forward_declarations.h"
13 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
14 #include "base/strings/sys_string_conversions.h" 14 #include "base/strings/sys_string_conversions.h"
15 #include "chrome/app/chrome_command_ids.h" 15 #include "chrome/app/chrome_command_ids.h"
16 #include "chrome/app/vector_icons/vector_icons.h" 16 #include "chrome/app/vector_icons/vector_icons.h"
17 #include "chrome/browser/command_updater.h" 17 #include "chrome/browser/command_updater.h"
18 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/search_engines/template_url_service_factory.h" 19 #include "chrome/browser/search_engines/template_url_service_factory.h"
20 #include "chrome/browser/ui/browser.h" 20 #include "chrome/browser/ui/browser.h"
21 #include "chrome/browser/ui/browser_command_controller.h" 21 #include "chrome/browser/ui/browser_command_controller.h"
22 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 22 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
23 #import "chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h"
24 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
25 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
26 #include "chrome/browser/ui/tabs/tab_strip_model.h"
23 #include "chrome/common/chrome_features.h" 27 #include "chrome/common/chrome_features.h"
24 #include "chrome/common/pref_names.h" 28 #include "chrome/common/pref_names.h"
25 #include "chrome/grit/generated_resources.h" 29 #include "chrome/grit/generated_resources.h"
26 #include "components/omnibox/browser/vector_icons.h" 30 #include "components/omnibox/browser/vector_icons.h"
27 #include "components/prefs/pref_member.h" 31 #include "components/prefs/pref_member.h"
28 #include "components/search_engines/util.h" 32 #include "components/search_engines/util.h"
29 #include "components/strings/grit/components_strings.h" 33 #include "components/strings/grit/components_strings.h"
30 #include "components/toolbar/vector_icons.h" 34 #include "components/toolbar/vector_icons.h"
35 #include "content/public/browser/web_contents.h"
31 #include "ui/base/l10n/l10n_util.h" 36 #include "ui/base/l10n/l10n_util.h"
32 #include "ui/base/l10n/l10n_util_mac.h" 37 #include "ui/base/l10n/l10n_util_mac.h"
33 #include "ui/gfx/color_palette.h" 38 #include "ui/gfx/color_palette.h"
34 #include "ui/gfx/color_utils.h" 39 #include "ui/gfx/color_utils.h"
35 #include "ui/gfx/image/image.h" 40 #include "ui/gfx/image/image.h"
36 #include "ui/gfx/image/image_skia_util_mac.h" 41 #include "ui/gfx/image/image_skia_util_mac.h"
37 #include "ui/gfx/paint_vector_icon.h" 42 #include "ui/gfx/paint_vector_icon.h"
38 #include "ui/vector_icons/vector_icons.h" 43 #include "ui/vector_icons/vector_icons.h"
39 44
40 namespace { 45 namespace {
(...skipping 15 matching lines...) Expand all
56 // The touch bar's identifier. 61 // The touch bar's identifier.
57 NSString* const kBrowserWindowTouchBarId = @"browser-window"; 62 NSString* const kBrowserWindowTouchBarId = @"browser-window";
58 63
59 // Touch bar items identifiers. 64 // Touch bar items identifiers.
60 NSString* const kBackForwardTouchId = @"BACK-FWD"; 65 NSString* const kBackForwardTouchId = @"BACK-FWD";
61 NSString* const kReloadOrStopTouchId = @"RELOAD-STOP"; 66 NSString* const kReloadOrStopTouchId = @"RELOAD-STOP";
62 NSString* const kHomeTouchId = @"HOME"; 67 NSString* const kHomeTouchId = @"HOME";
63 NSString* const kSearchTouchId = @"SEARCH"; 68 NSString* const kSearchTouchId = @"SEARCH";
64 NSString* const kStarTouchId = @"BOOKMARK"; 69 NSString* const kStarTouchId = @"BOOKMARK";
65 NSString* const kNewTabTouchId = @"NEW-TAB"; 70 NSString* const kNewTabTouchId = @"NEW-TAB";
71 NSString* const kExitFullscreenTouchId = @"EXIT-FULLSCREEN";
72 NSString* const kFullscreenOriginLabelTouchId = @"FULLSCREEN-ORIGIN-LABEL";
66 73
67 // The button indexes in the back and forward segment control. 74 // The button indexes in the back and forward segment control.
68 const int kBackSegmentIndex = 0; 75 const int kBackSegmentIndex = 0;
69 const int kForwardSegmentIndex = 1; 76 const int kForwardSegmentIndex = 1;
70 77
71 // Touch bar icon colors values. 78 // Touch bar icon colors values.
72 const SkColor kTouchBarDefaultIconColor = SK_ColorWHITE; 79 const SkColor kTouchBarDefaultIconColor = SK_ColorWHITE;
73 const SkColor kTouchBarStarActiveColor = gfx::kGoogleBlue500; 80 const SkColor kTouchBarStarActiveColor = gfx::kGoogleBlue500;
74 81
75 // The size of the touch bar icons. 82 // The size of the touch bar icons.
(...skipping 18 matching lines...) Expand all
94 SkColor color = kTouchBarDefaultIconColor) { 101 SkColor color = kTouchBarDefaultIconColor) {
95 NSButton* button = 102 NSButton* button =
96 [NSButton buttonWithImage:CreateNSImageFromIcon(icon, color) 103 [NSButton buttonWithImage:CreateNSImageFromIcon(icon, color)
97 target:owner 104 target:owner
98 action:@selector(executeCommand:)]; 105 action:@selector(executeCommand:)];
99 button.tag = command; 106 button.tag = command;
100 [button setAccessibilityLabel:l10n_util::GetNSString(tooltip_id)]; 107 [button setAccessibilityLabel:l10n_util::GetNSString(tooltip_id)];
101 return button; 108 return button;
102 } 109 }
103 110
104 NSString* GetTouchBarId(NSString* const touch_bar_id) { 111 NSString* GetTouchBarId() {
105 NSString* chrome_bundle_id = 112 NSString* chrome_bundle_id =
106 base::SysUTF8ToNSString(base::mac::BaseBundleID()); 113 base::SysUTF8ToNSString(base::mac::BaseBundleID());
107 return [NSString stringWithFormat:@"%@.%@", chrome_bundle_id, touch_bar_id];
108 }
109
110 NSString* GetTouchBarItemId(NSString* const touch_bar_id,
111 NSString* const item_id) {
112 return [NSString 114 return [NSString
113 stringWithFormat:@"%@-%@", GetTouchBarId(touch_bar_id), item_id]; 115 stringWithFormat:@"%@.%@", chrome_bundle_id, kBrowserWindowTouchBarId];
114 } 116 }
115 117
116 TouchBarAction TouchBarActionFromCommand(int command) { 118 TouchBarAction TouchBarActionFromCommand(int command) {
117 switch (command) { 119 switch (command) {
118 case IDC_BACK: 120 case IDC_BACK:
119 return TouchBarAction::BACK; 121 return TouchBarAction::BACK;
120 case IDC_FORWARD: 122 case IDC_FORWARD:
121 return TouchBarAction::FORWARD; 123 return TouchBarAction::FORWARD;
122 case IDC_STOP: 124 case IDC_STOP:
123 return TouchBarAction::STOP; 125 return TouchBarAction::STOP;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 186
185 // Creates and returns the search button. 187 // Creates and returns the search button.
186 - (NSView*)searchTouchBarView; 188 - (NSView*)searchTouchBarView;
187 @end 189 @end
188 190
189 @implementation BrowserWindowTouchBar 191 @implementation BrowserWindowTouchBar
190 192
191 @synthesize isPageLoading = isPageLoading_; 193 @synthesize isPageLoading = isPageLoading_;
192 @synthesize isStarred = isStarred_; 194 @synthesize isStarred = isStarred_;
193 195
196 + (NSString*)touchBarIdForItemId:(NSString*)id {
197 return [NSString stringWithFormat:@"%@-%@", GetTouchBarId(), id];
198 }
199
194 - (instancetype)initWithBrowser:(Browser*)browser 200 - (instancetype)initWithBrowser:(Browser*)browser
195 browserWindowController:(BrowserWindowController*)bwc { 201 browserWindowController:(BrowserWindowController*)bwc {
196 if ((self = [self init])) { 202 if ((self = [self init])) {
197 DCHECK(browser); 203 DCHECK(browser);
198 commandUpdater_ = browser->command_controller()->command_updater(); 204 commandUpdater_ = browser->command_controller()->command_updater();
199 browser_ = browser; 205 browser_ = browser;
200 bwc_ = bwc; 206 bwc_ = bwc;
201 207
202 notificationBridge_.reset(new HomePrefNotificationBridge(bwc_)); 208 notificationBridge_.reset(new HomePrefNotificationBridge(bwc_));
203 PrefService* prefs = browser->profile()->GetPrefs(); 209 PrefService* prefs = browser->profile()->GetPrefs();
204 showHomeButton_.Init( 210 showHomeButton_.Init(
205 prefs::kShowHomeButton, prefs, 211 prefs::kShowHomeButton, prefs,
206 base::Bind(&HomePrefNotificationBridge::UpdateTouchBar, 212 base::Bind(&HomePrefNotificationBridge::UpdateTouchBar,
207 base::Unretained(notificationBridge_.get()))); 213 base::Unretained(notificationBridge_.get())));
208 } 214 }
209 215
210 return self; 216 return self;
211 } 217 }
212 218
213 - (NSTouchBar*)makeTouchBar { 219 - (NSTouchBar*)makeTouchBar {
214 if (!base::FeatureList::IsEnabled(features::kBrowserTouchBar)) 220 if (!base::FeatureList::IsEnabled(features::kBrowserTouchBar))
215 return nil; 221 return nil;
216 222
217 base::scoped_nsobject<NSTouchBar> touchBar( 223 base::scoped_nsobject<NSTouchBar> touchBar(
218 [[NSClassFromString(@"NSTouchBar") alloc] init]); 224 [[NSClassFromString(@"NSTouchBar") alloc] init]);
225 [touchBar setCustomizationIdentifier:GetTouchBarId()];
226 [touchBar setDelegate:self];
227
228 // When in tab fullscreen, only the option to exit fullscreen should show up
229 // on the touch bar since the toolbar is hidden in that state.
230 if ([bwc_ isFullscreenForTabContentOrExtension]) {
231 if ([touchBar respondsToSelector:
232 @selector(setEscapeKeyReplacementItemIdentifier:)]) {
233 [touchBar setEscapeKeyReplacementItemIdentifier:
234 [BrowserWindowTouchBar
235 touchBarIdForItemId:kExitFullscreenTouchId]];
236 [touchBar setDefaultItemIdentifiers:@[
237 [BrowserWindowTouchBar
238 touchBarIdForItemId:kFullscreenOriginLabelTouchId]
239 ]];
240 }
241 return touchBar.autorelease();
242 }
243
219 NSMutableArray* customIdentifiers = [NSMutableArray arrayWithCapacity:7]; 244 NSMutableArray* customIdentifiers = [NSMutableArray arrayWithCapacity:7];
220 NSMutableArray* defaultIdentifiers = [NSMutableArray arrayWithCapacity:6]; 245 NSMutableArray* defaultIdentifiers = [NSMutableArray arrayWithCapacity:6];
221 246
222 NSArray* touchBarItems = @[ 247 NSArray* touchBarItems = @[
223 kBackForwardTouchId, kReloadOrStopTouchId, kHomeTouchId, kSearchTouchId, 248 kBackForwardTouchId, kReloadOrStopTouchId, kHomeTouchId, kSearchTouchId,
224 kStarTouchId, kNewTabTouchId 249 kStarTouchId, kNewTabTouchId
225 ]; 250 ];
226 251
227 for (NSString* item in touchBarItems) { 252 for (NSString* item in touchBarItems) {
228 NSString* itemIdentifier = 253 NSString* itemIdentifier = [BrowserWindowTouchBar touchBarIdForItemId:item];
229 GetTouchBarItemId(kBrowserWindowTouchBarId, item);
230 [customIdentifiers addObject:itemIdentifier]; 254 [customIdentifiers addObject:itemIdentifier];
231 255
232 // Don't add the home button if it's not shown in the toolbar. 256 // Don't add the home button if it's not shown in the toolbar.
233 if (showHomeButton_.GetValue() || ![item isEqualTo:kHomeTouchId]) 257 if (showHomeButton_.GetValue() || ![item isEqualTo:kHomeTouchId])
234 [defaultIdentifiers addObject:itemIdentifier]; 258 [defaultIdentifiers addObject:itemIdentifier];
235 } 259 }
236 260
237 [customIdentifiers addObject:NSTouchBarItemIdentifierFlexibleSpace]; 261 [customIdentifiers addObject:NSTouchBarItemIdentifierFlexibleSpace];
238 262
239 [touchBar setCustomizationIdentifier:GetTouchBarId(kBrowserWindowTouchBarId)];
240 [touchBar setDefaultItemIdentifiers:defaultIdentifiers]; 263 [touchBar setDefaultItemIdentifiers:defaultIdentifiers];
241 [touchBar setCustomizationAllowedItemIdentifiers:customIdentifiers]; 264 [touchBar setCustomizationAllowedItemIdentifiers:customIdentifiers];
242 [touchBar setDelegate:self];
243 265
244 return touchBar.autorelease(); 266 return touchBar.autorelease();
245 } 267 }
246 268
247 - (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar 269 - (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar
248 makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier { 270 makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier {
249 if (!touchBar) 271 if (!touchBar)
250 return nil; 272 return nil;
251 273
252 base::scoped_nsobject<NSCustomTouchBarItem> touchBarItem([[NSClassFromString( 274 base::scoped_nsobject<NSCustomTouchBarItem> touchBarItem([[NSClassFromString(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 int tooltipId = isStarred_ ? IDS_TOOLTIP_STARRED : IDS_TOOLTIP_STAR; 309 int tooltipId = isStarred_ ? IDS_TOOLTIP_STARRED : IDS_TOOLTIP_STAR;
288 [touchBarItem setView:CreateTouchBarButton(icon, self, IDC_BOOKMARK_PAGE, 310 [touchBarItem setView:CreateTouchBarButton(icon, self, IDC_BOOKMARK_PAGE,
289 tooltipId, iconColor)]; 311 tooltipId, iconColor)];
290 [touchBarItem 312 [touchBarItem
291 setCustomizationLabel:l10n_util::GetNSString( 313 setCustomizationLabel:l10n_util::GetNSString(
292 IDS_TOUCH_BAR_BOOKMARK_CUSTOMIZATION_LABEL)]; 314 IDS_TOUCH_BAR_BOOKMARK_CUSTOMIZATION_LABEL)];
293 } else if ([identifier hasSuffix:kSearchTouchId]) { 315 } else if ([identifier hasSuffix:kSearchTouchId]) {
294 [touchBarItem setView:[self searchTouchBarView]]; 316 [touchBarItem setView:[self searchTouchBarView]];
295 [touchBarItem setCustomizationLabel:l10n_util::GetNSString( 317 [touchBarItem setCustomizationLabel:l10n_util::GetNSString(
296 IDS_TOUCH_BAR_GOOGLE_SEARCH)]; 318 IDS_TOUCH_BAR_GOOGLE_SEARCH)];
319 } else if ([identifier hasSuffix:kExitFullscreenTouchId]) {
320 NSButton* button = [NSButton
321 buttonWithTitle:l10n_util::GetNSString(IDS_TOUCH_BAR_EXIT_FULLSCREEN)
322 target:self
323 action:@selector(exitFullscreenForTab:)];
324 [touchBarItem setView:button];
325 } else if ([identifier hasSuffix:kFullscreenOriginLabelTouchId]) {
326 content::WebContents* contents =
327 browser_->tab_strip_model()->GetActiveWebContents();
328 GURL originUrl = contents->GetLastCommittedURL();
329
330 base::string16 displayText = base::ASCIIToUTF16(originUrl.GetContent());
331 size_t hostLength = originUrl.host().length();
332 base::scoped_nsobject<NSMutableAttributedString> attributedString(
333 [[NSMutableAttributedString alloc]
334 initWithString:base::SysUTF16ToNSString(displayText)]);
335 [attributedString
336 addAttribute:NSForegroundColorAttributeName
337 value:OmniboxViewMac::BaseTextColor(true)
338 range:NSMakeRange(hostLength,
339 [attributedString length] - hostLength)];
340 [touchBarItem
341 setView:[NSTextField labelWithAttributedString:attributedString.get()]];
297 } 342 }
298 343
299 return touchBarItem.autorelease(); 344 return touchBarItem.autorelease();
300 } 345 }
301 346
302 - (NSView*)backOrForwardTouchBarView { 347 - (NSView*)backOrForwardTouchBarView {
303 NSArray* images = @[ 348 NSArray* images = @[
304 CreateNSImageFromIcon(ui::kBackArrowIcon), 349 CreateNSImageFromIcon(ui::kBackArrowIcon),
305 CreateNSImageFromIcon(ui::kForwardArrowIcon) 350 CreateNSImageFromIcon(ui::kForwardArrowIcon)
306 ]; 351 ];
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 } 419 }
375 420
376 - (void)backOrForward:(id)sender { 421 - (void)backOrForward:(id)sender {
377 NSSegmentedControl* control = sender; 422 NSSegmentedControl* control = sender;
378 int command = 423 int command =
379 [control selectedSegment] == kBackSegmentIndex ? IDC_BACK : IDC_FORWARD; 424 [control selectedSegment] == kBackSegmentIndex ? IDC_BACK : IDC_FORWARD;
380 LogTouchBarUMA(command); 425 LogTouchBarUMA(command);
381 commandUpdater_->ExecuteCommand(command); 426 commandUpdater_->ExecuteCommand(command);
382 } 427 }
383 428
429 - (void)exitFullscreenForTab:(id)sender {
430 browser_->exclusive_access_manager()
431 ->fullscreen_controller()
432 ->ExitExclusiveAccessIfNecessary();
433 }
434
384 - (void)executeCommand:(id)sender { 435 - (void)executeCommand:(id)sender {
385 int command = [sender tag]; 436 int command = [sender tag];
386 LogTouchBarUMA(command); 437 LogTouchBarUMA(command);
387 commandUpdater_->ExecuteCommand(command); 438 commandUpdater_->ExecuteCommand(command);
388 } 439 }
389 440
390 @end 441 @end
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/browser_window_touch_bar.h ('k') | chrome/browser/ui/cocoa/browser_window_touch_bar_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698