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 <utility> | 5 #include <utility> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "ui/base/accelerators/accelerator.h" | 9 #include "ui/base/accelerators/accelerator.h" |
10 #include "ui/events/keycodes/keyboard_codes.h" | 10 #include "ui/events/keycodes/keyboard_codes.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 } | 46 } |
47 | 47 |
48 FocusTestEventType type; | 48 FocusTestEventType type; |
49 int view_id; | 49 int view_id; |
50 }; | 50 }; |
51 | 51 |
52 class SimpleTestView : public View { | 52 class SimpleTestView : public View { |
53 public: | 53 public: |
54 SimpleTestView(std::vector<FocusTestEvent>* event_list, int view_id) | 54 SimpleTestView(std::vector<FocusTestEvent>* event_list, int view_id) |
55 : event_list_(event_list) { | 55 : event_list_(event_list) { |
56 set_focusable(true); | 56 SetFocusable(true); |
57 set_id(view_id); | 57 set_id(view_id); |
58 } | 58 } |
59 | 59 |
60 virtual void OnFocus() OVERRIDE { | 60 virtual void OnFocus() OVERRIDE { |
61 event_list_->push_back(FocusTestEvent(ON_FOCUS, id())); | 61 event_list_->push_back(FocusTestEvent(ON_FOCUS, id())); |
62 } | 62 } |
63 | 63 |
64 virtual void OnBlur() OVERRIDE { | 64 virtual void OnBlur() OVERRIDE { |
65 event_list_->push_back(FocusTestEvent(ON_BLUR, id())); | 65 event_list_->push_back(FocusTestEvent(ON_BLUR, id())); |
66 } | 66 } |
(...skipping 29 matching lines...) Expand all Loading... |
96 | 96 |
97 event_list.clear(); | 97 event_list.clear(); |
98 GetFocusManager()->ClearFocus(); | 98 GetFocusManager()->ClearFocus(); |
99 ASSERT_EQ(1, static_cast<int>(event_list.size())); | 99 ASSERT_EQ(1, static_cast<int>(event_list.size())); |
100 EXPECT_EQ(ON_BLUR, event_list[0].type); | 100 EXPECT_EQ(ON_BLUR, event_list[0].type); |
101 EXPECT_EQ(kView2ID, event_list[0].view_id); | 101 EXPECT_EQ(kView2ID, event_list[0].view_id); |
102 } | 102 } |
103 | 103 |
104 TEST_F(FocusManagerTest, FocusChangeListener) { | 104 TEST_F(FocusManagerTest, FocusChangeListener) { |
105 View* view1 = new View(); | 105 View* view1 = new View(); |
106 view1->set_focusable(true); | 106 view1->SetFocusable(true); |
107 View* view2 = new View(); | 107 View* view2 = new View(); |
108 view2->set_focusable(true); | 108 view2->SetFocusable(true); |
109 GetContentsView()->AddChildView(view1); | 109 GetContentsView()->AddChildView(view1); |
110 GetContentsView()->AddChildView(view2); | 110 GetContentsView()->AddChildView(view2); |
111 | 111 |
112 TestFocusChangeListener listener; | 112 TestFocusChangeListener listener; |
113 AddFocusChangeListener(&listener); | 113 AddFocusChangeListener(&listener); |
114 | 114 |
115 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/det
ails/520043/error-converting-from-null-to-a-pointer-type-in-std-pair | 115 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/det
ails/520043/error-converting-from-null-to-a-pointer-type-in-std-pair |
116 views::View* null_view = NULL; | 116 views::View* null_view = NULL; |
117 | 117 |
118 view1->RequestFocus(); | 118 view1->RequestFocus(); |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 DISALLOW_COPY_AND_ASSIGN(FocusInAboutToRequestFocusFromTabTraversalView); | 623 DISALLOW_COPY_AND_ASSIGN(FocusInAboutToRequestFocusFromTabTraversalView); |
624 }; | 624 }; |
625 } // namespace | 625 } // namespace |
626 | 626 |
627 // Verifies a focus change done during a call to | 627 // Verifies a focus change done during a call to |
628 // AboutToRequestFocusFromTabTraversal() is honored. | 628 // AboutToRequestFocusFromTabTraversal() is honored. |
629 TEST_F(FocusManagerTest, FocusInAboutToRequestFocusFromTabTraversal) { | 629 TEST_F(FocusManagerTest, FocusInAboutToRequestFocusFromTabTraversal) { |
630 // Create 3 views focuses the 3 and advances to the second. The 2nd views | 630 // Create 3 views focuses the 3 and advances to the second. The 2nd views |
631 // implementation of AboutToRequestFocusFromTabTraversal() focuses the first. | 631 // implementation of AboutToRequestFocusFromTabTraversal() focuses the first. |
632 views::View* v1 = new View; | 632 views::View* v1 = new View; |
633 v1->set_focusable(true); | 633 v1->SetFocusable(true); |
634 GetContentsView()->AddChildView(v1); | 634 GetContentsView()->AddChildView(v1); |
635 | 635 |
636 FocusInAboutToRequestFocusFromTabTraversalView* v2 = | 636 FocusInAboutToRequestFocusFromTabTraversalView* v2 = |
637 new FocusInAboutToRequestFocusFromTabTraversalView; | 637 new FocusInAboutToRequestFocusFromTabTraversalView; |
638 v2->set_focusable(true); | 638 v2->SetFocusable(true); |
639 v2->set_view_to_focus(v1); | 639 v2->set_view_to_focus(v1); |
640 GetContentsView()->AddChildView(v2); | 640 GetContentsView()->AddChildView(v2); |
641 | 641 |
642 views::View* v3 = new View; | 642 views::View* v3 = new View; |
643 v3->set_focusable(true); | 643 v3->SetFocusable(true); |
644 GetContentsView()->AddChildView(v3); | 644 GetContentsView()->AddChildView(v3); |
645 | 645 |
646 v3->RequestFocus(); | 646 v3->RequestFocus(); |
647 GetWidget()->GetFocusManager()->AdvanceFocus(true); | 647 GetWidget()->GetFocusManager()->AdvanceFocus(true); |
648 EXPECT_TRUE(v1->HasFocus()); | 648 EXPECT_TRUE(v1->HasFocus()); |
649 } | 649 } |
650 | 650 |
651 TEST_F(FocusManagerTest, RotatePaneFocus) { | 651 TEST_F(FocusManagerTest, RotatePaneFocus) { |
652 views::AccessiblePaneView* pane1 = new AccessiblePaneView(); | 652 views::AccessiblePaneView* pane1 = new AccessiblePaneView(); |
653 GetContentsView()->AddChildView(pane1); | 653 GetContentsView()->AddChildView(pane1); |
654 | 654 |
655 views::View* v1 = new View; | 655 views::View* v1 = new View; |
656 v1->set_focusable(true); | 656 v1->SetFocusable(true); |
657 pane1->AddChildView(v1); | 657 pane1->AddChildView(v1); |
658 | 658 |
659 views::View* v2 = new View; | 659 views::View* v2 = new View; |
660 v2->set_focusable(true); | 660 v2->SetFocusable(true); |
661 pane1->AddChildView(v2); | 661 pane1->AddChildView(v2); |
662 | 662 |
663 views::AccessiblePaneView* pane2 = new AccessiblePaneView(); | 663 views::AccessiblePaneView* pane2 = new AccessiblePaneView(); |
664 GetContentsView()->AddChildView(pane2); | 664 GetContentsView()->AddChildView(pane2); |
665 | 665 |
666 views::View* v3 = new View; | 666 views::View* v3 = new View; |
667 v3->set_focusable(true); | 667 v3->SetFocusable(true); |
668 pane2->AddChildView(v3); | 668 pane2->AddChildView(v3); |
669 | 669 |
670 views::View* v4 = new View; | 670 views::View* v4 = new View; |
671 v4->set_focusable(true); | 671 v4->SetFocusable(true); |
672 pane2->AddChildView(v4); | 672 pane2->AddChildView(v4); |
673 | 673 |
674 std::vector<views::View*> panes; | 674 std::vector<views::View*> panes; |
675 panes.push_back(pane1); | 675 panes.push_back(pane1); |
676 panes.push_back(pane2); | 676 panes.push_back(pane2); |
677 SetAccessiblePanes(panes); | 677 SetAccessiblePanes(panes); |
678 | 678 |
679 FocusManager* focus_manager = GetWidget()->GetFocusManager(); | 679 FocusManager* focus_manager = GetWidget()->GetFocusManager(); |
680 | 680 |
681 // Advance forwards. Focus should stay trapped within each pane. | 681 // Advance forwards. Focus should stay trapped within each pane. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 EXPECT_EQ(v3, focus_manager->GetFocusedView()); | 716 EXPECT_EQ(v3, focus_manager->GetFocusedView()); |
717 | 717 |
718 EXPECT_FALSE(focus_manager->RotatePaneFocus( | 718 EXPECT_FALSE(focus_manager->RotatePaneFocus( |
719 FocusManager::kForward, FocusManager::kNoWrap)); | 719 FocusManager::kForward, FocusManager::kNoWrap)); |
720 EXPECT_EQ(v3, focus_manager->GetFocusedView()); | 720 EXPECT_EQ(v3, focus_manager->GetFocusedView()); |
721 } | 721 } |
722 | 722 |
723 // Verifies the stored focus view tracks the focused view. | 723 // Verifies the stored focus view tracks the focused view. |
724 TEST_F(FocusManagerTest, ImplicitlyStoresFocus) { | 724 TEST_F(FocusManagerTest, ImplicitlyStoresFocus) { |
725 views::View* v1 = new View; | 725 views::View* v1 = new View; |
726 v1->set_focusable(true); | 726 v1->SetFocusable(true); |
727 GetContentsView()->AddChildView(v1); | 727 GetContentsView()->AddChildView(v1); |
728 | 728 |
729 views::View* v2 = new View; | 729 views::View* v2 = new View; |
730 v2->set_focusable(true); | 730 v2->SetFocusable(true); |
731 GetContentsView()->AddChildView(v2); | 731 GetContentsView()->AddChildView(v2); |
732 | 732 |
733 // Verify a focus request on |v1| implicitly updates the stored focus view. | 733 // Verify a focus request on |v1| implicitly updates the stored focus view. |
734 v1->RequestFocus(); | 734 v1->RequestFocus(); |
735 EXPECT_TRUE(v1->HasFocus()); | 735 EXPECT_TRUE(v1->HasFocus()); |
736 EXPECT_EQ(v1, GetWidget()->GetFocusManager()->GetStoredFocusView()); | 736 EXPECT_EQ(v1, GetWidget()->GetFocusManager()->GetStoredFocusView()); |
737 | 737 |
738 // Verify a focus request on |v2| implicitly updates the stored focus view. | 738 // Verify a focus request on |v2| implicitly updates the stored focus view. |
739 v2->RequestFocus(); | 739 v2->RequestFocus(); |
740 EXPECT_TRUE(v2->HasFocus()); | 740 EXPECT_TRUE(v2->HasFocus()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 const ui::KeyEvent right_key( | 778 const ui::KeyEvent right_key( |
779 ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE, false); | 779 ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE, false); |
780 const ui::KeyEvent up_key( | 780 const ui::KeyEvent up_key( |
781 ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE, false); | 781 ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE, false); |
782 const ui::KeyEvent down_key( | 782 const ui::KeyEvent down_key( |
783 ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE, false); | 783 ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE, false); |
784 | 784 |
785 std::vector<views::View*> v; | 785 std::vector<views::View*> v; |
786 for (size_t i = 0; i < 2; ++i) { | 786 for (size_t i = 0; i < 2; ++i) { |
787 views::View* view = new View; | 787 views::View* view = new View; |
788 view->set_focusable(true); | 788 view->SetFocusable(true); |
789 GetContentsView()->AddChildView(view); | 789 GetContentsView()->AddChildView(view); |
790 v.push_back(view); | 790 v.push_back(view); |
791 } | 791 } |
792 | 792 |
793 // Arrow key traversal is off and arrow key does not change focus. | 793 // Arrow key traversal is off and arrow key does not change focus. |
794 FocusManager::set_arrow_key_traversal_enabled(false); | 794 FocusManager::set_arrow_key_traversal_enabled(false); |
795 v[0]->RequestFocus(); | 795 v[0]->RequestFocus(); |
796 focus_manager->OnKeyEvent(right_key); | 796 focus_manager->OnKeyEvent(right_key); |
797 EXPECT_EQ(v[0], focus_manager->GetFocusedView()); | 797 EXPECT_EQ(v[0], focus_manager->GetFocusedView()); |
798 focus_manager->OnKeyEvent(left_key); | 798 focus_manager->OnKeyEvent(left_key); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 | 857 |
858 DISALLOW_COPY_AND_ASSIGN(AdvanceFocusWidgetDelegate); | 858 DISALLOW_COPY_AND_ASSIGN(AdvanceFocusWidgetDelegate); |
859 }; | 859 }; |
860 | 860 |
861 } // namespace | 861 } // namespace |
862 | 862 |
863 // Verifies focus wrapping happens in the same widget. | 863 // Verifies focus wrapping happens in the same widget. |
864 TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) { | 864 TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) { |
865 // Add |widget_view| as a child of the Widget. | 865 // Add |widget_view| as a child of the Widget. |
866 View* widget_view = new View; | 866 View* widget_view = new View; |
867 widget_view->set_focusable(true); | 867 widget_view->SetFocusable(true); |
868 widget_view->SetBounds(20, 0, 20, 20); | 868 widget_view->SetBounds(20, 0, 20, 20); |
869 GetContentsView()->AddChildView(widget_view); | 869 GetContentsView()->AddChildView(widget_view); |
870 | 870 |
871 // Create a widget with two views, focus the second. | 871 // Create a widget with two views, focus the second. |
872 scoped_ptr<AdvanceFocusWidgetDelegate> delegate; | 872 scoped_ptr<AdvanceFocusWidgetDelegate> delegate; |
873 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); | 873 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); |
874 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 874 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
875 params.child = true; | 875 params.child = true; |
876 params.bounds = gfx::Rect(10, 10, 100, 100); | 876 params.bounds = gfx::Rect(10, 10, 100, 100); |
877 params.parent = GetWidget()->GetNativeView(); | 877 params.parent = GetWidget()->GetNativeView(); |
878 Widget child_widget; | 878 Widget child_widget; |
879 delegate.reset(new AdvanceFocusWidgetDelegate(&child_widget)); | 879 delegate.reset(new AdvanceFocusWidgetDelegate(&child_widget)); |
880 params.delegate = delegate.get(); | 880 params.delegate = delegate.get(); |
881 child_widget.Init(params); | 881 child_widget.Init(params); |
882 View* view1 = new View; | 882 View* view1 = new View; |
883 view1->set_focusable(true); | 883 view1->SetFocusable(true); |
884 view1->SetBounds(0, 0, 20, 20); | 884 view1->SetBounds(0, 0, 20, 20); |
885 View* view2 = new View; | 885 View* view2 = new View; |
886 view2->set_focusable(true); | 886 view2->SetFocusable(true); |
887 view2->SetBounds(20, 0, 20, 20); | 887 view2->SetBounds(20, 0, 20, 20); |
888 child_widget.client_view()->AddChildView(view1); | 888 child_widget.client_view()->AddChildView(view1); |
889 child_widget.client_view()->AddChildView(view2); | 889 child_widget.client_view()->AddChildView(view2); |
890 child_widget.Show(); | 890 child_widget.Show(); |
891 view2->RequestFocus(); | 891 view2->RequestFocus(); |
892 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); | 892 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); |
893 | 893 |
894 // Advance focus backwards, which should focus the first. | 894 // Advance focus backwards, which should focus the first. |
895 GetFocusManager()->AdvanceFocus(false); | 895 GetFocusManager()->AdvanceFocus(false); |
896 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); | 896 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); |
897 | 897 |
898 // Focus forward to |view2|. | 898 // Focus forward to |view2|. |
899 GetFocusManager()->AdvanceFocus(true); | 899 GetFocusManager()->AdvanceFocus(true); |
900 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); | 900 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); |
901 | 901 |
902 // And forward again, wrapping back to |view1|. | 902 // And forward again, wrapping back to |view1|. |
903 GetFocusManager()->AdvanceFocus(true); | 903 GetFocusManager()->AdvanceFocus(true); |
904 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); | 904 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); |
905 | 905 |
906 // Allow focus to go to the parent, and focus backwards which should now move | 906 // Allow focus to go to the parent, and focus backwards which should now move |
907 // up |widget_view| (in the parent). | 907 // up |widget_view| (in the parent). |
908 delegate->set_should_advance_focus_to_parent(true); | 908 delegate->set_should_advance_focus_to_parent(true); |
909 GetFocusManager()->AdvanceFocus(true); | 909 GetFocusManager()->AdvanceFocus(true); |
910 EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView()); | 910 EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView()); |
911 } | 911 } |
912 | 912 |
913 } // namespace views | 913 } // namespace views |
OLD | NEW |