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

Side by Side Diff: ui/base/accelerators/accelerator_manager_unittest.cc

Issue 2586333003: Make mash register initial batch of accelerators in single shot. (Closed)
Patch Set: Fix comments. Move inline function to .h Created 3 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
« no previous file with comments | « ui/base/accelerators/accelerator_manager_delegate.h ('k') | ui/views/focus/focus_manager.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "ui/base/accelerators/accelerator_manager.h" 5 #include "ui/base/accelerators/accelerator_manager.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 int result = 0; 64 int result = 0;
65 for (size_t i = 0; i < arraysize(kAcceleratorModifiers); ++i) { 65 for (size_t i = 0; i < arraysize(kAcceleratorModifiers); ++i) {
66 if (((1 << i) & id) != 0) 66 if (((1 << i) & id) != 0)
67 result |= kAcceleratorModifiers[i]; 67 result |= kAcceleratorModifiers[i];
68 } 68 }
69 return result; 69 return result;
70 } 70 }
71 71
72 // AcceleratorManagerDelegate implementation that records calls to interface 72 // AcceleratorManagerDelegate implementation that records calls to interface
73 // using the following format. 73 // using the following format.
74 // . OnAcceleratorRegistered() -> 'Register ' + id 74 // . OnAcceleratorsRegistered() -> A list of "'Register ' + <id>" separated by
75 // . OnAcceleratorRegistered() -> 'Unregister' + id 75 // whitespaces.
76 // . OnAcceleratorUnregistered() -> 'Unregister' + id
76 // where the id is specified using SetIdForAccelerator(). 77 // where the id is specified using SetIdForAccelerator().
77 class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate { 78 class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate {
78 public: 79 public:
79 TestAcceleratorManagerDelegate() {} 80 TestAcceleratorManagerDelegate() {}
80 ~TestAcceleratorManagerDelegate() override {} 81 ~TestAcceleratorManagerDelegate() override {}
81 82
82 void SetIdForAccelerator(const Accelerator& accelerator, 83 void SetIdForAccelerator(const Accelerator& accelerator,
83 const std::string& id) { 84 const std::string& id) {
84 accelerator_to_id_[accelerator] = id; 85 accelerator_to_id_[accelerator] = id;
85 } 86 }
86 87
87 std::string GetAndClearCommands() { 88 std::string GetAndClearCommands() {
88 std::string commands; 89 std::string commands;
89 std::swap(commands, commands_); 90 std::swap(commands, commands_);
90 return commands; 91 return commands;
91 } 92 }
92 93
93 // AcceleratorManagerDelegate: 94 // AcceleratorManagerDelegate:
94 void OnAcceleratorRegistered(const Accelerator& accelerator) override { 95 void OnAcceleratorsRegistered(
95 if (!commands_.empty()) 96 const std::vector<Accelerator>& accelerators) override {
96 commands_ += " "; 97 for (const Accelerator& accelerator : accelerators) {
97 commands_ += "Register " + accelerator_to_id_[accelerator]; 98 if (!commands_.empty())
99 commands_ += " ";
100 commands_ += "Register " + accelerator_to_id_[accelerator];
101 }
98 } 102 }
99 void OnAcceleratorUnregistered(const Accelerator& accelerator) override { 103 void OnAcceleratorUnregistered(const Accelerator& accelerator) override {
100 if (!commands_.empty()) 104 if (!commands_.empty())
101 commands_ += " "; 105 commands_ += " ";
102 commands_ += "Unregister " + accelerator_to_id_[accelerator]; 106 commands_ += "Unregister " + accelerator_to_id_[accelerator];
103 } 107 }
104 108
105 private: 109 private:
106 std::map<Accelerator, std::string> accelerator_to_id_; 110 std::map<Accelerator, std::string> accelerator_to_id_;
107 std::string commands_; 111 std::string commands_;
108 112
109 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorManagerDelegate); 113 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorManagerDelegate);
110 }; 114 };
111 115
112 } // namespace 116 } // namespace
113 117
114 class AcceleratorManagerTest : public testing::Test { 118 class AcceleratorManagerTest : public testing::Test {
115 public: 119 public:
116 AcceleratorManagerTest() : manager_(&delegate_) {} 120 AcceleratorManagerTest() : manager_(&delegate_) {}
117 ~AcceleratorManagerTest() override {} 121 ~AcceleratorManagerTest() override {}
118 122
119 protected: 123 protected:
120 TestAcceleratorManagerDelegate delegate_; 124 TestAcceleratorManagerDelegate delegate_;
121 AcceleratorManager manager_; 125 AcceleratorManager manager_;
122 }; 126 };
123 127
124 TEST_F(AcceleratorManagerTest, Register) { 128 TEST_F(AcceleratorManagerTest, Register) {
129 TestTarget target;
125 const Accelerator accelerator_a(VKEY_A, EF_NONE); 130 const Accelerator accelerator_a(VKEY_A, EF_NONE);
126 TestTarget target;
127 delegate_.SetIdForAccelerator(accelerator_a, "a"); 131 delegate_.SetIdForAccelerator(accelerator_a, "a");
128 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
129 &target);
130 EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
131 132
132 // The registered accelerator is processed. 133 const Accelerator accelerator_b(VKEY_B, EF_NONE);
134 delegate_.SetIdForAccelerator(accelerator_b, "b");
135
136 const Accelerator accelerator_c(VKEY_C, EF_NONE);
137 delegate_.SetIdForAccelerator(accelerator_c, "c");
138
139 const Accelerator accelerator_d(VKEY_D, EF_NONE);
140 delegate_.SetIdForAccelerator(accelerator_d, "d");
141
142 manager_.Register(
143 {accelerator_a, accelerator_b, accelerator_c, accelerator_d},
144 AcceleratorManager::kNormalPriority, &target);
145 EXPECT_EQ("Register a Register b Register c Register d",
146 delegate_.GetAndClearCommands());
147
148 // The registered accelerators are processed.
133 EXPECT_TRUE(manager_.Process(accelerator_a)); 149 EXPECT_TRUE(manager_.Process(accelerator_a));
134 EXPECT_EQ(1, target.accelerator_pressed_count()); 150 EXPECT_TRUE(manager_.Process(accelerator_b));
151 EXPECT_TRUE(manager_.Process(accelerator_c));
152 EXPECT_TRUE(manager_.Process(accelerator_d));
153 EXPECT_EQ(4, target.accelerator_pressed_count());
135 } 154 }
136 155
137 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) { 156 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) {
138 const Accelerator accelerator_a(VKEY_A, EF_NONE); 157 const Accelerator accelerator_a(VKEY_A, EF_NONE);
139 delegate_.SetIdForAccelerator(accelerator_a, "a"); 158 delegate_.SetIdForAccelerator(accelerator_a, "a");
140 TestTarget target1; 159 TestTarget target1;
141 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, 160 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority,
142 &target1); 161 &target1);
143 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); 162 EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
144 TestTarget target2; 163 TestTarget target2;
145 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, 164 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority,
146 &target2); 165 &target2);
147 // Registering the same command shouldn't notify the delegate. 166 // Registering the same command shouldn't notify the delegate.
148 EXPECT_TRUE(delegate_.GetAndClearCommands().empty()); 167 EXPECT_TRUE(delegate_.GetAndClearCommands().empty());
149 168
150 // If multiple targets are registered with the same accelerator, the target 169 // If multiple targets are registered with the same accelerator, the target
151 // registered later processes the accelerator. 170 // registered later processes the accelerator.
152 EXPECT_TRUE(manager_.Process(accelerator_a)); 171 EXPECT_TRUE(manager_.Process(accelerator_a));
153 EXPECT_EQ(0, target1.accelerator_pressed_count()); 172 EXPECT_EQ(0, target1.accelerator_pressed_count());
154 EXPECT_EQ(1, target2.accelerator_pressed_count()); 173 EXPECT_EQ(1, target2.accelerator_pressed_count());
155 } 174 }
156 175
157 TEST_F(AcceleratorManagerTest, Unregister) { 176 TEST_F(AcceleratorManagerTest, Unregister) {
158 const Accelerator accelerator_a(VKEY_A, EF_NONE); 177 const Accelerator accelerator_a(VKEY_A, EF_NONE);
159 delegate_.SetIdForAccelerator(accelerator_a, "a"); 178 delegate_.SetIdForAccelerator(accelerator_a, "a");
160 TestTarget target; 179 TestTarget target;
161 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
162 &target);
163 EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
164 const Accelerator accelerator_b(VKEY_B, EF_NONE); 180 const Accelerator accelerator_b(VKEY_B, EF_NONE);
165 delegate_.SetIdForAccelerator(accelerator_b, "b"); 181 delegate_.SetIdForAccelerator(accelerator_b, "b");
166 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, 182 manager_.Register({accelerator_a, accelerator_b},
167 &target); 183 AcceleratorManager::kNormalPriority, &target);
168 EXPECT_EQ("Register b", delegate_.GetAndClearCommands()); 184 EXPECT_EQ("Register a Register b", delegate_.GetAndClearCommands());
169 185
170 // Unregistering a different accelerator does not affect the other 186 // Unregistering a different accelerator does not affect the other
171 // accelerator. 187 // accelerator.
172 manager_.Unregister(accelerator_b, &target); 188 manager_.Unregister(accelerator_b, &target);
173 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); 189 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands());
174 EXPECT_TRUE(manager_.Process(accelerator_a)); 190 EXPECT_TRUE(manager_.Process(accelerator_a));
175 EXPECT_EQ(1, target.accelerator_pressed_count()); 191 EXPECT_EQ(1, target.accelerator_pressed_count());
176 192
177 // The unregistered accelerator is no longer processed. 193 // The unregistered accelerator is no longer processed.
178 target.set_accelerator_pressed_count(0); 194 target.set_accelerator_pressed_count(0);
179 manager_.Unregister(accelerator_a, &target); 195 manager_.Unregister(accelerator_a, &target);
180 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); 196 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands());
181 EXPECT_FALSE(manager_.Process(accelerator_a)); 197 EXPECT_FALSE(manager_.Process(accelerator_a));
182 EXPECT_EQ(0, target.accelerator_pressed_count()); 198 EXPECT_EQ(0, target.accelerator_pressed_count());
183 } 199 }
184 200
185 TEST_F(AcceleratorManagerTest, UnregisterAll) { 201 TEST_F(AcceleratorManagerTest, UnregisterAll) {
186 const Accelerator accelerator_a(VKEY_A, EF_NONE); 202 const Accelerator accelerator_a(VKEY_A, EF_NONE);
187 delegate_.SetIdForAccelerator(accelerator_a, "a"); 203 delegate_.SetIdForAccelerator(accelerator_a, "a");
188 TestTarget target1; 204 TestTarget target1;
189 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
190 &target1);
191 const Accelerator accelerator_b(VKEY_B, EF_NONE); 205 const Accelerator accelerator_b(VKEY_B, EF_NONE);
192 delegate_.SetIdForAccelerator(accelerator_b, "b"); 206 delegate_.SetIdForAccelerator(accelerator_b, "b");
193 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, 207 manager_.Register({accelerator_a, accelerator_b},
194 &target1); 208 AcceleratorManager::kNormalPriority, &target1);
195 const Accelerator accelerator_c(VKEY_C, EF_NONE); 209 const Accelerator accelerator_c(VKEY_C, EF_NONE);
196 delegate_.SetIdForAccelerator(accelerator_c, "c"); 210 delegate_.SetIdForAccelerator(accelerator_c, "c");
197 TestTarget target2; 211 TestTarget target2;
198 manager_.Register(accelerator_c, AcceleratorManager::kNormalPriority, 212 manager_.Register({accelerator_c}, AcceleratorManager::kNormalPriority,
199 &target2); 213 &target2);
200 EXPECT_EQ("Register a Register b Register c", 214 EXPECT_EQ("Register a Register b Register c",
201 delegate_.GetAndClearCommands()); 215 delegate_.GetAndClearCommands());
202 manager_.UnregisterAll(&target1); 216 manager_.UnregisterAll(&target1);
203 { 217 {
204 const std::string commands = delegate_.GetAndClearCommands(); 218 const std::string commands = delegate_.GetAndClearCommands();
205 // Ordering is not guaranteed. 219 // Ordering is not guaranteed.
206 EXPECT_TRUE(commands == "Unregister a Unregister b" || 220 EXPECT_TRUE(commands == "Unregister a Unregister b" ||
207 commands == "Unregister b Unregister a"); 221 commands == "Unregister b Unregister a");
208 } 222 }
209 223
210 // All the accelerators registered for |target1| are no longer processed. 224 // All the accelerators registered for |target1| are no longer processed.
211 EXPECT_FALSE(manager_.Process(accelerator_a)); 225 EXPECT_FALSE(manager_.Process(accelerator_a));
212 EXPECT_FALSE(manager_.Process(accelerator_b)); 226 EXPECT_FALSE(manager_.Process(accelerator_b));
213 EXPECT_EQ(0, target1.accelerator_pressed_count()); 227 EXPECT_EQ(0, target1.accelerator_pressed_count());
214 228
215 // UnregisterAll with a different target does not affect the other target. 229 // UnregisterAll with a different target does not affect the other target.
216 EXPECT_TRUE(manager_.Process(accelerator_c)); 230 EXPECT_TRUE(manager_.Process(accelerator_c));
217 EXPECT_EQ(1, target2.accelerator_pressed_count()); 231 EXPECT_EQ(1, target2.accelerator_pressed_count());
218 } 232 }
219 233
220 TEST_F(AcceleratorManagerTest, Process) { 234 TEST_F(AcceleratorManagerTest, Process) {
221 TestTarget target; 235 TestTarget target;
222 236
223 // Test all cases of possible modifiers. 237 // Test all cases of possible modifiers.
224 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { 238 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) {
225 const int modifiers = BuildAcceleratorModifier(i); 239 const int modifiers = BuildAcceleratorModifier(i);
226 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); 240 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers));
227 manager_.Register(accelerator, AcceleratorManager::kNormalPriority, 241 manager_.Register({accelerator}, AcceleratorManager::kNormalPriority,
228 &target); 242 &target);
229 243
230 // The registered accelerator is processed. 244 // The registered accelerator is processed.
231 const int last_count = target.accelerator_pressed_count(); 245 const int last_count = target.accelerator_pressed_count();
232 EXPECT_TRUE(manager_.Process(accelerator)) << i; 246 EXPECT_TRUE(manager_.Process(accelerator)) << i;
233 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; 247 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i;
234 248
235 // The non-registered accelerators are not processed. 249 // The non-registered accelerators are not processed.
236 accelerator.set_type(ET_UNKNOWN); 250 accelerator.set_type(ET_UNKNOWN);
237 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type 251 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type
(...skipping 22 matching lines...) Expand all
260 manager_.UnregisterAll(&target); 274 manager_.UnregisterAll(&target);
261 } 275 }
262 } 276 }
263 277
264 // Verifies delegate is notifed correctly when unregistering and registering 278 // Verifies delegate is notifed correctly when unregistering and registering
265 // with the same accelerator. 279 // with the same accelerator.
266 TEST_F(AcceleratorManagerTest, Reregister) { 280 TEST_F(AcceleratorManagerTest, Reregister) {
267 const Accelerator accelerator_a(VKEY_A, EF_NONE); 281 const Accelerator accelerator_a(VKEY_A, EF_NONE);
268 TestTarget target; 282 TestTarget target;
269 delegate_.SetIdForAccelerator(accelerator_a, "a"); 283 delegate_.SetIdForAccelerator(accelerator_a, "a");
270 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, 284 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority,
271 &target); 285 &target);
272 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); 286 EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
273 manager_.UnregisterAll(&target); 287 manager_.UnregisterAll(&target);
274 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); 288 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands());
275 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, 289 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority,
276 &target); 290 &target);
277 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); 291 EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
278 } 292 }
279 293
280 } // namespace test 294 } // namespace test
281 } // namespace ui 295 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/accelerators/accelerator_manager_delegate.h ('k') | ui/views/focus/focus_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698