Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: ui/views/focus/focus_manager_unittest.cc

Issue 1898633004: Views: Add new SetFocusBehavior method. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/focus/focus_manager.h" 5 #include "ui/views/focus/focus_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 25 matching lines...) Expand all
36 } 36 }
37 37
38 FocusTestEventType type; 38 FocusTestEventType type;
39 int view_id; 39 int view_id;
40 }; 40 };
41 41
42 class SimpleTestView : public View { 42 class SimpleTestView : public View {
43 public: 43 public:
44 SimpleTestView(std::vector<FocusTestEvent>* event_list, int view_id) 44 SimpleTestView(std::vector<FocusTestEvent>* event_list, int view_id)
45 : event_list_(event_list) { 45 : event_list_(event_list) {
46 SetFocusable(true); 46 SetFocusBehavior(FocusBehavior::ALWAYS);
47 set_id(view_id); 47 set_id(view_id);
48 } 48 }
49 49
50 void OnFocus() override { 50 void OnFocus() override {
51 event_list_->push_back(FocusTestEvent(ON_FOCUS, id())); 51 event_list_->push_back(FocusTestEvent(ON_FOCUS, id()));
52 } 52 }
53 53
54 void OnBlur() override { 54 void OnBlur() override {
55 event_list_->push_back(FocusTestEvent(ON_BLUR, id())); 55 event_list_->push_back(FocusTestEvent(ON_BLUR, id()));
56 } 56 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 88
89 event_list.clear(); 89 event_list.clear();
90 GetFocusManager()->ClearFocus(); 90 GetFocusManager()->ClearFocus();
91 ASSERT_EQ(1, static_cast<int>(event_list.size())); 91 ASSERT_EQ(1, static_cast<int>(event_list.size()));
92 EXPECT_EQ(ON_BLUR, event_list[0].type); 92 EXPECT_EQ(ON_BLUR, event_list[0].type);
93 EXPECT_EQ(kView2ID, event_list[0].view_id); 93 EXPECT_EQ(kView2ID, event_list[0].view_id);
94 } 94 }
95 95
96 TEST_F(FocusManagerTest, FocusChangeListener) { 96 TEST_F(FocusManagerTest, FocusChangeListener) {
97 View* view1 = new View(); 97 View* view1 = new View();
98 view1->SetFocusable(true); 98 view1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
99 View* view2 = new View(); 99 View* view2 = new View();
100 view2->SetFocusable(true); 100 view2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
101 GetContentsView()->AddChildView(view1); 101 GetContentsView()->AddChildView(view1);
102 GetContentsView()->AddChildView(view2); 102 GetContentsView()->AddChildView(view2);
103 103
104 TestFocusChangeListener listener; 104 TestFocusChangeListener listener;
105 AddFocusChangeListener(&listener); 105 AddFocusChangeListener(&listener);
106 106
107 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/det ails/520043/error-converting-from-null-to-a-pointer-type-in-std-pair 107 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/det ails/520043/error-converting-from-null-to-a-pointer-type-in-std-pair
108 views::View* null_view = NULL; 108 views::View* null_view = NULL;
109 109
110 view1->RequestFocus(); 110 view1->RequestFocus();
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 DISALLOW_COPY_AND_ASSIGN(FocusInAboutToRequestFocusFromTabTraversalView); 595 DISALLOW_COPY_AND_ASSIGN(FocusInAboutToRequestFocusFromTabTraversalView);
596 }; 596 };
597 } // namespace 597 } // namespace
598 598
599 // Verifies a focus change done during a call to 599 // Verifies a focus change done during a call to
600 // AboutToRequestFocusFromTabTraversal() is honored. 600 // AboutToRequestFocusFromTabTraversal() is honored.
601 TEST_F(FocusManagerTest, FocusInAboutToRequestFocusFromTabTraversal) { 601 TEST_F(FocusManagerTest, FocusInAboutToRequestFocusFromTabTraversal) {
602 // Create 3 views focuses the 3 and advances to the second. The 2nd views 602 // Create 3 views focuses the 3 and advances to the second. The 2nd views
603 // implementation of AboutToRequestFocusFromTabTraversal() focuses the first. 603 // implementation of AboutToRequestFocusFromTabTraversal() focuses the first.
604 views::View* v1 = new View; 604 views::View* v1 = new View;
605 v1->SetFocusable(true); 605 v1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
606 GetContentsView()->AddChildView(v1); 606 GetContentsView()->AddChildView(v1);
607 607
608 FocusInAboutToRequestFocusFromTabTraversalView* v2 = 608 FocusInAboutToRequestFocusFromTabTraversalView* v2 =
609 new FocusInAboutToRequestFocusFromTabTraversalView; 609 new FocusInAboutToRequestFocusFromTabTraversalView;
610 v2->SetFocusable(true); 610 v2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
611 v2->set_view_to_focus(v1); 611 v2->set_view_to_focus(v1);
612 GetContentsView()->AddChildView(v2); 612 GetContentsView()->AddChildView(v2);
613 613
614 views::View* v3 = new View; 614 views::View* v3 = new View;
615 v3->SetFocusable(true); 615 v3->SetFocusBehavior(View::FocusBehavior::ALWAYS);
616 GetContentsView()->AddChildView(v3); 616 GetContentsView()->AddChildView(v3);
617 617
618 v3->RequestFocus(); 618 v3->RequestFocus();
619 GetWidget()->GetFocusManager()->AdvanceFocus(true); 619 GetWidget()->GetFocusManager()->AdvanceFocus(true);
620 EXPECT_TRUE(v1->HasFocus()); 620 EXPECT_TRUE(v1->HasFocus());
621 } 621 }
622 622
623 TEST_F(FocusManagerTest, RotatePaneFocus) { 623 TEST_F(FocusManagerTest, RotatePaneFocus) {
624 views::AccessiblePaneView* pane1 = new AccessiblePaneView(); 624 views::AccessiblePaneView* pane1 = new AccessiblePaneView();
625 GetContentsView()->AddChildView(pane1); 625 GetContentsView()->AddChildView(pane1);
626 626
627 views::View* v1 = new View; 627 views::View* v1 = new View;
628 v1->SetFocusable(true); 628 v1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
629 pane1->AddChildView(v1); 629 pane1->AddChildView(v1);
630 630
631 views::View* v2 = new View; 631 views::View* v2 = new View;
632 v2->SetFocusable(true); 632 v2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
633 pane1->AddChildView(v2); 633 pane1->AddChildView(v2);
634 634
635 views::AccessiblePaneView* pane2 = new AccessiblePaneView(); 635 views::AccessiblePaneView* pane2 = new AccessiblePaneView();
636 GetContentsView()->AddChildView(pane2); 636 GetContentsView()->AddChildView(pane2);
637 637
638 views::View* v3 = new View; 638 views::View* v3 = new View;
639 v3->SetFocusable(true); 639 v3->SetFocusBehavior(View::FocusBehavior::ALWAYS);
640 pane2->AddChildView(v3); 640 pane2->AddChildView(v3);
641 641
642 views::View* v4 = new View; 642 views::View* v4 = new View;
643 v4->SetFocusable(true); 643 v4->SetFocusBehavior(View::FocusBehavior::ALWAYS);
644 pane2->AddChildView(v4); 644 pane2->AddChildView(v4);
645 645
646 std::vector<views::View*> panes; 646 std::vector<views::View*> panes;
647 panes.push_back(pane1); 647 panes.push_back(pane1);
648 panes.push_back(pane2); 648 panes.push_back(pane2);
649 SetAccessiblePanes(panes); 649 SetAccessiblePanes(panes);
650 650
651 FocusManager* focus_manager = GetWidget()->GetFocusManager(); 651 FocusManager* focus_manager = GetWidget()->GetFocusManager();
652 652
653 // Advance forwards. Focus should stay trapped within each pane. 653 // Advance forwards. Focus should stay trapped within each pane.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 EXPECT_EQ(v3, focus_manager->GetFocusedView()); 688 EXPECT_EQ(v3, focus_manager->GetFocusedView());
689 689
690 EXPECT_FALSE(focus_manager->RotatePaneFocus( 690 EXPECT_FALSE(focus_manager->RotatePaneFocus(
691 FocusManager::kForward, FocusManager::kNoWrap)); 691 FocusManager::kForward, FocusManager::kNoWrap));
692 EXPECT_EQ(v3, focus_manager->GetFocusedView()); 692 EXPECT_EQ(v3, focus_manager->GetFocusedView());
693 } 693 }
694 694
695 // Verifies the stored focus view tracks the focused view. 695 // Verifies the stored focus view tracks the focused view.
696 TEST_F(FocusManagerTest, ImplicitlyStoresFocus) { 696 TEST_F(FocusManagerTest, ImplicitlyStoresFocus) {
697 views::View* v1 = new View; 697 views::View* v1 = new View;
698 v1->SetFocusable(true); 698 v1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
699 GetContentsView()->AddChildView(v1); 699 GetContentsView()->AddChildView(v1);
700 700
701 views::View* v2 = new View; 701 views::View* v2 = new View;
702 v2->SetFocusable(true); 702 v2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
703 GetContentsView()->AddChildView(v2); 703 GetContentsView()->AddChildView(v2);
704 704
705 // Verify a focus request on |v1| implicitly updates the stored focus view. 705 // Verify a focus request on |v1| implicitly updates the stored focus view.
706 v1->RequestFocus(); 706 v1->RequestFocus();
707 EXPECT_TRUE(v1->HasFocus()); 707 EXPECT_TRUE(v1->HasFocus());
708 EXPECT_EQ(v1, GetWidget()->GetFocusManager()->GetStoredFocusView()); 708 EXPECT_EQ(v1, GetWidget()->GetFocusManager()->GetStoredFocusView());
709 709
710 // Verify a focus request on |v2| implicitly updates the stored focus view. 710 // Verify a focus request on |v2| implicitly updates the stored focus view.
711 v2->RequestFocus(); 711 v2->RequestFocus();
712 EXPECT_TRUE(v2->HasFocus()); 712 EXPECT_TRUE(v2->HasFocus());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 TEST_F(FocusManagerArrowKeyTraversalTest, ArrowKeyTraversal) { 746 TEST_F(FocusManagerArrowKeyTraversalTest, ArrowKeyTraversal) {
747 FocusManager* focus_manager = GetFocusManager(); 747 FocusManager* focus_manager = GetFocusManager();
748 const ui::KeyEvent left_key(ui::ET_KEY_PRESSED, ui::VKEY_LEFT, ui::EF_NONE); 748 const ui::KeyEvent left_key(ui::ET_KEY_PRESSED, ui::VKEY_LEFT, ui::EF_NONE);
749 const ui::KeyEvent right_key(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE); 749 const ui::KeyEvent right_key(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE);
750 const ui::KeyEvent up_key(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE); 750 const ui::KeyEvent up_key(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE);
751 const ui::KeyEvent down_key(ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE); 751 const ui::KeyEvent down_key(ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE);
752 752
753 std::vector<views::View*> v; 753 std::vector<views::View*> v;
754 for (size_t i = 0; i < 2; ++i) { 754 for (size_t i = 0; i < 2; ++i) {
755 views::View* view = new View; 755 views::View* view = new View;
756 view->SetFocusable(true); 756 view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
757 GetContentsView()->AddChildView(view); 757 GetContentsView()->AddChildView(view);
758 v.push_back(view); 758 v.push_back(view);
759 } 759 }
760 760
761 // Arrow key traversal is off and arrow key does not change focus. 761 // Arrow key traversal is off and arrow key does not change focus.
762 FocusManager::set_arrow_key_traversal_enabled(false); 762 FocusManager::set_arrow_key_traversal_enabled(false);
763 v[0]->RequestFocus(); 763 v[0]->RequestFocus();
764 focus_manager->OnKeyEvent(right_key); 764 focus_manager->OnKeyEvent(right_key);
765 EXPECT_EQ(v[0], focus_manager->GetFocusedView()); 765 EXPECT_EQ(v[0], focus_manager->GetFocusedView());
766 focus_manager->OnKeyEvent(left_key); 766 focus_manager->OnKeyEvent(left_key);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
827 827
828 DISALLOW_COPY_AND_ASSIGN(AdvanceFocusWidgetDelegate); 828 DISALLOW_COPY_AND_ASSIGN(AdvanceFocusWidgetDelegate);
829 }; 829 };
830 830
831 } // namespace 831 } // namespace
832 832
833 // Verifies focus wrapping happens in the same widget. 833 // Verifies focus wrapping happens in the same widget.
834 TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) { 834 TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) {
835 // Add |widget_view| as a child of the Widget. 835 // Add |widget_view| as a child of the Widget.
836 View* widget_view = new View; 836 View* widget_view = new View;
837 widget_view->SetFocusable(true); 837 widget_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
838 widget_view->SetBounds(20, 0, 20, 20); 838 widget_view->SetBounds(20, 0, 20, 20);
839 GetContentsView()->AddChildView(widget_view); 839 GetContentsView()->AddChildView(widget_view);
840 840
841 // Create a widget with two views, focus the second. 841 // Create a widget with two views, focus the second.
842 std::unique_ptr<AdvanceFocusWidgetDelegate> delegate; 842 std::unique_ptr<AdvanceFocusWidgetDelegate> delegate;
843 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); 843 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
844 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 844 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
845 params.child = true; 845 params.child = true;
846 params.bounds = gfx::Rect(10, 10, 100, 100); 846 params.bounds = gfx::Rect(10, 10, 100, 100);
847 params.parent = GetWidget()->GetNativeView(); 847 params.parent = GetWidget()->GetNativeView();
848 Widget child_widget; 848 Widget child_widget;
849 delegate.reset(new AdvanceFocusWidgetDelegate(&child_widget)); 849 delegate.reset(new AdvanceFocusWidgetDelegate(&child_widget));
850 params.delegate = delegate.get(); 850 params.delegate = delegate.get();
851 child_widget.Init(params); 851 child_widget.Init(params);
852 View* view1 = new View; 852 View* view1 = new View;
853 view1->SetFocusable(true); 853 view1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
854 view1->SetBounds(0, 0, 20, 20); 854 view1->SetBounds(0, 0, 20, 20);
855 View* view2 = new View; 855 View* view2 = new View;
856 view2->SetFocusable(true); 856 view2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
857 view2->SetBounds(20, 0, 20, 20); 857 view2->SetBounds(20, 0, 20, 20);
858 child_widget.client_view()->AddChildView(view1); 858 child_widget.client_view()->AddChildView(view1);
859 child_widget.client_view()->AddChildView(view2); 859 child_widget.client_view()->AddChildView(view2);
860 child_widget.Show(); 860 child_widget.Show();
861 view2->RequestFocus(); 861 view2->RequestFocus();
862 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); 862 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView());
863 863
864 // Advance focus backwards, which should focus the first. 864 // Advance focus backwards, which should focus the first.
865 GetFocusManager()->AdvanceFocus(false); 865 GetFocusManager()->AdvanceFocus(false);
866 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); 866 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView());
867 867
868 // Focus forward to |view2|. 868 // Focus forward to |view2|.
869 GetFocusManager()->AdvanceFocus(true); 869 GetFocusManager()->AdvanceFocus(true);
870 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView()); 870 EXPECT_EQ(view2, GetFocusManager()->GetFocusedView());
871 871
872 // And forward again, wrapping back to |view1|. 872 // And forward again, wrapping back to |view1|.
873 GetFocusManager()->AdvanceFocus(true); 873 GetFocusManager()->AdvanceFocus(true);
874 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView()); 874 EXPECT_EQ(view1, GetFocusManager()->GetFocusedView());
875 875
876 // Allow focus to go to the parent, and focus backwards which should now move 876 // Allow focus to go to the parent, and focus backwards which should now move
877 // up |widget_view| (in the parent). 877 // up |widget_view| (in the parent).
878 delegate->set_should_advance_focus_to_parent(true); 878 delegate->set_should_advance_focus_to_parent(true);
879 GetFocusManager()->AdvanceFocus(true); 879 GetFocusManager()->AdvanceFocus(true);
880 EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView()); 880 EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView());
881 } 881 }
882 882
883 } // namespace views 883 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698