| OLD | NEW |
| 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/views/corewm/focus_controller.h" | 5 #include "ui/views/corewm/focus_controller.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "ui/aura/client/activation_change_observer.h" | 9 #include "ui/aura/client/activation_change_observer.h" |
| 10 #include "ui/aura/client/activation_client.h" | 10 #include "ui/aura/client/activation_client.h" |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 // Test base for tests where focus is directly set to a target window. | 291 // Test base for tests where focus is directly set to a target window. |
| 292 class FocusControllerDirectTestBase : public FocusControllerTestBase { | 292 class FocusControllerDirectTestBase : public FocusControllerTestBase { |
| 293 protected: | 293 protected: |
| 294 FocusControllerDirectTestBase() {} | 294 FocusControllerDirectTestBase() {} |
| 295 | 295 |
| 296 // Different test types shift focus in different ways. | 296 // Different test types shift focus in different ways. |
| 297 virtual void FocusWindowDirect(aura::Window* window) = 0; | 297 virtual void FocusWindowDirect(aura::Window* window) = 0; |
| 298 virtual void ActivateWindowDirect(aura::Window* window) = 0; | 298 virtual void ActivateWindowDirect(aura::Window* window) = 0; |
| 299 virtual void DeactivateWindowDirect(aura::Window* window) = 0; | 299 virtual void DeactivateWindowDirect(aura::Window* window) = 0; |
| 300 | 300 |
| 301 // Input events do not change focus if the window can not be focused. |
| 302 virtual bool IsInputEvent() = 0; |
| 303 |
| 301 void FocusWindowById(int id) { | 304 void FocusWindowById(int id) { |
| 302 aura::Window* window = root_window()->GetChildById(id); | 305 aura::Window* window = root_window()->GetChildById(id); |
| 303 DCHECK(window); | 306 DCHECK(window); |
| 304 FocusWindowDirect(window); | 307 FocusWindowDirect(window); |
| 305 } | 308 } |
| 306 void ActivateWindowById(int id) { | 309 void ActivateWindowById(int id) { |
| 307 aura::Window* window = root_window()->GetChildById(id); | 310 aura::Window* window = root_window()->GetChildById(id); |
| 308 DCHECK(window); | 311 DCHECK(window); |
| 309 ActivateWindowDirect(window); | 312 ActivateWindowDirect(window); |
| 310 } | 313 } |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 // Focus should _not_ shift to the parent of the already-focused window. | 432 // Focus should _not_ shift to the parent of the already-focused window. |
| 430 EXPECT_EQ(11, GetFocusedWindowId()); | 433 EXPECT_EQ(11, GetFocusedWindowId()); |
| 431 } | 434 } |
| 432 virtual void FocusRulesOverride() OVERRIDE { | 435 virtual void FocusRulesOverride() OVERRIDE { |
| 433 EXPECT_EQ(NULL, GetFocusedWindow()); | 436 EXPECT_EQ(NULL, GetFocusedWindow()); |
| 434 FocusWindowById(11); | 437 FocusWindowById(11); |
| 435 EXPECT_EQ(11, GetFocusedWindowId()); | 438 EXPECT_EQ(11, GetFocusedWindowId()); |
| 436 | 439 |
| 437 test_focus_rules()->set_focus_restriction(root_window()->GetChildById(211)); | 440 test_focus_rules()->set_focus_restriction(root_window()->GetChildById(211)); |
| 438 FocusWindowById(12); | 441 FocusWindowById(12); |
| 439 EXPECT_EQ(211, GetFocusedWindowId()); | 442 // Input events leave focus unchanged; direct API calls will change focus |
| 443 // to the restricted window. |
| 444 int focused_window = IsInputEvent() ? 11 : 211; |
| 445 EXPECT_EQ(focused_window, GetFocusedWindowId()); |
| 440 | 446 |
| 441 test_focus_rules()->set_focus_restriction(NULL); | 447 test_focus_rules()->set_focus_restriction(NULL); |
| 442 FocusWindowById(12); | 448 FocusWindowById(12); |
| 443 EXPECT_EQ(12, GetFocusedWindowId()); | 449 EXPECT_EQ(12, GetFocusedWindowId()); |
| 444 } | 450 } |
| 445 virtual void ActivationRulesOverride() OVERRIDE { | 451 virtual void ActivationRulesOverride() OVERRIDE { |
| 446 ActivateWindowById(1); | 452 ActivateWindowById(1); |
| 447 EXPECT_EQ(1, GetActiveWindowId()); | 453 EXPECT_EQ(1, GetActiveWindowId()); |
| 448 EXPECT_EQ(1, GetFocusedWindowId()); | 454 EXPECT_EQ(1, GetFocusedWindowId()); |
| 449 | 455 |
| 450 aura::Window* w3 = root_window()->GetChildById(3); | 456 aura::Window* w3 = root_window()->GetChildById(3); |
| 451 test_focus_rules()->set_focus_restriction(w3); | 457 test_focus_rules()->set_focus_restriction(w3); |
| 452 | 458 |
| 453 ActivateWindowById(2); | 459 ActivateWindowById(2); |
| 454 // FocusRules restricts focus and activation to 3. | 460 // Input events leave activation unchanged; direct API calls will activate |
| 455 EXPECT_EQ(3, GetActiveWindowId()); | 461 // the restricted window. |
| 456 EXPECT_EQ(3, GetFocusedWindowId()); | 462 int active_window = IsInputEvent() ? 1 : 3; |
| 463 EXPECT_EQ(active_window, GetActiveWindowId()); |
| 464 EXPECT_EQ(active_window, GetFocusedWindowId()); |
| 457 | 465 |
| 458 test_focus_rules()->set_focus_restriction(NULL); | 466 test_focus_rules()->set_focus_restriction(NULL); |
| 459 ActivateWindowById(2); | 467 ActivateWindowById(2); |
| 460 EXPECT_EQ(2, GetActiveWindowId()); | 468 EXPECT_EQ(2, GetActiveWindowId()); |
| 461 EXPECT_EQ(2, GetFocusedWindowId()); | 469 EXPECT_EQ(2, GetFocusedWindowId()); |
| 462 } | 470 } |
| 463 virtual void ShiftFocusOnActivation() OVERRIDE { | 471 virtual void ShiftFocusOnActivation() OVERRIDE { |
| 464 // When a window is activated, by default that window is also focused. | 472 // When a window is activated, by default that window is also focused. |
| 465 // An ActivationChangeObserver may shift focus to another window within the | 473 // An ActivationChangeObserver may shift focus to another window within the |
| 466 // same activatable window. | 474 // same activatable window. |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 // Overridden from FocusControllerTestBase: | 574 // Overridden from FocusControllerTestBase: |
| 567 virtual void FocusWindowDirect(aura::Window* window) OVERRIDE { | 575 virtual void FocusWindowDirect(aura::Window* window) OVERRIDE { |
| 568 FocusWindow(window); | 576 FocusWindow(window); |
| 569 } | 577 } |
| 570 virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE { | 578 virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE { |
| 571 ActivateWindow(window); | 579 ActivateWindow(window); |
| 572 } | 580 } |
| 573 virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE { | 581 virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE { |
| 574 DeactivateWindow(window); | 582 DeactivateWindow(window); |
| 575 } | 583 } |
| 584 virtual bool IsInputEvent() OVERRIDE { return false; } |
| 576 | 585 |
| 577 DISALLOW_COPY_AND_ASSIGN(FocusControllerApiTest); | 586 DISALLOW_COPY_AND_ASSIGN(FocusControllerApiTest); |
| 578 }; | 587 }; |
| 579 | 588 |
| 580 // Focus and Activation changes via input events. | 589 // Focus and Activation changes via input events. |
| 581 class FocusControllerMouseEventTest : public FocusControllerDirectTestBase { | 590 class FocusControllerMouseEventTest : public FocusControllerDirectTestBase { |
| 582 public: | 591 public: |
| 583 FocusControllerMouseEventTest() {} | 592 FocusControllerMouseEventTest() {} |
| 584 | 593 |
| 585 private: | 594 private: |
| 586 // Overridden from FocusControllerTestBase: | 595 // Overridden from FocusControllerTestBase: |
| 587 virtual void FocusWindowDirect(aura::Window* window) OVERRIDE { | 596 virtual void FocusWindowDirect(aura::Window* window) OVERRIDE { |
| 588 aura::test::EventGenerator generator(root_window(), window); | 597 aura::test::EventGenerator generator(root_window(), window); |
| 589 generator.ClickLeftButton(); | 598 generator.ClickLeftButton(); |
| 590 } | 599 } |
| 591 virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE { | 600 virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE { |
| 592 aura::test::EventGenerator generator(root_window(), window); | 601 aura::test::EventGenerator generator(root_window(), window); |
| 593 generator.ClickLeftButton(); | 602 generator.ClickLeftButton(); |
| 594 } | 603 } |
| 595 virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE { | 604 virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE { |
| 596 aura::Window* next_activatable = | 605 aura::Window* next_activatable = |
| 597 test_focus_rules()->GetNextActivatableWindow(window); | 606 test_focus_rules()->GetNextActivatableWindow(window); |
| 598 aura::test::EventGenerator generator(root_window(), next_activatable); | 607 aura::test::EventGenerator generator(root_window(), next_activatable); |
| 599 generator.ClickLeftButton(); | 608 generator.ClickLeftButton(); |
| 600 } | 609 } |
| 610 virtual bool IsInputEvent() OVERRIDE { return true; } |
| 601 | 611 |
| 602 DISALLOW_COPY_AND_ASSIGN(FocusControllerMouseEventTest); | 612 DISALLOW_COPY_AND_ASSIGN(FocusControllerMouseEventTest); |
| 603 }; | 613 }; |
| 604 | 614 |
| 605 class FocusControllerGestureEventTest : public FocusControllerDirectTestBase { | 615 class FocusControllerGestureEventTest : public FocusControllerDirectTestBase { |
| 606 public: | 616 public: |
| 607 FocusControllerGestureEventTest() {} | 617 FocusControllerGestureEventTest() {} |
| 608 | 618 |
| 609 private: | 619 private: |
| 610 // Overridden from FocusControllerTestBase: | 620 // Overridden from FocusControllerTestBase: |
| 611 virtual void FocusWindowDirect(aura::Window* window) OVERRIDE { | 621 virtual void FocusWindowDirect(aura::Window* window) OVERRIDE { |
| 612 aura::test::EventGenerator generator(root_window(), window); | 622 aura::test::EventGenerator generator(root_window(), window); |
| 613 generator.GestureTapAt(window->bounds().CenterPoint()); | 623 generator.GestureTapAt(window->bounds().CenterPoint()); |
| 614 } | 624 } |
| 615 virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE { | 625 virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE { |
| 616 aura::test::EventGenerator generator(root_window(), window); | 626 aura::test::EventGenerator generator(root_window(), window); |
| 617 generator.GestureTapAt(window->bounds().CenterPoint()); | 627 generator.GestureTapAt(window->bounds().CenterPoint()); |
| 618 } | 628 } |
| 619 virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE { | 629 virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE { |
| 620 aura::Window* next_activatable = | 630 aura::Window* next_activatable = |
| 621 test_focus_rules()->GetNextActivatableWindow(window); | 631 test_focus_rules()->GetNextActivatableWindow(window); |
| 622 aura::test::EventGenerator generator(root_window(), next_activatable); | 632 aura::test::EventGenerator generator(root_window(), next_activatable); |
| 623 generator.GestureTapAt(window->bounds().CenterPoint()); | 633 generator.GestureTapAt(window->bounds().CenterPoint()); |
| 624 } | 634 } |
| 635 virtual bool IsInputEvent() OVERRIDE { return true; } |
| 625 | 636 |
| 626 DISALLOW_COPY_AND_ASSIGN(FocusControllerGestureEventTest); | 637 DISALLOW_COPY_AND_ASSIGN(FocusControllerGestureEventTest); |
| 627 }; | 638 }; |
| 628 | 639 |
| 629 // Test base for tests where focus is implicitly set to a window as the result | 640 // Test base for tests where focus is implicitly set to a window as the result |
| 630 // of a disposition change to the focused window or the hierarchy that contains | 641 // of a disposition change to the focused window or the hierarchy that contains |
| 631 // it. | 642 // it. |
| 632 class FocusControllerImplicitTestBase : public FocusControllerTestBase { | 643 class FocusControllerImplicitTestBase : public FocusControllerTestBase { |
| 633 protected: | 644 protected: |
| 634 explicit FocusControllerImplicitTestBase(bool parent) : parent_(parent) {} | 645 explicit FocusControllerImplicitTestBase(bool parent) : parent_(parent) {} |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 // activation change observer are ignored. | 950 // activation change observer are ignored. |
| 940 DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivation); | 951 DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivation); |
| 941 DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivationDueToHide); | 952 DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivationDueToHide); |
| 942 DIRECT_FOCUS_CHANGE_TESTS(NoShiftActiveOnActivation); | 953 DIRECT_FOCUS_CHANGE_TESTS(NoShiftActiveOnActivation); |
| 943 | 954 |
| 944 // Clicking on a window which has capture should not result in a focus change. | 955 // Clicking on a window which has capture should not result in a focus change. |
| 945 DIRECT_FOCUS_CHANGE_TESTS(NoFocusChangeOnClickOnCaptureWindow); | 956 DIRECT_FOCUS_CHANGE_TESTS(NoFocusChangeOnClickOnCaptureWindow); |
| 946 | 957 |
| 947 } // namespace corewm | 958 } // namespace corewm |
| 948 } // namespace views | 959 } // namespace views |
| OLD | NEW |