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

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

Issue 152643007: mac: Create a static mapping of accelerators in the main menu. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@acc_list
Patch Set: Another self-review. Created 6 years, 10 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
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
Robert Sesek 2014/02/11 16:19:48 Happy new year x2
erikchen 2014/02/11 19:42:27 Done.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import <Cocoa/Cocoa.h>
6
7 #include "base/logging.h"
8 #import "chrome/browser/ui/cocoa/accelerators_cocoa.h"
9 #include "chrome/test/base/in_process_browser_test.h"
10 #include "ui/base/accelerators/platform_accelerator_cocoa.h"
11 #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
12 #include "testing/gtest_mac.h"
13
14
15 typedef InProcessBrowserTest AcceleratorsCocoaBrowsertest;
Robert Sesek 2014/02/11 16:19:48 Browsertest -> BrowserTest
erikchen 2014/02/11 19:42:27 I copied the casing from another browser_test in t
16
17 namespace {
18
19 // Adds all NSMenuItems with an accelerator to the array.
20 void addAcceleratorItemsToArray(NSMenu* menu, NSMutableArray* array) {
Robert Sesek 2014/02/11 16:19:48 naming: AddAccelerator
erikchen 2014/02/11 19:42:27 Done.
Robert Sesek 2014/02/11 22:18:16 Argh, sorry I should have been more clear. I was j
erikchen 2014/02/11 23:16:28 Done.
21 for (NSMenuItem* item in [menu itemArray]) {
22 NSMenu* submenu = [item submenu];
23 if (submenu)
24 addAcceleratorItemsToArray(submenu, array);
Robert Sesek 2014/02/11 16:19:48 nit: over-indented
erikchen 2014/02/11 19:42:27 Done.
25
26 if ([item keyEquivalent].length > 0)
27 [array addObject:item];
28 }
29 }
30
31 // Returns the NSMenuItem that has the given keyEquivalent and modifiers, or
32 // nil.
33 NSMenuItem* menuContainsAccelerator(NSMenu* menu,
Robert Sesek 2014/02/11 16:19:48 naming: MenuContains
erikchen 2014/02/11 19:42:27 Done.
34 NSString* keyEquivalent,
35 NSUInteger modifiers) {
36 for (NSMenuItem* item in [menu itemArray]) {
37 NSMenu* submenu = [item submenu];
38 if (submenu) {
39 NSMenuItem* result =
40 menuContainsAccelerator(submenu, keyEquivalent, modifiers);
41 if (result)
42 return result;
43 }
44
45 if ([[item keyEquivalent] isEqual:keyEquivalent]) {
46 BOOL maskEqual =
47 (modifiers == item.keyEquivalentModifierMask) ||
48 ((modifiers & (~NSShiftKeyMask)) == item.keyEquivalentModifierMask);
Robert Sesek 2014/02/11 16:19:48 You use [square brackets] above for keyEquivalent
erikchen 2014/02/11 19:42:27 changed keyEquivalent, keyEquivalentModifierMask,
49 if (maskEqual)
50 return item;
51 }
52 }
53 return nil;
54 }
55
56 } // Anonymous namespace.
Robert Sesek 2014/02/11 16:19:48 "// namespace"
erikchen 2014/02/11 19:42:27 Done.
57
58 // Checks that each NSMenuItem in the main menu has a corresponding accelerator,
59 // and the keyEquivalent/modifiers match.
60 IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowsertest,
61 MainMenuAcceleratorsInMapping) {
62 NSMenu* menu = [NSApp mainMenu];
63 NSMutableArray* array = [NSMutableArray array];
64 addAcceleratorItemsToArray(menu, array);
65
66 for (NSMenuItem* item in array) {
67 int command_id = item.tag;
68 AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance();
69 const ui::Accelerator* accelerator;
70
71 // If the tag is zero, then the NSMenuItem must use a custom selector.
72 // Check that the accelerator is present as an un-mapped accelerator.
73 if (command_id == 0) {
74 accelerator = keymap->GetAcceleratorForHotKey(
75 item.keyEquivalent, item.keyEquivalentModifierMask);
76
77 EXPECT_TRUE(accelerator);
78 return;
79 }
80
81 // If the tag isn't zero, then it must correspond to an IDC_* command.
82 accelerator = keymap->GetAcceleratorForCommand(command_id);
83 EXPECT_TRUE(accelerator);
84 if (!accelerator)
85 continue;
86
87 // Get the Cocoa keyEquivalent associated with the accelerator.
88 const ui::PlatformAcceleratorCocoa* platform_accelerator =
89 static_cast<const ui::PlatformAcceleratorCocoa*>(
90 accelerator->platform_accelerator());
91 NSString* cocoaKeyEquivalent = platform_accelerator->characters();
Robert Sesek 2014/02/11 16:19:48 naming: under_scores
erikchen 2014/02/11 19:42:27 Done.
92
93 // Check that the menu item's keyEquivalent matches the one from the
94 // cocoa accelerator map.
95 EXPECT_NSEQ(cocoaKeyEquivalent, item.keyEquivalent);
96
97 // Check that the menu item's modifier mask matches the one stored in the
98 // accelerator. A mask that include NSShiftKeyMask may not include the
99 // relevant bit (the information is reflected in the keyEquivalent of the
100 // NSMenuItem).
101 NSUInteger mask = platform_accelerator->modifier_mask();
102 BOOL maskEqual =
103 (mask == item.keyEquivalentModifierMask) ||
104 ((mask & (~NSShiftKeyMask)) == item.keyEquivalentModifierMask);
105 EXPECT_TRUE(maskEqual);
106 }
107 }
108
109 // Check that each accelerator with a command_id has an associated NSMenuItem
110 // in the main menu. If the selector is commandDispatch:, then the tag must
111 // match the command_id.
112 IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowsertest,
113 MappingAcceleratorsInMainMenu) {
114 AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance();
115 for (AcceleratorsCocoa::AcceleratorMap::iterator it =
116 keymap->accelerators_.begin();
117 it != keymap->accelerators_.end();
118 ++it) {
119 const ui::PlatformAcceleratorCocoa* platform_accelerator =
120 static_cast<const ui::PlatformAcceleratorCocoa*>(
121 it->second.platform_accelerator());
122
123 // Check that there exists a corresponding NSMenuItem.
124 NSMenuItem* item =
125 menuContainsAccelerator([NSApp mainMenu],
126 platform_accelerator->characters(),
127 platform_accelerator->modifier_mask());
128 EXPECT_TRUE(item);
129
130 // If the menu uses a commandDispatch:, the tag must match the command id!
131 if (item.action == @selector(commandDispatch:))
132 EXPECT_EQ(item.tag, it->first);
133 }
134 }
135
Robert Sesek 2014/02/11 16:19:48 nit: extra blank line
erikchen 2014/02/11 19:42:27 Done.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698