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

Unified Diff: ui/views/focus/focus_traversal_unittest.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/focus/focus_search.cc ('k') | ui/views/focus/view_storage.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/focus/focus_traversal_unittest.cc
diff --git a/ui/views/focus/focus_traversal_unittest.cc b/ui/views/focus/focus_traversal_unittest.cc
deleted file mode 100644
index db55e9d65ea451c9ceff24573a98ba6127e3efe2..0000000000000000000000000000000000000000
--- a/ui/views/focus/focus_traversal_unittest.cc
+++ /dev/null
@@ -1,779 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/focus/focus_manager.h"
-
-#include "base/run_loop.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "ui/base/models/combobox_model.h"
-#include "ui/views/background.h"
-#include "ui/views/border.h"
-#include "ui/views/controls/button/checkbox.h"
-#include "ui/views/controls/button/label_button.h"
-#include "ui/views/controls/button/radio_button.h"
-#include "ui/views/controls/combobox/combobox.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/link.h"
-#include "ui/views/controls/native/native_view_host.h"
-#include "ui/views/controls/scroll_view.h"
-#include "ui/views/controls/tabbed_pane/tabbed_pane.h"
-#include "ui/views/controls/textfield/textfield.h"
-#include "ui/views/test/focus_manager_test.h"
-#include "ui/views/widget/root_view.h"
-#include "ui/views/widget/widget.h"
-
-using base::ASCIIToUTF16;
-
-namespace views {
-
-namespace {
-
-int count = 1;
-
-const int kTopCheckBoxID = count++; // 1
-const int kLeftContainerID = count++;
-const int kAppleLabelID = count++;
-const int kAppleTextfieldID = count++;
-const int kOrangeLabelID = count++; // 5
-const int kOrangeTextfieldID = count++;
-const int kBananaLabelID = count++;
-const int kBananaTextfieldID = count++;
-const int kKiwiLabelID = count++;
-const int kKiwiTextfieldID = count++; // 10
-const int kFruitButtonID = count++;
-const int kFruitCheckBoxID = count++;
-const int kComboboxID = count++;
-
-const int kRightContainerID = count++;
-const int kAsparagusButtonID = count++; // 15
-const int kBroccoliButtonID = count++;
-const int kCauliflowerButtonID = count++;
-
-const int kInnerContainerID = count++;
-const int kScrollViewID = count++;
-const int kRosettaLinkID = count++; // 20
-const int kStupeurEtTremblementLinkID = count++;
-const int kDinerGameLinkID = count++;
-const int kRidiculeLinkID = count++;
-const int kClosetLinkID = count++;
-const int kVisitingLinkID = count++; // 25
-const int kAmelieLinkID = count++;
-const int kJoyeuxNoelLinkID = count++;
-const int kCampingLinkID = count++;
-const int kBriceDeNiceLinkID = count++;
-const int kTaxiLinkID = count++; // 30
-const int kAsterixLinkID = count++;
-
-const int kOKButtonID = count++;
-const int kCancelButtonID = count++;
-const int kHelpButtonID = count++;
-
-const int kStyleContainerID = count++; // 35
-const int kBoldCheckBoxID = count++;
-const int kItalicCheckBoxID = count++;
-const int kUnderlinedCheckBoxID = count++;
-const int kStyleHelpLinkID = count++;
-const int kStyleTextEditID = count++; // 40
-
-const int kSearchContainerID = count++;
-const int kSearchTextfieldID = count++;
-const int kSearchButtonID = count++;
-const int kHelpLinkID = count++;
-
-const int kThumbnailContainerID = count++; // 45
-const int kThumbnailStarID = count++;
-const int kThumbnailSuperStarID = count++;
-
-class DummyComboboxModel : public ui::ComboboxModel {
- public:
- // Overridden from ui::ComboboxModel:
- virtual int GetItemCount() const override { return 10; }
- virtual base::string16 GetItemAt(int index) override {
- return ASCIIToUTF16("Item ") + base::IntToString16(index);
- }
-};
-
-// A View that can act as a pane.
-class PaneView : public View, public FocusTraversable {
- public:
- PaneView() : focus_search_(NULL) {}
-
- // If this method is called, this view will use GetPaneFocusTraversable to
- // have this provided FocusSearch used instead of the default one, allowing
- // you to trap focus within the pane.
- void EnablePaneFocus(FocusSearch* focus_search) {
- focus_search_ = focus_search;
- }
-
- // Overridden from View:
- virtual FocusTraversable* GetPaneFocusTraversable() override {
- if (focus_search_)
- return this;
- else
- return NULL;
- }
-
- // Overridden from FocusTraversable:
- virtual views::FocusSearch* GetFocusSearch() override {
- return focus_search_;
- }
- virtual FocusTraversable* GetFocusTraversableParent() override {
- return NULL;
- }
- virtual View* GetFocusTraversableParentView() override {
- return NULL;
- }
-
- private:
- FocusSearch* focus_search_;
-};
-
-// BorderView is a view containing a native window with its own view hierarchy.
-// It is interesting to test focus traversal from a view hierarchy to an inner
-// view hierarchy.
-class BorderView : public NativeViewHost {
- public:
- explicit BorderView(View* child) : child_(child), widget_(NULL) {
- DCHECK(child);
- SetFocusable(false);
- }
-
- virtual ~BorderView() {}
-
- virtual internal::RootView* GetContentsRootView() {
- return static_cast<internal::RootView*>(widget_->GetRootView());
- }
-
- virtual FocusTraversable* GetFocusTraversable() override {
- return static_cast<internal::RootView*>(widget_->GetRootView());
- }
-
- virtual void ViewHierarchyChanged(
- const ViewHierarchyChangedDetails& details) override {
- NativeViewHost::ViewHierarchyChanged(details);
-
- if (details.child == this && details.is_add) {
- if (!widget_) {
- widget_ = new Widget;
- Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
- params.parent = details.parent->GetWidget()->GetNativeView();
- widget_->Init(params);
- widget_->SetFocusTraversableParentView(this);
- widget_->SetContentsView(child_);
- }
-
- // We have been added to a view hierarchy, attach the native view.
- Attach(widget_->GetNativeView());
- // Also update the FocusTraversable parent so the focus traversal works.
- static_cast<internal::RootView*>(widget_->GetRootView())->
- SetFocusTraversableParent(GetWidget()->GetFocusTraversable());
- }
- }
-
- private:
- View* child_;
- Widget* widget_;
-
- DISALLOW_COPY_AND_ASSIGN(BorderView);
-};
-
-} // namespace
-
-class FocusTraversalTest : public FocusManagerTest {
- public:
- virtual ~FocusTraversalTest();
-
- virtual void InitContentView() override;
-
- protected:
- FocusTraversalTest();
-
- View* FindViewByID(int id) {
- View* view = GetContentsView()->GetViewByID(id);
- if (view)
- return view;
- if (style_tab_)
- view = style_tab_->GetSelectedTab()->GetViewByID(id);
- if (view)
- return view;
- view = search_border_view_->GetContentsRootView()->GetViewByID(id);
- if (view)
- return view;
- return NULL;
- }
-
- protected:
- TabbedPane* style_tab_;
- BorderView* search_border_view_;
- DummyComboboxModel combobox_model_;
- PaneView* left_container_;
- PaneView* right_container_;
-
- DISALLOW_COPY_AND_ASSIGN(FocusTraversalTest);
-};
-
-FocusTraversalTest::FocusTraversalTest()
- : style_tab_(NULL),
- search_border_view_(NULL) {
-}
-
-FocusTraversalTest::~FocusTraversalTest() {
-}
-
-void FocusTraversalTest::InitContentView() {
- // Create a complicated view hierarchy with lots of control types for
- // use by all of the focus traversal tests.
- //
- // Class name, ID, and asterisk next to focusable views:
- //
- // View
- // Checkbox * kTopCheckBoxID
- // PaneView kLeftContainerID
- // Label kAppleLabelID
- // Textfield * kAppleTextfieldID
- // Label kOrangeLabelID
- // Textfield * kOrangeTextfieldID
- // Label kBananaLabelID
- // Textfield * kBananaTextfieldID
- // Label kKiwiLabelID
- // Textfield * kKiwiTextfieldID
- // NativeButton * kFruitButtonID
- // Checkbox * kFruitCheckBoxID
- // Combobox * kComboboxID
- // PaneView kRightContainerID
- // RadioButton * kAsparagusButtonID
- // RadioButton * kBroccoliButtonID
- // RadioButton * kCauliflowerButtonID
- // View kInnerContainerID
- // ScrollView kScrollViewID
- // View
- // Link * kRosettaLinkID
- // Link * kStupeurEtTremblementLinkID
- // Link * kDinerGameLinkID
- // Link * kRidiculeLinkID
- // Link * kClosetLinkID
- // Link * kVisitingLinkID
- // Link * kAmelieLinkID
- // Link * kJoyeuxNoelLinkID
- // Link * kCampingLinkID
- // Link * kBriceDeNiceLinkID
- // Link * kTaxiLinkID
- // Link * kAsterixLinkID
- // NativeButton * kOKButtonID
- // NativeButton * kCancelButtonID
- // NativeButton * kHelpButtonID
- // TabbedPane * kStyleContainerID
- // View
- // Checkbox * kBoldCheckBoxID
- // Checkbox * kItalicCheckBoxID
- // Checkbox * kUnderlinedCheckBoxID
- // Link * kStyleHelpLinkID
- // Textfield * kStyleTextEditID
- // Other
- // BorderView kSearchContainerID
- // View
- // Textfield * kSearchTextfieldID
- // NativeButton * kSearchButtonID
- // Link * kHelpLinkID
- // View * kThumbnailContainerID
- // NativeButton * kThumbnailStarID
- // NativeButton * kThumbnailSuperStarID
-
- GetContentsView()->set_background(
- Background::CreateSolidBackground(SK_ColorWHITE));
-
- Checkbox* cb = new Checkbox(ASCIIToUTF16("This is a checkbox"));
- GetContentsView()->AddChildView(cb);
- // In this fast paced world, who really has time for non hard-coded layout?
- cb->SetBounds(10, 10, 200, 20);
- cb->set_id(kTopCheckBoxID);
-
- left_container_ = new PaneView();
- left_container_->SetBorder(Border::CreateSolidBorder(1, SK_ColorBLACK));
- left_container_->set_background(
- Background::CreateSolidBackground(240, 240, 240));
- left_container_->set_id(kLeftContainerID);
- GetContentsView()->AddChildView(left_container_);
- left_container_->SetBounds(10, 35, 250, 200);
-
- int label_x = 5;
- int label_width = 50;
- int label_height = 15;
- int text_field_width = 150;
- int y = 10;
- int gap_between_labels = 10;
-
- Label* label = new Label(ASCIIToUTF16("Apple:"));
- label->set_id(kAppleLabelID);
- left_container_->AddChildView(label);
- label->SetBounds(label_x, y, label_width, label_height);
-
- Textfield* text_field = new Textfield();
- text_field->set_id(kAppleTextfieldID);
- left_container_->AddChildView(text_field);
- text_field->SetBounds(label_x + label_width + 5, y,
- text_field_width, label_height);
-
- y += label_height + gap_between_labels;
-
- label = new Label(ASCIIToUTF16("Orange:"));
- label->set_id(kOrangeLabelID);
- left_container_->AddChildView(label);
- label->SetBounds(label_x, y, label_width, label_height);
-
- text_field = new Textfield();
- text_field->set_id(kOrangeTextfieldID);
- left_container_->AddChildView(text_field);
- text_field->SetBounds(label_x + label_width + 5, y,
- text_field_width, label_height);
-
- y += label_height + gap_between_labels;
-
- label = new Label(ASCIIToUTF16("Banana:"));
- label->set_id(kBananaLabelID);
- left_container_->AddChildView(label);
- label->SetBounds(label_x, y, label_width, label_height);
-
- text_field = new Textfield();
- text_field->set_id(kBananaTextfieldID);
- left_container_->AddChildView(text_field);
- text_field->SetBounds(label_x + label_width + 5, y,
- text_field_width, label_height);
-
- y += label_height + gap_between_labels;
-
- label = new Label(ASCIIToUTF16("Kiwi:"));
- label->set_id(kKiwiLabelID);
- left_container_->AddChildView(label);
- label->SetBounds(label_x, y, label_width, label_height);
-
- text_field = new Textfield();
- text_field->set_id(kKiwiTextfieldID);
- left_container_->AddChildView(text_field);
- text_field->SetBounds(label_x + label_width + 5, y,
- text_field_width, label_height);
-
- y += label_height + gap_between_labels;
-
- LabelButton* button = new LabelButton(NULL, ASCIIToUTF16("Click me"));
- button->SetStyle(Button::STYLE_BUTTON);
- button->SetBounds(label_x, y + 10, 80, 30);
- button->set_id(kFruitButtonID);
- left_container_->AddChildView(button);
- y += 40;
-
- cb = new Checkbox(ASCIIToUTF16("This is another check box"));
- cb->SetBounds(label_x + label_width + 5, y, 180, 20);
- cb->set_id(kFruitCheckBoxID);
- left_container_->AddChildView(cb);
- y += 20;
-
- Combobox* combobox = new Combobox(&combobox_model_);
- combobox->SetBounds(label_x + label_width + 5, y, 150, 30);
- combobox->set_id(kComboboxID);
- left_container_->AddChildView(combobox);
-
- right_container_ = new PaneView();
- right_container_->SetBorder(Border::CreateSolidBorder(1, SK_ColorBLACK));
- right_container_->set_background(
- Background::CreateSolidBackground(240, 240, 240));
- right_container_->set_id(kRightContainerID);
- GetContentsView()->AddChildView(right_container_);
- right_container_->SetBounds(270, 35, 300, 200);
-
- y = 10;
- int radio_button_height = 18;
- int gap_between_radio_buttons = 10;
- RadioButton* radio_button = new RadioButton(ASCIIToUTF16("Asparagus"), 1);
- radio_button->set_id(kAsparagusButtonID);
- right_container_->AddChildView(radio_button);
- radio_button->SetBounds(5, y, 70, radio_button_height);
- radio_button->SetGroup(1);
- y += radio_button_height + gap_between_radio_buttons;
- radio_button = new RadioButton(ASCIIToUTF16("Broccoli"), 1);
- radio_button->set_id(kBroccoliButtonID);
- right_container_->AddChildView(radio_button);
- radio_button->SetBounds(5, y, 70, radio_button_height);
- radio_button->SetGroup(1);
- RadioButton* radio_button_to_check = radio_button;
- y += radio_button_height + gap_between_radio_buttons;
- radio_button = new RadioButton(ASCIIToUTF16("Cauliflower"), 1);
- radio_button->set_id(kCauliflowerButtonID);
- right_container_->AddChildView(radio_button);
- radio_button->SetBounds(5, y, 70, radio_button_height);
- radio_button->SetGroup(1);
- y += radio_button_height + gap_between_radio_buttons;
-
- View* inner_container = new View();
- inner_container->SetBorder(Border::CreateSolidBorder(1, SK_ColorBLACK));
- inner_container->set_background(
- Background::CreateSolidBackground(230, 230, 230));
- inner_container->set_id(kInnerContainerID);
- right_container_->AddChildView(inner_container);
- inner_container->SetBounds(100, 10, 150, 180);
-
- ScrollView* scroll_view = new ScrollView();
- scroll_view->set_id(kScrollViewID);
- inner_container->AddChildView(scroll_view);
- scroll_view->SetBounds(1, 1, 148, 178);
-
- View* scroll_content = new View();
- scroll_content->SetBounds(0, 0, 200, 200);
- scroll_content->set_background(
- Background::CreateSolidBackground(200, 200, 200));
- scroll_view->SetContents(scroll_content);
-
- static const char* const kTitles[] = {
- "Rosetta", "Stupeur et tremblement", "The diner game",
- "Ridicule", "Le placard", "Les Visiteurs", "Amelie",
- "Joyeux Noel", "Camping", "Brice de Nice",
- "Taxi", "Asterix"
- };
-
- static const int kIDs[] = {
- kRosettaLinkID, kStupeurEtTremblementLinkID, kDinerGameLinkID,
- kRidiculeLinkID, kClosetLinkID, kVisitingLinkID, kAmelieLinkID,
- kJoyeuxNoelLinkID, kCampingLinkID, kBriceDeNiceLinkID,
- kTaxiLinkID, kAsterixLinkID
- };
-
- DCHECK(arraysize(kTitles) == arraysize(kIDs));
-
- y = 5;
- for (size_t i = 0; i < arraysize(kTitles); ++i) {
- Link* link = new Link(ASCIIToUTF16(kTitles[i]));
- link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- link->set_id(kIDs[i]);
- scroll_content->AddChildView(link);
- link->SetBounds(5, y, 300, 15);
- y += 15;
- }
-
- y = 250;
- int width = 60;
- button = new LabelButton(NULL, ASCIIToUTF16("OK"));
- button->SetStyle(Button::STYLE_BUTTON);
- button->set_id(kOKButtonID);
- button->SetIsDefault(true);
-
- GetContentsView()->AddChildView(button);
- button->SetBounds(150, y, width, 30);
-
- button = new LabelButton(NULL, ASCIIToUTF16("Cancel"));
- button->SetStyle(Button::STYLE_BUTTON);
- button->set_id(kCancelButtonID);
- GetContentsView()->AddChildView(button);
- button->SetBounds(220, y, width, 30);
-
- button = new LabelButton(NULL, ASCIIToUTF16("Help"));
- button->SetStyle(Button::STYLE_BUTTON);
- button->set_id(kHelpButtonID);
- GetContentsView()->AddChildView(button);
- button->SetBounds(290, y, width, 30);
-
- y += 40;
-
- View* contents = NULL;
- Link* link = NULL;
-
- // Left bottom box with style checkboxes.
- contents = new View();
- contents->set_background(Background::CreateSolidBackground(SK_ColorWHITE));
- cb = new Checkbox(ASCIIToUTF16("Bold"));
- contents->AddChildView(cb);
- cb->SetBounds(10, 10, 50, 20);
- cb->set_id(kBoldCheckBoxID);
-
- cb = new Checkbox(ASCIIToUTF16("Italic"));
- contents->AddChildView(cb);
- cb->SetBounds(70, 10, 50, 20);
- cb->set_id(kItalicCheckBoxID);
-
- cb = new Checkbox(ASCIIToUTF16("Underlined"));
- contents->AddChildView(cb);
- cb->SetBounds(130, 10, 70, 20);
- cb->set_id(kUnderlinedCheckBoxID);
-
- link = new Link(ASCIIToUTF16("Help"));
- contents->AddChildView(link);
- link->SetBounds(10, 35, 70, 10);
- link->set_id(kStyleHelpLinkID);
-
- text_field = new Textfield();
- contents->AddChildView(text_field);
- text_field->SetBounds(10, 50, 100, 20);
- text_field->set_id(kStyleTextEditID);
-
- style_tab_ = new TabbedPane();
- style_tab_->set_id(kStyleContainerID);
- GetContentsView()->AddChildView(style_tab_);
- style_tab_->SetBounds(10, y, 210, 100);
- style_tab_->AddTab(ASCIIToUTF16("Style"), contents);
- style_tab_->AddTab(ASCIIToUTF16("Other"), new View());
-
- // Right bottom box with search.
- contents = new View();
- contents->set_background(Background::CreateSolidBackground(SK_ColorWHITE));
- text_field = new Textfield();
- contents->AddChildView(text_field);
- text_field->SetBounds(10, 10, 100, 20);
- text_field->set_id(kSearchTextfieldID);
-
- button = new LabelButton(NULL, ASCIIToUTF16("Search"));
- button->SetStyle(Button::STYLE_BUTTON);
- contents->AddChildView(button);
- button->SetBounds(112, 5, 60, 30);
- button->set_id(kSearchButtonID);
-
- link = new Link(ASCIIToUTF16("Help"));
- link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- link->set_id(kHelpLinkID);
- contents->AddChildView(link);
- link->SetBounds(175, 10, 30, 20);
-
- search_border_view_ = new BorderView(contents);
- search_border_view_->set_id(kSearchContainerID);
-
- GetContentsView()->AddChildView(search_border_view_);
- search_border_view_->SetBounds(300, y, 240, 50);
-
- y += 60;
-
- contents = new View();
- contents->SetFocusable(true);
- contents->set_background(Background::CreateSolidBackground(SK_ColorBLUE));
- contents->set_id(kThumbnailContainerID);
- button = new LabelButton(NULL, ASCIIToUTF16("Star"));
- button->SetStyle(Button::STYLE_BUTTON);
- contents->AddChildView(button);
- button->SetBounds(5, 5, 50, 30);
- button->set_id(kThumbnailStarID);
- button = new LabelButton(NULL, ASCIIToUTF16("SuperStar"));
- button->SetStyle(Button::STYLE_BUTTON);
- contents->AddChildView(button);
- button->SetBounds(60, 5, 100, 30);
- button->set_id(kThumbnailSuperStarID);
-
- GetContentsView()->AddChildView(contents);
- contents->SetBounds(250, y, 200, 50);
- // We can only call RadioButton::SetChecked() on the radio-button is part of
- // the view hierarchy.
- radio_button_to_check->SetChecked(true);
-}
-
-TEST_F(FocusTraversalTest, NormalTraversal) {
- const int kTraversalIDs[] = { kTopCheckBoxID, kAppleTextfieldID,
- kOrangeTextfieldID, kBananaTextfieldID, kKiwiTextfieldID,
- kFruitButtonID, kFruitCheckBoxID, kComboboxID, kBroccoliButtonID,
- kRosettaLinkID, kStupeurEtTremblementLinkID,
- kDinerGameLinkID, kRidiculeLinkID, kClosetLinkID, kVisitingLinkID,
- kAmelieLinkID, kJoyeuxNoelLinkID, kCampingLinkID, kBriceDeNiceLinkID,
- kTaxiLinkID, kAsterixLinkID, kOKButtonID, kCancelButtonID, kHelpButtonID,
- kStyleContainerID, kBoldCheckBoxID, kItalicCheckBoxID,
- kUnderlinedCheckBoxID, kStyleHelpLinkID, kStyleTextEditID,
- kSearchTextfieldID, kSearchButtonID, kHelpLinkID,
- kThumbnailContainerID, kThumbnailStarID, kThumbnailSuperStarID };
-
- // Let's traverse the whole focus hierarchy (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);
- View* focused_view = GetFocusManager()->GetFocusedView();
- EXPECT_TRUE(focused_view != NULL);
- if (focused_view)
- EXPECT_EQ(kTraversalIDs[j], focused_view->id());
- }
- }
-
- // Let's traverse in reverse order.
- GetFocusManager()->ClearFocus();
- for (int i = 0; i < 3; ++i) {
- for (int j = arraysize(kTraversalIDs) - 1; j >= 0; --j) {
- GetFocusManager()->AdvanceFocus(true);
- View* focused_view = GetFocusManager()->GetFocusedView();
- EXPECT_TRUE(focused_view != NULL);
- if (focused_view)
- EXPECT_EQ(kTraversalIDs[j], focused_view->id());
- }
- }
-}
-
-TEST_F(FocusTraversalTest, TraversalWithNonEnabledViews) {
- const int kDisabledIDs[] = {
- kBananaTextfieldID, kFruitCheckBoxID, kComboboxID, kAsparagusButtonID,
- kCauliflowerButtonID, kClosetLinkID, kVisitingLinkID, kBriceDeNiceLinkID,
- kTaxiLinkID, kAsterixLinkID, kHelpButtonID, kBoldCheckBoxID,
- kSearchTextfieldID, kHelpLinkID };
-
- const int kTraversalIDs[] = { kTopCheckBoxID, kAppleTextfieldID,
- kOrangeTextfieldID, kKiwiTextfieldID, kFruitButtonID, kBroccoliButtonID,
- kRosettaLinkID, kStupeurEtTremblementLinkID, kDinerGameLinkID,
- kRidiculeLinkID, kAmelieLinkID, kJoyeuxNoelLinkID, kCampingLinkID,
- kOKButtonID, kCancelButtonID, kStyleContainerID, kItalicCheckBoxID,
- kUnderlinedCheckBoxID, kStyleHelpLinkID, kStyleTextEditID,
- kSearchButtonID, kThumbnailContainerID, kThumbnailStarID,
- kThumbnailSuperStarID };
-
- // Let's disable some views.
- for (size_t i = 0; i < arraysize(kDisabledIDs); i++) {
- View* v = FindViewByID(kDisabledIDs[i]);
- ASSERT_TRUE(v != NULL);
- v->SetEnabled(false);
- }
-
- 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->id());
- }
- }
-
- // 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->id());
- }
- }
-}
-
-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);
- }
-
- 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->id());
- }
- }
-
- // 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->id());
- }
- }
-}
-
-TEST_F(FocusTraversalTest, PaneTraversal) {
- // Tests trapping the traversal within a pane - useful for full
- // keyboard accessibility for toolbars.
-
- // First test the left container.
- const int kLeftTraversalIDs[] = {
- kAppleTextfieldID,
- kOrangeTextfieldID, kBananaTextfieldID, kKiwiTextfieldID,
- kFruitButtonID, kFruitCheckBoxID, kComboboxID };
-
- FocusSearch focus_search_left(left_container_, true, false);
- left_container_->EnablePaneFocus(&focus_search_left);
- FindViewByID(kComboboxID)->RequestFocus();
-
- // Traverse the focus hierarchy within the pane several times.
- for (int i = 0; i < 3; ++i) {
- for (size_t j = 0; j < arraysize(kLeftTraversalIDs); j++) {
- GetFocusManager()->AdvanceFocus(false);
- View* focused_view = GetFocusManager()->GetFocusedView();
- EXPECT_TRUE(focused_view != NULL);
- if (focused_view)
- EXPECT_EQ(kLeftTraversalIDs[j], focused_view->id());
- }
- }
-
- // Traverse in reverse order.
- FindViewByID(kAppleTextfieldID)->RequestFocus();
- for (int i = 0; i < 3; ++i) {
- for (int j = arraysize(kLeftTraversalIDs) - 1; j >= 0; --j) {
- GetFocusManager()->AdvanceFocus(true);
- View* focused_view = GetFocusManager()->GetFocusedView();
- EXPECT_TRUE(focused_view != NULL);
- if (focused_view)
- EXPECT_EQ(kLeftTraversalIDs[j], focused_view->id());
- }
- }
-
- // Now test the right container, but this time with accessibility mode.
- // Make some links not focusable, but mark one of them as
- // "accessibility focusable", so it should show up in the traversal.
- const int kRightTraversalIDs[] = {
- kBroccoliButtonID, kDinerGameLinkID, kRidiculeLinkID,
- kClosetLinkID, kVisitingLinkID, kAmelieLinkID, kJoyeuxNoelLinkID,
- kCampingLinkID, kBriceDeNiceLinkID, kTaxiLinkID, kAsterixLinkID };
-
- FocusSearch focus_search_right(right_container_, true, true);
- right_container_->EnablePaneFocus(&focus_search_right);
- FindViewByID(kRosettaLinkID)->SetFocusable(false);
- FindViewByID(kStupeurEtTremblementLinkID)->SetFocusable(false);
- FindViewByID(kDinerGameLinkID)->SetAccessibilityFocusable(true);
- FindViewByID(kDinerGameLinkID)->SetFocusable(false);
- FindViewByID(kAsterixLinkID)->RequestFocus();
-
- // Traverse the focus hierarchy within the pane several times.
- for (int i = 0; i < 3; ++i) {
- for (size_t j = 0; j < arraysize(kRightTraversalIDs); j++) {
- GetFocusManager()->AdvanceFocus(false);
- View* focused_view = GetFocusManager()->GetFocusedView();
- EXPECT_TRUE(focused_view != NULL);
- if (focused_view)
- EXPECT_EQ(kRightTraversalIDs[j], focused_view->id());
- }
- }
-
- // Traverse in reverse order.
- FindViewByID(kBroccoliButtonID)->RequestFocus();
- for (int i = 0; i < 3; ++i) {
- for (int j = arraysize(kRightTraversalIDs) - 1; j >= 0; --j) {
- GetFocusManager()->AdvanceFocus(true);
- View* focused_view = GetFocusManager()->GetFocusedView();
- EXPECT_TRUE(focused_view != NULL);
- if (focused_view)
- EXPECT_EQ(kRightTraversalIDs[j], focused_view->id());
- }
- }
-}
-
-} // namespace views
« no previous file with comments | « ui/views/focus/focus_search.cc ('k') | ui/views/focus/view_storage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698