Commit 2f0772ee authored by Erik Chen's avatar Erik Chen Committed by Commit Bot

Remove PlatformAccelerator.

ui::Accelerator had a member platform_accelerator() which was only used on
macOS, and provided redundant information. This CL removes the member.

Change-Id: Ib3954a2c8ff7197606c946e207dd5d3bd75af66d
Bug: 846893, 702823
Reviewed-on: https://chromium-review.googlesource.com/1135644
Commit-Queue: Erik Chen <erikchen@chromium.org>
Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#575429}
parent 0131dcca
...@@ -226,17 +226,18 @@ bool GetDefaultMacAcceleratorForCommandId(int command_id, ...@@ -226,17 +226,18 @@ bool GetDefaultMacAcceleratorForCommandId(int command_id,
// See if it corresponds to one of the non-menu shortcuts. // See if it corresponds to one of the non-menu shortcuts.
for (const auto& shortcut : GetShortcutsNotPresentInMainMenu()) { for (const auto& shortcut : GetShortcutsNotPresentInMainMenu()) {
if (shortcut.chrome_command == command_id) { if (shortcut.chrome_command == command_id) {
NSUInteger cocoa_modifiers = 0; int modifiers = 0;
if (shortcut.command_key) if (shortcut.command_key)
cocoa_modifiers |= NSEventModifierFlagCommand; modifiers |= ui::EF_COMMAND_DOWN;
if (shortcut.shift_key) if (shortcut.shift_key)
cocoa_modifiers |= NSEventModifierFlagShift; modifiers |= ui::EF_SHIFT_DOWN;
if (shortcut.cntrl_key) if (shortcut.cntrl_key)
cocoa_modifiers |= NSEventModifierFlagControl; modifiers |= ui::EF_CONTROL_DOWN;
if (shortcut.opt_key) if (shortcut.opt_key)
cocoa_modifiers |= NSEventModifierFlagOption; modifiers |= ui::EF_ALT_DOWN;
*accelerator = AcceleratorsCocoa::AcceleratorFromKeyCode(
ui::KeyboardCodeFromKeyCode(shortcut.vkey_code), cocoa_modifiers); *accelerator = ui::Accelerator(
ui::KeyboardCodeFromKeyCode(shortcut.vkey_code), modifiers);
return true; return true;
} }
} }
......
...@@ -42,22 +42,10 @@ class AcceleratorsCocoa { ...@@ -42,22 +42,10 @@ class AcceleratorsCocoa {
// Returns NULL if there is no accelerator for the command. // Returns NULL if there is no accelerator for the command.
const ui::Accelerator* GetAcceleratorForCommand(int command_id); const ui::Accelerator* GetAcceleratorForCommand(int command_id);
// Searches the list of accelerators without a command_id for an accelerator
// that matches the given |key_equivalent| and |modifiers|.
const ui::Accelerator* GetAcceleratorForHotKey(NSString* key_equivalent,
NSUInteger modifiers) const;
// Returns the singleton instance. // Returns the singleton instance.
static AcceleratorsCocoa* GetInstance(); static AcceleratorsCocoa* GetInstance();
// TODO(erikchen): This shouldn't be necessary because ui::Accelerator has
// almost the same constructor and contains the same information. Remove this.
// https://crbug.com/846893.
// Create a cross platform accelerator given a cross platform |key_code| and
// the |cocoa_modifiers|.
static ui::Accelerator AcceleratorFromKeyCode(ui::KeyboardCode key_code,
NSUInteger cocoa_modifiers);
private: private:
friend struct base::DefaultSingletonTraits<AcceleratorsCocoa>; friend struct base::DefaultSingletonTraits<AcceleratorsCocoa>;
FRIEND_TEST_ALL_PREFIXES(AcceleratorsCocoaBrowserTest, FRIEND_TEST_ALL_PREFIXES(AcceleratorsCocoaBrowserTest,
...@@ -66,13 +54,10 @@ class AcceleratorsCocoa { ...@@ -66,13 +54,10 @@ class AcceleratorsCocoa {
AcceleratorsCocoa(); AcceleratorsCocoa();
~AcceleratorsCocoa(); ~AcceleratorsCocoa();
// A map from command_id to Accelerator. The accelerator is fully filled out,
// and its platform_accelerator is also fully filled out.
// Contains accelerators from both the app menu and the main menu. // Contains accelerators from both the app menu and the main menu.
AcceleratorMap accelerators_; AcceleratorMap accelerators_;
// A list of accelerators used in the main menu that have no associated // A list of accelerators used in the main menu that have no associated
// command_id. The accelerator is fully filled out, and its // command_id.
// platform_accelerator is also fully filled out.
AcceleratorVector accelerator_vector_; AcceleratorVector accelerator_vector_;
DISALLOW_COPY_AND_ASSIGN(AcceleratorsCocoa); DISALLOW_COPY_AND_ASSIGN(AcceleratorsCocoa);
......
...@@ -82,11 +82,20 @@ IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest, ...@@ -82,11 +82,20 @@ IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest,
// If the tag is zero, then the NSMenuItem must use a custom selector. // If the tag is zero, then the NSMenuItem must use a custom selector.
// Check that the accelerator is present as an un-mapped accelerator. // Check that the accelerator is present as an un-mapped accelerator.
if (command_id == 0) { if (command_id == 0) {
accelerator = keymap->GetAcceleratorForHotKey( bool found = false;
item.keyEquivalent, item.keyEquivalentModifierMask); for (const auto& entry : *keymap) {
NSString* keyEquivalent;
EXPECT_TRUE(accelerator); NSUInteger modifierMask;
return; GetKeyEquivalentAndModifierMaskFromAccelerator(
entry.second, &keyEquivalent, &modifierMask);
if ([item.keyEquivalent isEqualToString:keyEquivalent] &&
item.keyEquivalentModifierMask == modifierMask) {
found = true;
break;
}
}
EXPECT_TRUE(found);
continue;
} }
// If the tag isn't zero, then it must correspond to an IDC_* command. // If the tag isn't zero, then it must correspond to an IDC_* command.
...@@ -96,23 +105,22 @@ IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest, ...@@ -96,23 +105,22 @@ IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest,
continue; continue;
// Get the Cocoa key_equivalent associated with the accelerator. // Get the Cocoa key_equivalent associated with the accelerator.
const ui::PlatformAcceleratorCocoa* platform_accelerator = NSString* keyEquivalent;
static_cast<const ui::PlatformAcceleratorCocoa*>( NSUInteger modifierMask;
accelerator->platform_accelerator()); GetKeyEquivalentAndModifierMaskFromAccelerator(*accelerator, &keyEquivalent,
NSString* key_equivalent = platform_accelerator->characters(); &modifierMask);
// Check that the menu item's keyEquivalent matches the one from the // Check that the menu item's keyEquivalent matches the one from the
// Cocoa accelerator map. // Cocoa accelerator map.
EXPECT_NSEQ(key_equivalent, item.keyEquivalent); EXPECT_NSEQ(keyEquivalent, item.keyEquivalent);
// Check that the menu item's modifier mask matches the one stored in the // Check that the menu item's modifier mask matches the one stored in the
// accelerator. A mask that include NSShiftKeyMask may not include the // accelerator. A mask that include NSShiftKeyMask may not include the
// relevant bit (the information is reflected in the keyEquivalent of the // relevant bit (the information is reflected in the keyEquivalent of the
// NSMenuItem). // NSMenuItem).
NSUInteger mask = platform_accelerator->modifier_mask();
BOOL maskEqual = BOOL maskEqual =
(mask == item.keyEquivalentModifierMask) || (modifierMask == item.keyEquivalentModifierMask) ||
((mask & (~NSShiftKeyMask)) == item.keyEquivalentModifierMask); ((modifierMask & (~NSShiftKeyMask)) == item.keyEquivalentModifierMask);
EXPECT_TRUE(maskEqual); EXPECT_TRUE(maskEqual);
} }
} }
...@@ -134,15 +142,14 @@ IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest, ...@@ -134,15 +142,14 @@ IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest,
keymap->accelerators_.begin(); keymap->accelerators_.begin();
it != keymap->accelerators_.end(); it != keymap->accelerators_.end();
++it) { ++it) {
const ui::PlatformAcceleratorCocoa* platform_accelerator = NSString* keyEquivalent;
static_cast<const ui::PlatformAcceleratorCocoa*>( NSUInteger modifierMask;
it->second.platform_accelerator()); GetKeyEquivalentAndModifierMaskFromAccelerator(it->second, &keyEquivalent,
&modifierMask);
// Check that there exists a corresponding NSMenuItem. // Check that there exists a corresponding NSMenuItem.
NSMenuItem* item = NSMenuItem* item =
MenuContainsAccelerator([NSApp mainMenu], MenuContainsAccelerator([NSApp mainMenu], keyEquivalent, modifierMask);
platform_accelerator->characters(),
platform_accelerator->modifier_mask());
EXPECT_TRUE(item); EXPECT_TRUE(item);
// If the menu uses a commandDispatch:, the tag must match the command id! // If the menu uses a commandDispatch:, the tag must match the command id!
......
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#include "base/memory/singleton.h"
#include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/ui/cocoa/accelerators_cocoa.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
#include "ui/base/accelerators/platform_accelerator_cocoa.h"
TEST(AcceleratorsCocoaTest, GetAccelerator) {
AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance();
const ui::Accelerator* accelerator =
keymap->GetAcceleratorForCommand(IDC_COPY);
ASSERT_TRUE(accelerator);
ASSERT_TRUE(accelerator->platform_accelerator());
const ui::PlatformAcceleratorCocoa* platform_accelerator =
static_cast<const ui::PlatformAcceleratorCocoa*>(
accelerator->platform_accelerator());
EXPECT_NSEQ(@"c", platform_accelerator->characters());
EXPECT_EQ(NSCommandKeyMask, platform_accelerator->modifier_mask());
}
TEST(AcceleratorsCocoaTest, GetNullAccelerator) {
AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance();
const ui::Accelerator* accelerator =
keymap->GetAcceleratorForCommand(314159265);
EXPECT_FALSE(accelerator);
}
...@@ -35,6 +35,10 @@ class ToolbarActionsBarObserverHelper; ...@@ -35,6 +35,10 @@ class ToolbarActionsBarObserverHelper;
class ZoomLevelObserver; class ZoomLevelObserver;
} // namespace AppMenuControllerInternal } // namespace AppMenuControllerInternal
namespace ui {
class AcceleratorProvider;
} // namespace ui
// The App menu has a creative layout, with buttons in menu items. There is a // The App menu has a creative layout, with buttons in menu items. There is a
// cross-platform model for this special menu, but on the Mac it's easier to // cross-platform model for this special menu, but on the Mac it's easier to
// get spacing and alignment precisely right using a NIB. To do that, we // get spacing and alignment precisely right using a NIB. To do that, we
...@@ -109,6 +113,8 @@ class ZoomLevelObserver; ...@@ -109,6 +113,8 @@ class ZoomLevelObserver;
// Retuns the weak reference to the BrowserActionsController. // Retuns the weak reference to the BrowserActionsController.
- (BrowserActionsController*)browserActionsController; - (BrowserActionsController*)browserActionsController;
- (ui::AcceleratorProvider*)acceleratorProvider;
@end @end
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
......
...@@ -492,6 +492,10 @@ class ToolbarActionsBarObserverHelper : public ToolbarActionsBarObserver { ...@@ -492,6 +492,10 @@ class ToolbarActionsBarObserverHelper : public ToolbarActionsBarObserver {
return browserActionsController_.get(); return browserActionsController_.get();
} }
- (ui::AcceleratorProvider*)acceleratorProvider {
return acceleratorDelegate_.get();
}
- (void)createModel { - (void)createModel {
DCHECK(browser_); DCHECK(browser_);
recentTabsMenuModelDelegate_.reset(); recentTabsMenuModelDelegate_.reset();
......
...@@ -212,7 +212,8 @@ TEST_F(AppMenuControllerTest, RecentTabsFavIcon) { ...@@ -212,7 +212,8 @@ TEST_F(AppMenuControllerTest, RecentTabsFavIcon) {
recent_tabs_builder.AddTab(0, 0); recent_tabs_builder.AddTab(0, 0);
RegisterRecentTabs(&recent_tabs_builder); RegisterRecentTabs(&recent_tabs_builder);
RecentTabsSubMenuModel recent_tabs_sub_menu_model(nullptr, browser()); RecentTabsSubMenuModel recent_tabs_sub_menu_model(
[controller_ acceleratorProvider], browser());
fake_model_->AddSubMenuWithStringId( fake_model_->AddSubMenuWithStringId(
IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU, IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU,
&recent_tabs_sub_menu_model); &recent_tabs_sub_menu_model);
...@@ -254,7 +255,8 @@ TEST_F(AppMenuControllerTest, RecentTabsElideTitle) { ...@@ -254,7 +255,8 @@ TEST_F(AppMenuControllerTest, RecentTabsElideTitle) {
base::Time::Now() - base::TimeDelta::FromMinutes(10), tab2_long_title); base::Time::Now() - base::TimeDelta::FromMinutes(10), tab2_long_title);
RegisterRecentTabs(&recent_tabs_builder); RegisterRecentTabs(&recent_tabs_builder);
RecentTabsSubMenuModel recent_tabs_sub_menu_model(nullptr, browser()); RecentTabsSubMenuModel recent_tabs_sub_menu_model(
[controller_ acceleratorProvider], browser());
fake_model_->AddSubMenuWithStringId( fake_model_->AddSubMenuWithStringId(
IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU, IDC_RECENT_TABS_MENU, IDS_RECENT_TABS_MENU,
&recent_tabs_sub_menu_model); &recent_tabs_sub_menu_model);
......
...@@ -9,10 +9,6 @@ ...@@ -9,10 +9,6 @@
@class ConfirmQuitFrameView; @class ConfirmQuitFrameView;
namespace ui {
class PlatformAcceleratorCocoa;
}
// The ConfirmQuitPanelController manages the black HUD window that tells users // The ConfirmQuitPanelController manages the black HUD window that tells users
// to "Hold Cmd+Q to Quit". // to "Hold Cmd+Q to Quit".
@interface ConfirmQuitPanelController : NSWindowController<NSWindowDelegate> { @interface ConfirmQuitPanelController : NSWindowController<NSWindowDelegate> {
...@@ -46,8 +42,7 @@ class PlatformAcceleratorCocoa; ...@@ -46,8 +42,7 @@ class PlatformAcceleratorCocoa;
@end @end
@interface ConfirmQuitPanelController (UnitTesting) @interface ConfirmQuitPanelController (UnitTesting)
+ (NSString*)keyCombinationForAccelerator: + (NSString*)keyCombinationForAccelerator:(NSMenuItem*)item;
(const ui::PlatformAcceleratorCocoa&)item;
@end @end
#endif // CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ #endif // CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_
...@@ -152,7 +152,7 @@ const NSTimeInterval kTimeDeltaFuzzFactor = 1.0; ...@@ -152,7 +152,7 @@ const NSTimeInterval kTimeDeltaFuzzFactor = 1.0;
- (void)hideAllWindowsForApplication:(NSApplication*)app - (void)hideAllWindowsForApplication:(NSApplication*)app
withDuration:(NSTimeInterval)duration; withDuration:(NSTimeInterval)duration;
// Returns the Accelerator for the Quit menu item. // Returns the Accelerator for the Quit menu item.
+ (std::unique_ptr<ui::PlatformAcceleratorCocoa>)quitAccelerator; + (NSMenuItem*)quitAccelerator;
@end @end
ConfirmQuitPanelController* g_confirmQuitPanelController = nil; ConfirmQuitPanelController* g_confirmQuitPanelController = nil;
...@@ -200,12 +200,11 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; ...@@ -200,12 +200,11 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil;
+ (BOOL)eventTriggersFeature:(NSEvent*)event { + (BOOL)eventTriggersFeature:(NSEvent*)event {
if ([event type] != NSKeyDown) if ([event type] != NSKeyDown)
return NO; return NO;
ui::PlatformAcceleratorCocoa eventAccelerator( NSMenuItem* item = [self quitAccelerator];
[event charactersIgnoringModifiers], return item.keyEquivalentModifierMask ==
[event modifierFlags] & NSDeviceIndependentModifierFlagsMask); ([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) &&
std::unique_ptr<ui::PlatformAcceleratorCocoa> quitAccelerator( [item.keyEquivalent
[self quitAccelerator]); isEqualToString:[event charactersIgnoringModifiers]];
return quitAccelerator->Equals(eventAccelerator);
} }
- (NSApplicationTerminateReply)runModalLoopForApplication:(NSApplication*)app { - (NSApplicationTerminateReply)runModalLoopForApplication:(NSApplication*)app {
...@@ -348,9 +347,7 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; ...@@ -348,9 +347,7 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil;
// key combination for quit. It then gets the modifiers and builds a string // key combination for quit. It then gets the modifiers and builds a string
// to display them. // to display them.
+ (NSString*)keyCommandString { + (NSString*)keyCommandString {
std::unique_ptr<ui::PlatformAcceleratorCocoa> accelerator( return [[self class] keyCombinationForAccelerator:[self quitAccelerator]];
[self quitAccelerator]);
return [[self class] keyCombinationForAccelerator:*accelerator];
} }
// Runs a nested loop that pumps the event queue until the next KeyUp event. // Runs a nested loop that pumps the event queue until the next KeyUp event.
...@@ -374,27 +371,28 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; ...@@ -374,27 +371,28 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil;
// This looks at the Main Menu and determines what the user has set as the // This looks at the Main Menu and determines what the user has set as the
// key combination for quit. It then gets the modifiers and builds an object // key combination for quit. It then gets the modifiers and builds an object
// to hold the data. // to hold the data.
+ (std::unique_ptr<ui::PlatformAcceleratorCocoa>)quitAccelerator { + (NSMenuItem*)quitAccelerator {
NSMenu* mainMenu = [NSApp mainMenu]; NSMenu* mainMenu = [NSApp mainMenu];
// Get the application menu (i.e. Chromium). // Get the application menu (i.e. Chromium).
NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu]; NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu];
for (NSMenuItem* item in [appMenu itemArray]) { for (NSMenuItem* item in [appMenu itemArray]) {
// Find the Quit item. // Find the Quit item.
if ([item action] == @selector(terminate:)) { if ([item action] == @selector(terminate:)) {
return std::unique_ptr<ui::PlatformAcceleratorCocoa>( return item;
new ui::PlatformAcceleratorCocoa([item keyEquivalent],
[item keyEquivalentModifierMask]));
} }
} }
// Default to Cmd+Q. // Default to Cmd+Q.
return std::unique_ptr<ui::PlatformAcceleratorCocoa>( NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:@""
new ui::PlatformAcceleratorCocoa(@"q", NSCommandKeyMask)); action:@selector(terminate:)
keyEquivalent:@"q"] autorelease];
item.keyEquivalentModifierMask = NSCommandKeyMask;
return item;
} }
+ (NSString*)keyCombinationForAccelerator: + (NSString*)keyCombinationForAccelerator:(NSMenuItem*)item {
(const ui::PlatformAcceleratorCocoa&)item {
NSMutableString* string = [NSMutableString string]; NSMutableString* string = [NSMutableString string];
NSUInteger modifiers = item.modifier_mask(); NSUInteger modifiers = item.keyEquivalentModifierMask;
if (modifiers & NSCommandKeyMask) if (modifiers & NSCommandKeyMask)
[string appendString:@"\u2318"]; [string appendString:@"\u2318"];
...@@ -405,7 +403,7 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; ...@@ -405,7 +403,7 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil;
if (modifiers & NSShiftKeyMask) if (modifiers & NSShiftKeyMask)
[string appendString:@"\u21E7"]; [string appendString:@"\u21E7"];
[string appendString:[item.characters() uppercaseString]]; [string appendString:[item.keyEquivalent uppercaseString]];
return string; return string;
} }
......
...@@ -43,37 +43,45 @@ TEST_F(ConfirmQuitPanelControllerTest, ShowAndDismiss) { ...@@ -43,37 +43,45 @@ TEST_F(ConfirmQuitPanelControllerTest, ShowAndDismiss) {
TEST_F(ConfirmQuitPanelControllerTest, KeyCombinationForAccelerator) { TEST_F(ConfirmQuitPanelControllerTest, KeyCombinationForAccelerator) {
Class controller = [ConfirmQuitPanelController class]; Class controller = [ConfirmQuitPanelController class];
ui::PlatformAcceleratorCocoa item(@"q", NSCommandKeyMask); NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:@""
action:@selector(unused)
keyEquivalent:@""] autorelease];
item.keyEquivalent = @"q";
item.keyEquivalentModifierMask = NSCommandKeyMask;
EXPECT_NSEQ(TestString(@"{Cmd}Q"), EXPECT_NSEQ(TestString(@"{Cmd}Q"),
[controller keyCombinationForAccelerator:item]); [controller keyCombinationForAccelerator:item]);
ui::PlatformAcceleratorCocoa item2(@"c", NSCommandKeyMask | NSShiftKeyMask); item.keyEquivalent = @"c";
item.keyEquivalentModifierMask = NSCommandKeyMask | NSShiftKeyMask;
EXPECT_NSEQ(TestString(@"{Cmd}{Shift}C"), EXPECT_NSEQ(TestString(@"{Cmd}{Shift}C"),
[controller keyCombinationForAccelerator:item2]); [controller keyCombinationForAccelerator:item]);
ui::PlatformAcceleratorCocoa item3(@"h", item.keyEquivalent = @"h";
NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask); item.keyEquivalentModifierMask =
NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask;
EXPECT_NSEQ(TestString(@"{Cmd}{Opt}{Shift}H"), EXPECT_NSEQ(TestString(@"{Cmd}{Opt}{Shift}H"),
[controller keyCombinationForAccelerator:item3]); [controller keyCombinationForAccelerator:item]);
ui::PlatformAcceleratorCocoa item4(@"r", item.keyEquivalent = @"r";
NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask | item.keyEquivalentModifierMask =
NSControlKeyMask); NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask | NSControlKeyMask;
EXPECT_NSEQ(TestString(@"{Cmd}{Ctrl}{Opt}{Shift}R"), EXPECT_NSEQ(TestString(@"{Cmd}{Ctrl}{Opt}{Shift}R"),
[controller keyCombinationForAccelerator:item4]); [controller keyCombinationForAccelerator:item]);
ui::PlatformAcceleratorCocoa item5(@"o", NSControlKeyMask); item.keyEquivalent = @"o";
item.keyEquivalentModifierMask = NSControlKeyMask;
EXPECT_NSEQ(TestString(@"{Ctrl}O"), EXPECT_NSEQ(TestString(@"{Ctrl}O"),
[controller keyCombinationForAccelerator:item5]); [controller keyCombinationForAccelerator:item]);
ui::PlatformAcceleratorCocoa item6(@"m", NSShiftKeyMask | NSControlKeyMask); item.keyEquivalent = @"m";
item.keyEquivalentModifierMask = NSShiftKeyMask | NSControlKeyMask;
EXPECT_NSEQ(TestString(@"{Ctrl}{Shift}M"), EXPECT_NSEQ(TestString(@"{Ctrl}{Shift}M"),
[controller keyCombinationForAccelerator:item6]); [controller keyCombinationForAccelerator:item]);
ui::PlatformAcceleratorCocoa item7( item.keyEquivalent = @"e";
@"e", NSCommandKeyMask | NSAlternateKeyMask); item.keyEquivalentModifierMask = NSCommandKeyMask | NSAlternateKeyMask;
EXPECT_NSEQ(TestString(@"{Cmd}{Opt}E"), EXPECT_NSEQ(TestString(@"{Cmd}{Opt}E"),
[controller keyCombinationForAccelerator:item7]); [controller keyCombinationForAccelerator:item]);
} }
} // namespace } // namespace
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "chrome/app/chrome_command_ids.h" #include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/global_keyboard_shortcuts_mac.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/browser_window.h"
...@@ -272,13 +273,15 @@ NSString* const kRemindersSharingServiceName = ...@@ -272,13 +273,15 @@ NSString* const kRemindersSharingServiceName =
} }
- (NSString*)keyEquivalentForMail { - (NSString*)keyEquivalentForMail {
AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance(); ui::Accelerator accelerator;
const ui::Accelerator* accelerator = bool found = GetDefaultMacAcceleratorForCommandId(IDC_EMAIL_PAGE_LOCATION,
keymap->GetAcceleratorForCommand(IDC_EMAIL_PAGE_LOCATION); &accelerator);
const ui::PlatformAcceleratorCocoa* platform = DCHECK(found);
static_cast<const ui::PlatformAcceleratorCocoa*>( NSString* key_equivalent;
accelerator->platform_accelerator()); NSUInteger modifier_mask;
return platform->characters(); GetKeyEquivalentAndModifierMaskFromAccelerator(accelerator, &key_equivalent,
&modifier_mask);
return key_equivalent;
} }
@end @end
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#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/global_keyboard_shortcuts_mac.h"
#import "chrome/browser/ui/cocoa/accelerators_cocoa.h" #import "chrome/browser/ui/cocoa/accelerators_cocoa.h"
#import "chrome/browser/ui/cocoa/themed_window.h" #import "chrome/browser/ui/cocoa/themed_window.h"
#import "chrome/browser/ui/cocoa/view_id_util.h" #import "chrome/browser/ui/cocoa/view_id_util.h"
...@@ -223,7 +224,6 @@ const int kReloadMenuCommands[] = { ...@@ -223,7 +224,6 @@ const int kReloadMenuCommands[] = {
[menu_ addItemWithTitle:@"" [menu_ addItemWithTitle:@""
action:nil action:nil
keyEquivalent:@""]; keyEquivalent:@""];
AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance();
for (size_t i = 0; i < arraysize(kReloadMenuItems); ++i) { for (size_t i = 0; i < arraysize(kReloadMenuItems); ++i) {
NSString* title = l10n_util::GetNSStringWithFixup(kReloadMenuItems[i]); NSString* title = l10n_util::GetNSStringWithFixup(kReloadMenuItems[i]);
base::scoped_nsobject<NSMenuItem> item( base::scoped_nsobject<NSMenuItem> item(
...@@ -231,16 +231,16 @@ const int kReloadMenuCommands[] = { ...@@ -231,16 +231,16 @@ const int kReloadMenuCommands[] = {
action:@selector(executeMenuItem:) action:@selector(executeMenuItem:)
keyEquivalent:@""]); keyEquivalent:@""]);
const ui::Accelerator* accelerator = ui::Accelerator accelerator;
keymap->GetAcceleratorForCommand(kReloadMenuCommands[i]); bool found = GetDefaultMacAcceleratorForCommandId(kReloadMenuCommands[i],
if (accelerator) { &accelerator);
const ui::PlatformAcceleratorCocoa* platform = if (found) {
static_cast<const ui::PlatformAcceleratorCocoa*>( NSString* key_equivalent;
accelerator->platform_accelerator()); NSUInteger modifier_mask;
if (platform) { GetKeyEquivalentAndModifierMaskFromAccelerator(
[item setKeyEquivalent:platform->characters()]; accelerator, &key_equivalent, &modifier_mask);
[item setKeyEquivalentModifierMask:platform->modifier_mask()]; [item setKeyEquivalent:key_equivalent];
} [item setKeyEquivalentModifierMask:modifier_mask];
} }
[item setTag:kReloadMenuCommands[i]]; [item setTag:kReloadMenuCommands[i]];
......
...@@ -4049,7 +4049,6 @@ test("unit_tests") { ...@@ -4049,7 +4049,6 @@ test("unit_tests") {
# the place this variable is used below. # the place this variable is used below.
if (true) { if (true) {
cocoa_test_sources = [ cocoa_test_sources = [
"../browser/ui/cocoa/accelerators_cocoa_unittest.mm",
"../browser/ui/cocoa/animatable_image_unittest.mm", "../browser/ui/cocoa/animatable_image_unittest.mm",
"../browser/ui/cocoa/animatable_view_unittest.mm", "../browser/ui/cocoa/animatable_view_unittest.mm",
"../browser/ui/cocoa/app_menu/app_menu_button_cell_unittest.mm", "../browser/ui/cocoa/app_menu/app_menu_button_cell_unittest.mm",
......
...@@ -69,7 +69,6 @@ component("base") { ...@@ -69,7 +69,6 @@ component("base") {
"accelerators/media_keys_listener.h", "accelerators/media_keys_listener.h",
"accelerators/menu_label_accelerator_util_linux.cc", "accelerators/menu_label_accelerator_util_linux.cc",
"accelerators/menu_label_accelerator_util_linux.h", "accelerators/menu_label_accelerator_util_linux.h",
"accelerators/platform_accelerator.h",
"accelerators/platform_accelerator_cocoa.h", "accelerators/platform_accelerator_cocoa.h",
"accelerators/platform_accelerator_cocoa.mm", "accelerators/platform_accelerator_cocoa.mm",
"class_property.cc", "class_property.cc",
......
...@@ -64,8 +64,6 @@ Accelerator::Accelerator(const Accelerator& accelerator) { ...@@ -64,8 +64,6 @@ Accelerator::Accelerator(const Accelerator& accelerator) {
modifiers_ = accelerator.modifiers_; modifiers_ = accelerator.modifiers_;
time_stamp_ = accelerator.time_stamp_; time_stamp_ = accelerator.time_stamp_;
interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_; interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_;
if (accelerator.platform_accelerator_)
platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy();
} }
Accelerator::~Accelerator() { Accelerator::~Accelerator() {
...@@ -90,10 +88,6 @@ Accelerator& Accelerator::operator=(const Accelerator& accelerator) { ...@@ -90,10 +88,6 @@ Accelerator& Accelerator::operator=(const Accelerator& accelerator) {
modifiers_ = accelerator.modifiers_; modifiers_ = accelerator.modifiers_;
time_stamp_ = accelerator.time_stamp_; time_stamp_ = accelerator.time_stamp_;
interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_; interrupted_by_mouse_event_ = accelerator.interrupted_by_mouse_event_;
if (accelerator.platform_accelerator_)
platform_accelerator_ = accelerator.platform_accelerator_->CreateCopy();
else
platform_accelerator_.reset();
} }
return *this; return *this;
} }
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "ui/base/accelerators/platform_accelerator.h"
#include "ui/base/ui_base_export.h" #include "ui/base/ui_base_export.h"
#include "ui/events/event_constants.h" #include "ui/events/event_constants.h"
#include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/keycodes/keyboard_codes.h"
...@@ -25,11 +24,7 @@ ...@@ -25,11 +24,7 @@
namespace ui { namespace ui {
class KeyEvent; class KeyEvent;
class PlatformAccelerator;
// This is a cross-platform class for accelerator keys used in menus.
// |platform_accelerator| should be used to store platform specific data.
//
// While |modifiers| may include EF_IS_REPEAT, EF_IS_REPEAT is not considered // While |modifiers| may include EF_IS_REPEAT, EF_IS_REPEAT is not considered
// an intrinsic part of an Accelerator. This is done so that an accelerator // an intrinsic part of an Accelerator. This is done so that an accelerator
// for a particular KeyEvent matches an accelerator with or without the repeat // for a particular KeyEvent matches an accelerator with or without the repeat
...@@ -87,15 +82,6 @@ class UI_BASE_EXPORT Accelerator { ...@@ -87,15 +82,6 @@ class UI_BASE_EXPORT Accelerator {
// Returns a string with the localized shortcut if any. // Returns a string with the localized shortcut if any.
base::string16 GetShortcutText() const; base::string16 GetShortcutText() const;
void set_platform_accelerator(std::unique_ptr<PlatformAccelerator> p) {
platform_accelerator_ = std::move(p);
}
// This class keeps ownership of the returned object.
const PlatformAccelerator* platform_accelerator() const {
return platform_accelerator_.get();
}
void set_interrupted_by_mouse_event(bool interrupted_by_mouse_event) { void set_interrupted_by_mouse_event(bool interrupted_by_mouse_event) {
interrupted_by_mouse_event_ = interrupted_by_mouse_event; interrupted_by_mouse_event_ = interrupted_by_mouse_event;
} }
...@@ -124,11 +110,6 @@ class UI_BASE_EXPORT Accelerator { ...@@ -124,11 +110,6 @@ class UI_BASE_EXPORT Accelerator {
// The |time_stamp_| of the KeyEvent. // The |time_stamp_| of the KeyEvent.
base::TimeTicks time_stamp_; base::TimeTicks time_stamp_;
// Stores platform specific data. May be NULL.
// TODO: this is only used in Mac code and should be removed from here.
// http://crbug.com/702823.
std::unique_ptr<PlatformAccelerator> platform_accelerator_;
// Whether the accelerator is interrupted by a mouse press/release. This is // Whether the accelerator is interrupted by a mouse press/release. This is
// optionally used by AcceleratorController. Even this is set to true, the // optionally used by AcceleratorController. Even this is set to true, the
// accelerator may still be handled successfully. (Currently only // accelerator may still be handled successfully. (Currently only
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_ACCELERATORS_PLATFORM_ACCELERATOR_H_
#define UI_BASE_ACCELERATORS_PLATFORM_ACCELERATOR_H_
#include <memory>
#include "ui/base/ui_base_export.h"
namespace ui {
// Abstract base class for platform specific accelerator keys.
class UI_BASE_EXPORT PlatformAccelerator {
public:
virtual ~PlatformAccelerator() {}
virtual std::unique_ptr<PlatformAccelerator> CreateCopy() const = 0;
virtual bool Equals(const PlatformAccelerator& rhs) const = 0;
};
} // namespace ui
#endif // UI_BASE_ACCELERATORS_PLATFORM_ACCELERATOR_H_
...@@ -7,36 +7,22 @@ ...@@ -7,36 +7,22 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#include "base/mac/scoped_nsobject.h" #include "ui/base/accelerators/accelerator.h"
#include "base/macros.h" #include "ui/base/ui_base_export.h"
#include "ui/base/accelerators/platform_accelerator.h"
namespace ui { namespace ui {
// This is a Mac specific class for specifing accelerator keys. // Returns |true| if there is an associated NSMenuItem, and populates output
class UI_BASE_EXPORT PlatformAcceleratorCocoa : public PlatformAccelerator { // variables |key_equivalent| and |modifier_mask|.
public: //
PlatformAcceleratorCocoa(); // On macOS, accelerators are primarily handled by the main menu. Most
PlatformAcceleratorCocoa(NSString* key_code, NSUInteger modifier_mask); // accelerators have an associated NSMenuItem. Each NSMenuItem is specified with
~PlatformAcceleratorCocoa() override; // a |key_equivalent| and |modifier_mask|. This function takes a ui::Accelerator
// and returns the associated |key_equivalent| and |modifier_mask|.
// PlatformAccelerator: UI_BASE_EXPORT void GetKeyEquivalentAndModifierMaskFromAccelerator(
std::unique_ptr<PlatformAccelerator> CreateCopy() const override; const ui::Accelerator& accelerator,
bool Equals(const PlatformAccelerator& rhs) const override; NSString** key_equivalent,
NSUInteger* modifier_mask);
// The keyEquivalent of the NSMenuItem associated with the accelerator.
NSString* characters() const { return characters_.get(); }
// The keyEquivalentModifierMask of the NSMenuItem associated with the
// accelerator.
NSUInteger modifier_mask() const { return modifier_mask_; }
private:
// String of characters for the key equivalent.
base::scoped_nsobject<NSString> characters_;
NSUInteger modifier_mask_;
DISALLOW_COPY_AND_ASSIGN(PlatformAcceleratorCocoa);
};
} // namespace ui } // namespace ui
......
...@@ -4,37 +4,32 @@ ...@@ -4,37 +4,32 @@
#import "ui/base/accelerators/platform_accelerator_cocoa.h" #import "ui/base/accelerators/platform_accelerator_cocoa.h"
#include <memory> #import <AppKit/AppKit.h>
#include "base/memory/ptr_util.h" #include "ui/events/keycodes/keyboard_code_conversion_mac.h"
namespace ui { namespace ui {
PlatformAcceleratorCocoa::PlatformAcceleratorCocoa() : modifier_mask_(0) { void GetKeyEquivalentAndModifierMaskFromAccelerator(
} const ui::Accelerator& accelerator,
NSString** key_equivalent,
PlatformAcceleratorCocoa::PlatformAcceleratorCocoa(NSString* key_code, NSUInteger* modifier_mask) {
NSUInteger modifier_mask) DCHECK_NE(ui::VKEY_UNKNOWN, accelerator.key_code());
: characters_([key_code copy]), NSUInteger cocoa_modifiers = 0;
modifier_mask_(modifier_mask) { if (accelerator.IsShiftDown())
} cocoa_modifiers |= NSEventModifierFlagShift;
if (accelerator.IsCtrlDown())
PlatformAcceleratorCocoa::~PlatformAcceleratorCocoa() { cocoa_modifiers |= NSEventModifierFlagControl;
} if (accelerator.IsAltDown())
cocoa_modifiers |= NSEventModifierFlagOption;
std::unique_ptr<PlatformAccelerator> PlatformAcceleratorCocoa::CreateCopy() if (accelerator.IsCmdDown())
const { cocoa_modifiers |= NSEventModifierFlagCommand;
std::unique_ptr<PlatformAcceleratorCocoa> copy(new PlatformAcceleratorCocoa); unichar shifted_character;
copy->characters_.reset([characters_ copy]); int result = ui::MacKeyCodeForWindowsKeyCode(
copy->modifier_mask_ = modifier_mask_; accelerator.key_code(), cocoa_modifiers, &shifted_character, nullptr);
return base::WrapUnique(copy.release()); DCHECK(result != -1);
} *key_equivalent = [NSString stringWithFormat:@"%C", shifted_character];
*modifier_mask = cocoa_modifiers;
bool PlatformAcceleratorCocoa::Equals(const PlatformAccelerator& rhs) const {
const PlatformAcceleratorCocoa& rhs_cocoa =
static_cast<const PlatformAcceleratorCocoa&>(rhs);
return [characters_ isEqualToString:rhs_cocoa.characters_] &&
modifier_mask_ == rhs_cocoa.modifier_mask_;
} }
} // namespace ui } // namespace ui
...@@ -193,14 +193,12 @@ NSString* const kMenuControllerMenuDidCloseNotification = ...@@ -193,14 +193,12 @@ NSString* const kMenuControllerMenuDidCloseNotification =
[item setRepresentedObject:modelObject]; // Retains |modelObject|. [item setRepresentedObject:modelObject]; // Retains |modelObject|.
ui::Accelerator accelerator; ui::Accelerator accelerator;
if (model->GetAcceleratorAt(index, &accelerator)) { if (model->GetAcceleratorAt(index, &accelerator)) {
const ui::PlatformAcceleratorCocoa* platformAccelerator = NSString* key_equivalent;
static_cast<const ui::PlatformAcceleratorCocoa*>( NSUInteger modifier_mask;
accelerator.platform_accelerator()); GetKeyEquivalentAndModifierMaskFromAccelerator(
if (platformAccelerator) { accelerator, &key_equivalent, &modifier_mask);
[item setKeyEquivalent:platformAccelerator->characters()]; [item setKeyEquivalent:key_equivalent];
[item setKeyEquivalentModifierMask: [item setKeyEquivalentModifierMask:modifier_mask];
platformAccelerator->modifier_mask()];
}
} }
} }
[menu insertItem:item atIndex:index]; [menu insertItem:item atIndex:index];
......
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