OLD | NEW |
1 // Copyright (c) 2011 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 "base/utf_string_conversions.h" | 5 #include "base/utf_string_conversions.h" |
6 #include "ui/base/accelerators/accelerator.h" | 6 #include "ui/base/accelerators/accelerator.h" |
7 #include "ui/base/keycodes/keyboard_codes.h" | 7 #include "ui/base/keycodes/keyboard_codes.h" |
8 #include "ui/views/controls/button/text_button.h" | 8 #include "ui/views/controls/button/text_button.h" |
9 #include "ui/views/controls/textfield/textfield.h" | 9 #include "ui/views/controls/textfield/textfield.h" |
10 #include "ui/views/focus/accelerator_handler.h" | 10 #include "ui/views/focus/accelerator_handler.h" |
11 #include "ui/views/focus/focus_manager_factory.h" | 11 #include "ui/views/focus/focus_manager_factory.h" |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 | 204 |
205 int accelerator_count() const { return accelerator_count_; } | 205 int accelerator_count() const { return accelerator_count_; } |
206 | 206 |
207 void set_can_handle_accelerators(bool can_handle_accelerators) { | 207 void set_can_handle_accelerators(bool can_handle_accelerators) { |
208 can_handle_accelerators_ = can_handle_accelerators; | 208 can_handle_accelerators_ = can_handle_accelerators; |
209 } | 209 } |
210 | 210 |
211 private: | 211 private: |
212 int accelerator_count_; // number of times that the accelerator is activated | 212 int accelerator_count_; // number of times that the accelerator is activated |
213 bool process_accelerator_; // return value of AcceleratorPressed | 213 bool process_accelerator_; // return value of AcceleratorPressed |
214 bool can_handle_accelerators_; // return value of CanHandleAccelerators | 214 bool can_handle_accelerators_; // return value of CanHandleAccelerators |
215 | 215 |
216 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorTarget); | 216 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorTarget); |
217 }; | 217 }; |
218 | 218 |
219 TEST_F(FocusManagerTest, CallsNormalAcceleratorTarget) { | 219 TEST_F(FocusManagerTest, CallsNormalAcceleratorTarget) { |
220 FocusManager* focus_manager = GetFocusManager(); | 220 FocusManager* focus_manager = GetFocusManager(); |
221 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); | 221 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); |
222 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, false, false, false); | 222 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, false, false, false); |
223 | 223 |
224 TestAcceleratorTarget return_target(true); | 224 TestAcceleratorTarget return_target(true); |
225 TestAcceleratorTarget escape_target(true); | 225 TestAcceleratorTarget escape_target(true); |
226 EXPECT_EQ(return_target.accelerator_count(), 0); | 226 EXPECT_EQ(return_target.accelerator_count(), 0); |
227 EXPECT_EQ(escape_target.accelerator_count(), 0); | 227 EXPECT_EQ(escape_target.accelerator_count(), 0); |
228 EXPECT_EQ(NULL, | 228 EXPECT_EQ(NULL, |
229 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 229 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
230 EXPECT_EQ(NULL, | 230 EXPECT_EQ(NULL, |
231 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); | 231 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
232 | 232 |
233 // Register targets. | 233 // Register targets. |
234 focus_manager->RegisterAccelerator(return_accelerator, &return_target); | 234 focus_manager->RegisterAccelerator(return_accelerator, |
235 focus_manager->RegisterAccelerator(escape_accelerator, &escape_target); | 235 ui::AcceleratorManager::kNormalPriority, |
| 236 &return_target); |
| 237 focus_manager->RegisterAccelerator(escape_accelerator, |
| 238 ui::AcceleratorManager::kNormalPriority, |
| 239 &escape_target); |
236 | 240 |
237 // Checks if the correct target is registered. | 241 // Checks if the correct target is registered. |
238 EXPECT_EQ(&return_target, | 242 EXPECT_EQ(&return_target, |
239 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 243 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
240 EXPECT_EQ(&escape_target, | 244 EXPECT_EQ(&escape_target, |
241 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); | 245 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
242 | 246 |
243 // Hitting the return key. | 247 // Hitting the return key. |
244 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 248 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
245 EXPECT_EQ(return_target.accelerator_count(), 1); | 249 EXPECT_EQ(return_target.accelerator_count(), 1); |
246 EXPECT_EQ(escape_target.accelerator_count(), 0); | 250 EXPECT_EQ(escape_target.accelerator_count(), 0); |
247 | 251 |
248 // Hitting the escape key. | 252 // Hitting the escape key. |
249 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); | 253 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
250 EXPECT_EQ(return_target.accelerator_count(), 1); | 254 EXPECT_EQ(return_target.accelerator_count(), 1); |
251 EXPECT_EQ(escape_target.accelerator_count(), 1); | 255 EXPECT_EQ(escape_target.accelerator_count(), 1); |
252 | 256 |
253 // Register another target for the return key. | 257 // Register another target for the return key. |
254 TestAcceleratorTarget return_target2(true); | 258 TestAcceleratorTarget return_target2(true); |
255 EXPECT_EQ(return_target2.accelerator_count(), 0); | 259 EXPECT_EQ(return_target2.accelerator_count(), 0); |
256 focus_manager->RegisterAccelerator(return_accelerator, &return_target2); | 260 focus_manager->RegisterAccelerator(return_accelerator, |
| 261 ui::AcceleratorManager::kNormalPriority, |
| 262 &return_target2); |
257 EXPECT_EQ(&return_target2, | 263 EXPECT_EQ(&return_target2, |
258 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 264 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
259 | 265 |
260 // Hitting the return key; return_target2 has the priority. | 266 // Hitting the return key; return_target2 has the priority. |
261 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 267 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
262 EXPECT_EQ(return_target.accelerator_count(), 1); | 268 EXPECT_EQ(return_target.accelerator_count(), 1); |
263 EXPECT_EQ(return_target2.accelerator_count(), 1); | 269 EXPECT_EQ(return_target2.accelerator_count(), 1); |
264 | 270 |
265 // Register a target that does not process the accelerator event. | 271 // Register a target that does not process the accelerator event. |
266 TestAcceleratorTarget return_target3(false); | 272 TestAcceleratorTarget return_target3(false); |
267 EXPECT_EQ(return_target3.accelerator_count(), 0); | 273 EXPECT_EQ(return_target3.accelerator_count(), 0); |
268 focus_manager->RegisterAccelerator(return_accelerator, &return_target3); | 274 focus_manager->RegisterAccelerator(return_accelerator, |
| 275 ui::AcceleratorManager::kNormalPriority, |
| 276 &return_target3); |
269 EXPECT_EQ(&return_target3, | 277 EXPECT_EQ(&return_target3, |
270 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 278 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
271 | 279 |
272 // Hitting the return key. | 280 // Hitting the return key. |
273 // Since the event handler of return_target3 returns false, return_target2 | 281 // Since the event handler of return_target3 returns false, return_target2 |
274 // should be called too. | 282 // should be called too. |
275 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 283 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
276 EXPECT_EQ(return_target.accelerator_count(), 1); | 284 EXPECT_EQ(return_target.accelerator_count(), 1); |
277 EXPECT_EQ(return_target2.accelerator_count(), 2); | 285 EXPECT_EQ(return_target2.accelerator_count(), 2); |
278 EXPECT_EQ(return_target3.accelerator_count(), 1); | 286 EXPECT_EQ(return_target3.accelerator_count(), 1); |
(...skipping 22 matching lines...) Expand all Loading... |
301 | 309 |
302 // Hitting the return key and the escape key. Nothing should happen. | 310 // Hitting the return key and the escape key. Nothing should happen. |
303 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); | 311 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); |
304 EXPECT_EQ(return_target.accelerator_count(), 2); | 312 EXPECT_EQ(return_target.accelerator_count(), 2); |
305 EXPECT_EQ(return_target2.accelerator_count(), 2); | 313 EXPECT_EQ(return_target2.accelerator_count(), 2); |
306 EXPECT_EQ(return_target3.accelerator_count(), 2); | 314 EXPECT_EQ(return_target3.accelerator_count(), 2); |
307 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); | 315 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); |
308 EXPECT_EQ(escape_target.accelerator_count(), 1); | 316 EXPECT_EQ(escape_target.accelerator_count(), 1); |
309 } | 317 } |
310 | 318 |
| 319 TEST_F(FocusManagerTest, HighPriorityHandlers) { |
| 320 FocusManager* focus_manager = GetFocusManager(); |
| 321 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, false, false, false); |
| 322 |
| 323 TestAcceleratorTarget escape_target_high(true); |
| 324 TestAcceleratorTarget escape_target_normal(true); |
| 325 EXPECT_EQ(escape_target_high.accelerator_count(), 0); |
| 326 EXPECT_EQ(escape_target_normal.accelerator_count(), 0); |
| 327 EXPECT_EQ(NULL, |
| 328 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 329 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 330 |
| 331 // Register high priority target. |
| 332 focus_manager->RegisterAccelerator(escape_accelerator, |
| 333 ui::AcceleratorManager::kHighPriority, |
| 334 &escape_target_high); |
| 335 EXPECT_EQ(&escape_target_high, |
| 336 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 337 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 338 |
| 339 // Hit the escape key. |
| 340 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 341 EXPECT_EQ(escape_target_high.accelerator_count(), 1); |
| 342 EXPECT_EQ(escape_target_normal.accelerator_count(), 0); |
| 343 |
| 344 // Add a normal priority target and make sure it doesn't see the key. |
| 345 focus_manager->RegisterAccelerator(escape_accelerator, |
| 346 ui::AcceleratorManager::kNormalPriority, |
| 347 &escape_target_normal); |
| 348 |
| 349 // Checks if the correct target is registered (same as before, the high |
| 350 // priority one). |
| 351 EXPECT_EQ(&escape_target_high, |
| 352 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 353 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 354 |
| 355 // Hit the escape key. |
| 356 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 357 EXPECT_EQ(escape_target_high.accelerator_count(), 2); |
| 358 EXPECT_EQ(escape_target_normal.accelerator_count(), 0); |
| 359 |
| 360 // Unregister the high priority accelerator. |
| 361 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target_high); |
| 362 EXPECT_EQ(&escape_target_normal, |
| 363 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 364 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 365 |
| 366 // Hit the escape key. |
| 367 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 368 EXPECT_EQ(escape_target_high.accelerator_count(), 2); |
| 369 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 370 |
| 371 // Add the high priority target back and make sure it starts seeing the key. |
| 372 focus_manager->RegisterAccelerator(escape_accelerator, |
| 373 ui::AcceleratorManager::kHighPriority, |
| 374 &escape_target_high); |
| 375 EXPECT_EQ(&escape_target_high, |
| 376 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 377 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 378 |
| 379 // Hit the escape key. |
| 380 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 381 EXPECT_EQ(escape_target_high.accelerator_count(), 3); |
| 382 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 383 |
| 384 // Unregister the normal priority accelerator. |
| 385 focus_manager->UnregisterAccelerator( |
| 386 escape_accelerator, &escape_target_normal); |
| 387 EXPECT_EQ(&escape_target_high, |
| 388 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 389 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 390 |
| 391 // Hit the escape key. |
| 392 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 393 EXPECT_EQ(escape_target_high.accelerator_count(), 4); |
| 394 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 395 |
| 396 // Unregister the high priority accelerator. |
| 397 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target_high); |
| 398 EXPECT_EQ(NULL, |
| 399 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 400 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 401 |
| 402 // Hit the escape key (no change, no targets registered). |
| 403 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 404 EXPECT_EQ(escape_target_high.accelerator_count(), 4); |
| 405 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 406 } |
| 407 |
311 TEST_F(FocusManagerTest, CallsEnabledAcceleratorTargetsOnly) { | 408 TEST_F(FocusManagerTest, CallsEnabledAcceleratorTargetsOnly) { |
312 FocusManager* focus_manager = GetFocusManager(); | 409 FocusManager* focus_manager = GetFocusManager(); |
313 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); | 410 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); |
314 | 411 |
315 TestAcceleratorTarget return_target1(true); | 412 TestAcceleratorTarget return_target1(true); |
316 TestAcceleratorTarget return_target2(true); | 413 TestAcceleratorTarget return_target2(true); |
317 | 414 |
318 focus_manager->RegisterAccelerator(return_accelerator, &return_target1); | 415 focus_manager->RegisterAccelerator(return_accelerator, |
319 focus_manager->RegisterAccelerator(return_accelerator, &return_target2); | 416 ui::AcceleratorManager::kNormalPriority, |
| 417 &return_target1); |
| 418 focus_manager->RegisterAccelerator(return_accelerator, |
| 419 ui::AcceleratorManager::kNormalPriority, |
| 420 &return_target2); |
320 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 421 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
321 EXPECT_EQ(0, return_target1.accelerator_count()); | 422 EXPECT_EQ(0, return_target1.accelerator_count()); |
322 EXPECT_EQ(1, return_target2.accelerator_count()); | 423 EXPECT_EQ(1, return_target2.accelerator_count()); |
323 | 424 |
324 // If CanHandleAccelerators() return false, FocusManager shouldn't call | 425 // If CanHandleAccelerators() return false, FocusManager shouldn't call |
325 // AcceleratorPressed(). | 426 // AcceleratorPressed(). |
326 return_target2.set_can_handle_accelerators(false); | 427 return_target2.set_can_handle_accelerators(false); |
327 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 428 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
328 EXPECT_EQ(1, return_target1.accelerator_count()); | 429 EXPECT_EQ(1, return_target1.accelerator_count()); |
329 EXPECT_EQ(1, return_target2.accelerator_count()); | 430 EXPECT_EQ(1, return_target2.accelerator_count()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 | 475 |
375 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) { | 476 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) { |
376 FocusManager* focus_manager = GetFocusManager(); | 477 FocusManager* focus_manager = GetFocusManager(); |
377 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); | 478 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); |
378 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager); | 479 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager); |
379 EXPECT_EQ(target.accelerator_count(), 0); | 480 EXPECT_EQ(target.accelerator_count(), 0); |
380 EXPECT_EQ(NULL, | 481 EXPECT_EQ(NULL, |
381 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 482 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
382 | 483 |
383 // Register the target. | 484 // Register the target. |
384 focus_manager->RegisterAccelerator(return_accelerator, &target); | 485 focus_manager->RegisterAccelerator(return_accelerator, |
| 486 ui::AcceleratorManager::kNormalPriority, |
| 487 &target); |
385 EXPECT_EQ(&target, | 488 EXPECT_EQ(&target, |
386 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 489 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
387 | 490 |
388 // Hitting the return key. The target will be unregistered. | 491 // Hitting the return key. The target will be unregistered. |
389 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 492 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
390 EXPECT_EQ(target.accelerator_count(), 1); | 493 EXPECT_EQ(target.accelerator_count(), 1); |
391 EXPECT_EQ(NULL, | 494 EXPECT_EQ(NULL, |
392 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 495 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
393 | 496 |
394 // Hitting the return key again; nothing should happen. | 497 // Hitting the return key again; nothing should happen. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 | 602 |
500 // Test window, button and focus manager should all be destructed. | 603 // Test window, button and focus manager should all be destructed. |
501 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size())); | 604 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size())); |
502 | 605 |
503 // Focus manager should be the last one to destruct. | 606 // Focus manager should be the last one to destruct. |
504 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str()); | 607 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str()); |
505 } | 608 } |
506 #endif | 609 #endif |
507 | 610 |
508 } // namespace views | 611 } // namespace views |
OLD | NEW |