| 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, false, &return_target); |
| 235 focus_manager->RegisterAccelerator(escape_accelerator, &escape_target); | 235 focus_manager->RegisterAccelerator(escape_accelerator, false, &escape_target); |
| 236 | 236 |
| 237 // Checks if the correct target is registered. | 237 // Checks if the correct target is registered. |
| 238 EXPECT_EQ(&return_target, | 238 EXPECT_EQ(&return_target, |
| 239 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 239 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
| 240 EXPECT_EQ(&escape_target, | 240 EXPECT_EQ(&escape_target, |
| 241 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); | 241 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 242 | 242 |
| 243 // Hitting the return key. | 243 // Hitting the return key. |
| 244 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 244 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 245 EXPECT_EQ(return_target.accelerator_count(), 1); | 245 EXPECT_EQ(return_target.accelerator_count(), 1); |
| 246 EXPECT_EQ(escape_target.accelerator_count(), 0); | 246 EXPECT_EQ(escape_target.accelerator_count(), 0); |
| 247 | 247 |
| 248 // Hitting the escape key. | 248 // Hitting the escape key. |
| 249 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); | 249 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 250 EXPECT_EQ(return_target.accelerator_count(), 1); | 250 EXPECT_EQ(return_target.accelerator_count(), 1); |
| 251 EXPECT_EQ(escape_target.accelerator_count(), 1); | 251 EXPECT_EQ(escape_target.accelerator_count(), 1); |
| 252 | 252 |
| 253 // Register another target for the return key. | 253 // Register another target for the return key. |
| 254 TestAcceleratorTarget return_target2(true); | 254 TestAcceleratorTarget return_target2(true); |
| 255 EXPECT_EQ(return_target2.accelerator_count(), 0); | 255 EXPECT_EQ(return_target2.accelerator_count(), 0); |
| 256 focus_manager->RegisterAccelerator(return_accelerator, &return_target2); | 256 focus_manager->RegisterAccelerator( |
| 257 return_accelerator, false, &return_target2); |
| 257 EXPECT_EQ(&return_target2, | 258 EXPECT_EQ(&return_target2, |
| 258 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 259 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
| 259 | 260 |
| 260 // Hitting the return key; return_target2 has the priority. | 261 // Hitting the return key; return_target2 has the priority. |
| 261 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 262 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 262 EXPECT_EQ(return_target.accelerator_count(), 1); | 263 EXPECT_EQ(return_target.accelerator_count(), 1); |
| 263 EXPECT_EQ(return_target2.accelerator_count(), 1); | 264 EXPECT_EQ(return_target2.accelerator_count(), 1); |
| 264 | 265 |
| 265 // Register a target that does not process the accelerator event. | 266 // Register a target that does not process the accelerator event. |
| 266 TestAcceleratorTarget return_target3(false); | 267 TestAcceleratorTarget return_target3(false); |
| 267 EXPECT_EQ(return_target3.accelerator_count(), 0); | 268 EXPECT_EQ(return_target3.accelerator_count(), 0); |
| 268 focus_manager->RegisterAccelerator(return_accelerator, &return_target3); | 269 focus_manager->RegisterAccelerator( |
| 270 return_accelerator, false, &return_target3); |
| 269 EXPECT_EQ(&return_target3, | 271 EXPECT_EQ(&return_target3, |
| 270 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 272 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
| 271 | 273 |
| 272 // Hitting the return key. | 274 // Hitting the return key. |
| 273 // Since the event handler of return_target3 returns false, return_target2 | 275 // Since the event handler of return_target3 returns false, return_target2 |
| 274 // should be called too. | 276 // should be called too. |
| 275 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 277 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 276 EXPECT_EQ(return_target.accelerator_count(), 1); | 278 EXPECT_EQ(return_target.accelerator_count(), 1); |
| 277 EXPECT_EQ(return_target2.accelerator_count(), 2); | 279 EXPECT_EQ(return_target2.accelerator_count(), 2); |
| 278 EXPECT_EQ(return_target3.accelerator_count(), 1); | 280 EXPECT_EQ(return_target3.accelerator_count(), 1); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 301 | 303 |
| 302 // Hitting the return key and the escape key. Nothing should happen. | 304 // Hitting the return key and the escape key. Nothing should happen. |
| 303 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); | 305 EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 304 EXPECT_EQ(return_target.accelerator_count(), 2); | 306 EXPECT_EQ(return_target.accelerator_count(), 2); |
| 305 EXPECT_EQ(return_target2.accelerator_count(), 2); | 307 EXPECT_EQ(return_target2.accelerator_count(), 2); |
| 306 EXPECT_EQ(return_target3.accelerator_count(), 2); | 308 EXPECT_EQ(return_target3.accelerator_count(), 2); |
| 307 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); | 309 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 308 EXPECT_EQ(escape_target.accelerator_count(), 1); | 310 EXPECT_EQ(escape_target.accelerator_count(), 1); |
| 309 } | 311 } |
| 310 | 312 |
| 313 TEST_F(FocusManagerTest, HighPriorityHandlers) { |
| 314 FocusManager* focus_manager = GetFocusManager(); |
| 315 ui::Accelerator escape_accelerator(ui::VKEY_ESCAPE, false, false, false); |
| 316 |
| 317 TestAcceleratorTarget escape_target_high(true); |
| 318 TestAcceleratorTarget escape_target_normal(true); |
| 319 EXPECT_EQ(escape_target_high.accelerator_count(), 0); |
| 320 EXPECT_EQ(escape_target_normal.accelerator_count(), 0); |
| 321 EXPECT_EQ(NULL, |
| 322 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 323 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 324 |
| 325 // Register high priority target. |
| 326 focus_manager->RegisterAccelerator( |
| 327 escape_accelerator, true, &escape_target_high); |
| 328 EXPECT_EQ(&escape_target_high, |
| 329 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 330 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 331 |
| 332 // Hit the escape key. |
| 333 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 334 EXPECT_EQ(escape_target_high.accelerator_count(), 1); |
| 335 EXPECT_EQ(escape_target_normal.accelerator_count(), 0); |
| 336 |
| 337 // Add a normal priority target and make sure it doesn't see the key. |
| 338 focus_manager->RegisterAccelerator( |
| 339 escape_accelerator, false, &escape_target_normal); |
| 340 |
| 341 // Checks if the correct target is registered (same as before, the high |
| 342 // priority one). |
| 343 EXPECT_EQ(&escape_target_high, |
| 344 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 345 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 346 |
| 347 // Hit the escape key. |
| 348 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 349 EXPECT_EQ(escape_target_high.accelerator_count(), 2); |
| 350 EXPECT_EQ(escape_target_normal.accelerator_count(), 0); |
| 351 |
| 352 // Unregister the high priority accelerator. |
| 353 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target_high); |
| 354 EXPECT_EQ(&escape_target_normal, |
| 355 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 356 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 357 |
| 358 // Hit the escape key. |
| 359 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 360 EXPECT_EQ(escape_target_high.accelerator_count(), 2); |
| 361 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 362 |
| 363 // Add the high priority target back and make sure it starts seeing the key. |
| 364 focus_manager->RegisterAccelerator( |
| 365 escape_accelerator, true, &escape_target_high); |
| 366 EXPECT_EQ(&escape_target_high, |
| 367 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 368 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 369 |
| 370 // Hit the escape key. |
| 371 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 372 EXPECT_EQ(escape_target_high.accelerator_count(), 3); |
| 373 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 374 |
| 375 // Unregister the normal priority accelerator. |
| 376 focus_manager->UnregisterAccelerator( |
| 377 escape_accelerator, &escape_target_normal); |
| 378 EXPECT_EQ(&escape_target_high, |
| 379 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 380 EXPECT_TRUE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 381 |
| 382 // Hit the escape key. |
| 383 EXPECT_TRUE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 384 EXPECT_EQ(escape_target_high.accelerator_count(), 4); |
| 385 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 386 |
| 387 // Unregister the high priority accelerator. |
| 388 focus_manager->UnregisterAccelerator(escape_accelerator, &escape_target_high); |
| 389 EXPECT_EQ(NULL, |
| 390 focus_manager->GetCurrentTargetForAccelerator(escape_accelerator)); |
| 391 EXPECT_FALSE(focus_manager->HasPriorityHandler(escape_accelerator)); |
| 392 |
| 393 // Hit the escape key (no change, no targets registered). |
| 394 EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator)); |
| 395 EXPECT_EQ(escape_target_high.accelerator_count(), 4); |
| 396 EXPECT_EQ(escape_target_normal.accelerator_count(), 1); |
| 397 } |
| 398 |
| 311 TEST_F(FocusManagerTest, CallsEnabledAcceleratorTargetsOnly) { | 399 TEST_F(FocusManagerTest, CallsEnabledAcceleratorTargetsOnly) { |
| 312 FocusManager* focus_manager = GetFocusManager(); | 400 FocusManager* focus_manager = GetFocusManager(); |
| 313 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); | 401 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); |
| 314 | 402 |
| 315 TestAcceleratorTarget return_target1(true); | 403 TestAcceleratorTarget return_target1(true); |
| 316 TestAcceleratorTarget return_target2(true); | 404 TestAcceleratorTarget return_target2(true); |
| 317 | 405 |
| 318 focus_manager->RegisterAccelerator(return_accelerator, &return_target1); | 406 focus_manager->RegisterAccelerator( |
| 319 focus_manager->RegisterAccelerator(return_accelerator, &return_target2); | 407 return_accelerator, false, &return_target1); |
| 408 focus_manager->RegisterAccelerator( |
| 409 return_accelerator, false, &return_target2); |
| 320 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 410 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 321 EXPECT_EQ(0, return_target1.accelerator_count()); | 411 EXPECT_EQ(0, return_target1.accelerator_count()); |
| 322 EXPECT_EQ(1, return_target2.accelerator_count()); | 412 EXPECT_EQ(1, return_target2.accelerator_count()); |
| 323 | 413 |
| 324 // If CanHandleAccelerators() return false, FocusManager shouldn't call | 414 // If CanHandleAccelerators() return false, FocusManager shouldn't call |
| 325 // AcceleratorPressed(). | 415 // AcceleratorPressed(). |
| 326 return_target2.set_can_handle_accelerators(false); | 416 return_target2.set_can_handle_accelerators(false); |
| 327 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 417 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 328 EXPECT_EQ(1, return_target1.accelerator_count()); | 418 EXPECT_EQ(1, return_target1.accelerator_count()); |
| 329 EXPECT_EQ(1, return_target2.accelerator_count()); | 419 EXPECT_EQ(1, return_target2.accelerator_count()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 | 464 |
| 375 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) { | 465 TEST_F(FocusManagerTest, CallsSelfDeletingAcceleratorTarget) { |
| 376 FocusManager* focus_manager = GetFocusManager(); | 466 FocusManager* focus_manager = GetFocusManager(); |
| 377 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); | 467 ui::Accelerator return_accelerator(ui::VKEY_RETURN, false, false, false); |
| 378 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager); | 468 SelfUnregisteringAcceleratorTarget target(return_accelerator, focus_manager); |
| 379 EXPECT_EQ(target.accelerator_count(), 0); | 469 EXPECT_EQ(target.accelerator_count(), 0); |
| 380 EXPECT_EQ(NULL, | 470 EXPECT_EQ(NULL, |
| 381 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 471 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
| 382 | 472 |
| 383 // Register the target. | 473 // Register the target. |
| 384 focus_manager->RegisterAccelerator(return_accelerator, &target); | 474 focus_manager->RegisterAccelerator(return_accelerator, false, &target); |
| 385 EXPECT_EQ(&target, | 475 EXPECT_EQ(&target, |
| 386 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 476 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
| 387 | 477 |
| 388 // Hitting the return key. The target will be unregistered. | 478 // Hitting the return key. The target will be unregistered. |
| 389 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); | 479 EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
| 390 EXPECT_EQ(target.accelerator_count(), 1); | 480 EXPECT_EQ(target.accelerator_count(), 1); |
| 391 EXPECT_EQ(NULL, | 481 EXPECT_EQ(NULL, |
| 392 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); | 482 focus_manager->GetCurrentTargetForAccelerator(return_accelerator)); |
| 393 | 483 |
| 394 // Hitting the return key again; nothing should happen. | 484 // Hitting the return key again; nothing should happen. |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 | 589 |
| 500 // Test window, button and focus manager should all be destructed. | 590 // Test window, button and focus manager should all be destructed. |
| 501 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size())); | 591 ASSERT_EQ(3, static_cast<int>(dtor_tracker_.size())); |
| 502 | 592 |
| 503 // Focus manager should be the last one to destruct. | 593 // Focus manager should be the last one to destruct. |
| 504 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str()); | 594 ASSERT_STREQ("FocusManagerDtorTracked", dtor_tracker_[2].c_str()); |
| 505 } | 595 } |
| 506 #endif | 596 #endif |
| 507 | 597 |
| 508 } // namespace views | 598 } // namespace views |
| OLD | NEW |