| 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 |