diff options
author | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-14 08:21:25 +0000 |
---|---|---|
committer | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-14 08:21:25 +0000 |
commit | 1aa365531b5367051df6588eacf2fb6a6dd396c1 (patch) | |
tree | 42e5686efc7484917b25ad6b5b90773c0f295439 /views | |
parent | 9fb3102a8332d0c49dc5c49733b7eb13c1d2a0b8 (diff) | |
download | chromium_src-1aa365531b5367051df6588eacf2fb6a6dd396c1.zip chromium_src-1aa365531b5367051df6588eacf2fb6a6dd396c1.tar.gz chromium_src-1aa365531b5367051df6588eacf2fb6a6dd396c1.tar.bz2 |
Prevent non-visible views from getting focused.
BUG=48719
TEST=FocusManagerTest.TraversalWithNonVisibleViews
Review URL: http://codereview.chromium.org/2935005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52293 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/focus/focus_manager_unittest.cc | 55 | ||||
-rw-r--r-- | views/view.cc | 5 |
2 files changed, 56 insertions, 4 deletions
diff --git a/views/focus/focus_manager_unittest.cc b/views/focus/focus_manager_unittest.cc index ae585a7..11e982a 100644 --- a/views/focus/focus_manager_unittest.cc +++ b/views/focus/focus_manager_unittest.cc @@ -1114,8 +1114,59 @@ TEST_F(FocusTraversalTest, TraversalWithNonEnabledViews) { for (size_t i = 0; i < arraysize(kDisabledIDs); i++) { View* v = FindViewByID(kDisabledIDs[i]); ASSERT_TRUE(v != NULL); - if (v) - v->SetEnabled(false); + v->SetEnabled(false); + } + + // Uncomment the following line if you want to test manually the UI of this + // test. + // MessageLoopForUI::current()->Run(new AcceleratorHandler()); + + View* focused_view; + // Let's do one traversal (several times, to make sure it loops ok). + GetFocusManager()->ClearFocus(); + for (int i = 0; i < 3; ++i) { + for (size_t j = 0; j < arraysize(kTraversalIDs); j++) { + GetFocusManager()->AdvanceFocus(false); + focused_view = GetFocusManager()->GetFocusedView(); + EXPECT_TRUE(focused_view != NULL); + if (focused_view) + EXPECT_EQ(kTraversalIDs[j], focused_view->GetID()); + } + } + + // Same thing in reverse. + GetFocusManager()->ClearFocus(); + for (int i = 0; i < 3; ++i) { + for (int j = arraysize(kTraversalIDs) - 1; j >= 0; --j) { + GetFocusManager()->AdvanceFocus(true); + focused_view = GetFocusManager()->GetFocusedView(); + EXPECT_TRUE(focused_view != NULL); + if (focused_view) + EXPECT_EQ(kTraversalIDs[j], focused_view->GetID()); + } + } +} + +TEST_F(FocusTraversalTest, TraversalWithInvisibleViews) { + const int kInvisibleIDs[] = { kTopCheckBoxID, kOKButtonID, + kThumbnailContainerID }; + + const int kTraversalIDs[] = { kAppleTextfieldID, kOrangeTextfieldID, + kBananaTextfieldID, kKiwiTextfieldID, kFruitButtonID, kFruitCheckBoxID, + kComboboxID, kBroccoliButtonID, kRosettaLinkID, + kStupeurEtTremblementLinkID, kDinerGameLinkID, kRidiculeLinkID, + kClosetLinkID, kVisitingLinkID, kAmelieLinkID, kJoyeuxNoelLinkID, + kCampingLinkID, kBriceDeNiceLinkID, kTaxiLinkID, kAsterixLinkID, + kCancelButtonID, kHelpButtonID, kStyleContainerID, kBoldCheckBoxID, + kItalicCheckBoxID, kUnderlinedCheckBoxID, kStyleHelpLinkID, + kStyleTextEditID, kSearchTextfieldID, kSearchButtonID, kHelpLinkID }; + + + // Let's make some views invisible. + for (size_t i = 0; i < arraysize(kInvisibleIDs); i++) { + View* v = FindViewByID(kInvisibleIDs[i]); + ASSERT_TRUE(v != NULL); + v->SetVisible(false); } // Uncomment the following line if you want to test manually the UI of this diff --git a/views/view.cc b/views/view.cc index d3a9b98..69cf67f 100644 --- a/views/view.cc +++ b/views/view.cc @@ -264,7 +264,7 @@ void View::SetEnabled(bool state) { } bool View::IsFocusable() const { - return focusable_ && IsEnabled() && IsVisible(); + return focusable_ && IsEnabled() && IsVisibleInRootView(); } void View::SetFocusable(bool focusable) { @@ -272,7 +272,8 @@ void View::SetFocusable(bool focusable) { } bool View::IsAccessibilityFocusable() const { - return (focusable_ || accessibility_focusable_) && IsEnabled() && IsVisible(); + return (focusable_ || accessibility_focusable_) && IsEnabled() && + IsVisibleInRootView(); } FocusManager* View::GetFocusManager() { |