summaryrefslogtreecommitdiffstats
path: root/chrome/views/focus
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-17 04:56:55 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-17 04:56:55 +0000
commit6f3290938a0f8a839ce75df6359d36145ba3b6af (patch)
tree338c21aafe3f28f94a3d7134cf96ad4a13f63459 /chrome/views/focus
parent0520d327302fe86f633191d68d56925fd64719fc (diff)
downloadchromium_src-6f3290938a0f8a839ce75df6359d36145ba3b6af.zip
chromium_src-6f3290938a0f8a839ce75df6359d36145ba3b6af.tar.gz
chromium_src-6f3290938a0f8a839ce75df6359d36145ba3b6af.tar.bz2
Move controls into their own dir under chrome/views/controls
TBR=sky Review URL: http://codereview.chromium.org/48058 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@11841 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/views/focus')
-rw-r--r--chrome/views/focus/focus_manager_unittest.cc666
1 files changed, 666 insertions, 0 deletions
diff --git a/chrome/views/focus/focus_manager_unittest.cc b/chrome/views/focus/focus_manager_unittest.cc
new file mode 100644
index 0000000..5a78f32
--- /dev/null
+++ b/chrome/views/focus/focus_manager_unittest.cc
@@ -0,0 +1,666 @@
+// Copyright (c) 2006-2008 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.
+
+// Disabled right now as this won't work on BuildBots right now as this test
+// require the box it runs on to be unlocked (and no screen-savers).
+// The test actually simulates mouse and key events, so if the screen is locked,
+// the events don't go to the Chrome window.
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "base/gfx/rect.h"
+#include "chrome/common/resource_bundle.h"
+#include "chrome/views/background.h"
+#include "chrome/views/border.h"
+#include "chrome/views/controls/button/checkbox.h"
+#include "chrome/views/controls/button/native_button.h"
+#include "chrome/views/controls/button/radio_button.h"
+#include "chrome/views/controls/label.h"
+#include "chrome/views/controls/link.h"
+#include "chrome/views/controls/scroll_view.h"
+#include "chrome/views/controls/tabbed_pane.h"
+#include "chrome/views/controls/text_field.h"
+#include "chrome/views/widget/accelerator_handler.h"
+#include "chrome/views/widget/root_view.h"
+#include "chrome/views/widget/widget_win.h"
+#include "chrome/views/window/window.h"
+#include "chrome/views/window/window_delegate.h"
+#include "SkColor.h"
+
+
+namespace {
+
+static const int kWindowWidth = 600;
+static const int kWindowHeight = 500;
+
+static int count = 1;
+
+static const int kTopCheckBoxID = count++; // 1
+static const int kLeftContainerID = count++;
+static const int kAppleLabelID = count++;
+static const int kAppleTextFieldID = count++;
+static const int kOrangeLabelID = count++; // 5
+static const int kOrangeTextFieldID = count++;
+static const int kBananaLabelID = count++;
+static const int kBananaTextFieldID = count++;
+static const int kKiwiLabelID = count++;
+static const int kKiwiTextFieldID = count++; // 10
+static const int kFruitButtonID = count++;
+static const int kFruitCheckBoxID = count++;
+
+static const int kRightContainerID = count++;
+static const int kAsparagusButtonID = count++;
+static const int kBroccoliButtonID = count++; // 15
+static const int kCauliflowerButtonID = count++;
+
+static const int kInnerContainerID = count++;
+static const int kScrollViewID = count++;
+static const int kScrollContentViewID = count++;
+static const int kRosettaLinkID = count++; // 20
+static const int kStupeurEtTremblementLinkID = count++;
+static const int kDinerGameLinkID = count++;
+static const int kRidiculeLinkID = count++;
+static const int kClosetLinkID = count++;
+static const int kVisitingLinkID = count++; // 25
+static const int kAmelieLinkID = count++;
+static const int kJoyeuxNoelLinkID = count++;
+static const int kCampingLinkID = count++;
+static const int kBriceDeNiceLinkID = count++;
+static const int kTaxiLinkID = count++; // 30
+static const int kAsterixLinkID = count++;
+
+static const int kOKButtonID = count++;
+static const int kCancelButtonID = count++;
+static const int kHelpButtonID = count++;
+
+static const int kStyleContainerID = count++; // 35
+static const int kBoldCheckBoxID = count++;
+static const int kItalicCheckBoxID = count++;
+static const int kUnderlinedCheckBoxID = count++;
+
+static const int kSearchContainerID = count++;
+static const int kSearchTextFieldID = count++; // 40
+static const int kSearchButtonID = count++;
+static const int kHelpLinkID = count++;
+
+static const int kThumbnailContainerID = count++;
+static const int kThumbnailStarID = count++;
+static const int kThumbnailSuperStarID = count++;
+
+class FocusManagerTest;
+
+// BorderView is a NativeControl that creates a tab control as its child and
+// takes a View to add as the child of the tab control. The tab control is used
+// to give a nice background for the view. At some point we'll have a real
+// wrapper for TabControl, and this can be nuked in favor of it.
+// Taken from keyword_editor_view.cc.
+// It is interesting in our test as it is a native control containing another
+// RootView.
+class BorderView : public views::NativeControl {
+ public:
+ explicit BorderView(View* child) : child_(child) {
+ DCHECK(child);
+ SetFocusable(false);
+ }
+
+ virtual ~BorderView() {}
+
+ virtual HWND CreateNativeControl(HWND parent_container) {
+ // Create the tab control.
+ HWND tab_control = ::CreateWindowEx(GetAdditionalExStyle(),
+ WC_TABCONTROL,
+ L"",
+ WS_CHILD,
+ 0, 0, width(), height(),
+ parent_container, NULL, NULL, NULL);
+ // Create the view container which is a child of the TabControl.
+ widget_ = new views::WidgetWin();
+ widget_->Init(tab_control, gfx::Rect(), false);
+ widget_->SetContentsView(child_);
+ widget_->SetFocusTraversableParentView(this);
+ ResizeContents(tab_control);
+ return tab_control;
+ }
+
+ virtual LRESULT OnNotify(int w_param, LPNMHDR l_param) {
+ return 0;
+ }
+
+ virtual void Layout() {
+ NativeControl::Layout();
+ ResizeContents(GetNativeControlHWND());
+ }
+
+ virtual views::RootView* GetContentsRootView() {
+ return widget_->GetRootView();
+ }
+
+ virtual views::FocusTraversable* GetFocusTraversable() {
+ return widget_;
+ }
+
+ virtual void ViewHierarchyChanged(bool is_add, View *parent, View *child) {
+ NativeControl::ViewHierarchyChanged(is_add, parent, child);
+
+ if (child == this && is_add) {
+ // We have been added to a view hierarchy, update the FocusTraversable
+ // parent.
+ widget_->SetFocusTraversableParent(GetRootView());
+ }
+ }
+
+private:
+ void ResizeContents(HWND tab_control) {
+ DCHECK(tab_control);
+ CRect content_bounds;
+ if (!GetClientRect(tab_control, &content_bounds))
+ return;
+ TabCtrl_AdjustRect(tab_control, FALSE, &content_bounds);
+ widget_->MoveWindow(content_bounds.left, content_bounds.top,
+ content_bounds.Width(), content_bounds.Height(),
+ TRUE);
+ }
+
+ View* child_;
+ views::WidgetWin* widget_;
+
+ DISALLOW_EVIL_CONSTRUCTORS(BorderView);
+};
+
+class TestViewWindow : public views::WidgetWin {
+ public:
+ explicit TestViewWindow(FocusManagerTest* test);
+ ~TestViewWindow() { }
+
+ void Init();
+
+ views::View* contents() const { return contents_; }
+
+
+ // Return the ID of the component that currently has the focus.
+ int GetFocusedComponentID();
+
+ // Simulate pressing the tab button in the window.
+ void PressTab(bool shift_pressed, bool ctrl_pressed);
+
+ views::RootView* GetContentsRootView() const {
+ return contents_->GetRootView();
+ }
+
+ views::RootView* GetStyleRootView() const {
+ return style_tab_->GetContentsRootView();
+ }
+
+ views::RootView* GetSearchRootView() const {
+ return search_border_view_->GetContentsRootView();
+ }
+
+ private:
+ views::View* contents_;
+
+ views::TabbedPane* style_tab_;
+ BorderView* search_border_view_;
+
+ FocusManagerTest* test_;
+
+ DISALLOW_EVIL_CONSTRUCTORS(TestViewWindow);
+};
+
+class FocusManagerTest : public testing::Test {
+ public:
+ TestViewWindow* GetWindow();
+ ~FocusManagerTest();
+
+ protected:
+ FocusManagerTest();
+
+ virtual void SetUp();
+ virtual void TearDown();
+
+ MessageLoopForUI message_loop_;
+ TestViewWindow* test_window_;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// TestViewWindow
+////////////////////////////////////////////////////////////////////////////////
+
+TestViewWindow::TestViewWindow(FocusManagerTest* test)
+ : test_(test),
+ contents_(NULL),
+ style_tab_(NULL),
+ search_border_view_(NULL) {
+}
+
+// Initializes and shows the window with the contents view.
+void TestViewWindow::Init() {
+ gfx::Rect bounds(0, 0, 600, 460);
+ contents_ = new views::View();
+ contents_->set_background(
+ views::Background::CreateSolidBackground(255, 255, 255));
+
+ WidgetWin::Init(NULL, bounds, true);
+ SetContentsView(contents_);
+
+ views::CheckBox* cb =
+ new views::CheckBox(L"This is a checkbox");
+ contents_->AddChildView(cb);
+ // In this fast paced world, who really has time for non hard-coded layout?
+ cb->SetBounds(10, 10, 200, 20);
+ cb->SetID(kTopCheckBoxID);
+
+ views::View* left_container = new views::View();
+ left_container->set_border(
+ views::Border::CreateSolidBorder(1, SK_ColorBLACK));
+ left_container->set_background(
+ views::Background::CreateSolidBackground(240, 240, 240));
+ left_container->SetID(kLeftContainerID);
+ contents_->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;
+
+ views::Label* label = new views::Label(L"Apple:");
+ label->SetID(kAppleLabelID);
+ left_container->AddChildView(label);
+ label->SetBounds(label_x, y, label_width, label_height);
+
+ views::TextField* text_field = new views::TextField();
+ text_field->SetID(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 views::Label(L"Orange:");
+ label->SetID(kOrangeLabelID);
+ left_container->AddChildView(label);
+ label->SetBounds(label_x, y, label_width, label_height);
+
+ text_field = new views::TextField();
+ text_field->SetID(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 views::Label(L"Banana:");
+ label->SetID(kBananaLabelID);
+ left_container->AddChildView(label);
+ label->SetBounds(label_x, y, label_width, label_height);
+
+ text_field = new views::TextField();
+ text_field->SetID(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 views::Label(L"Kiwi:");
+ label->SetID(kKiwiLabelID);
+ left_container->AddChildView(label);
+ label->SetBounds(label_x, y, label_width, label_height);
+
+ text_field = new views::TextField();
+ text_field->SetID(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;
+
+ views::NativeButton* button =
+ new views::NativeButton(L"Click me");
+ button->SetBounds(label_x, y + 10, 50, 20);
+ button->SetID(kFruitButtonID);
+ left_container->AddChildView(button);
+ y += 40;
+
+ cb = new views::CheckBox(L"This is another check box");
+ cb->SetBounds(label_x + label_width + 5, y, 100, 20);
+ cb->SetID(kFruitCheckBoxID);
+ left_container->AddChildView(cb);
+
+ views::View* right_container = new views::View();
+ right_container->set_border(
+ views::Border::CreateSolidBorder(1, SK_ColorBLACK));
+ right_container->set_background(
+ views::Background::CreateSolidBackground(240, 240, 240));
+ right_container->SetID(kRightContainerID);
+ contents_->AddChildView(right_container);
+ right_container->SetBounds(270, 35, 300, 200);
+
+ y = 10;
+ int radio_button_height = 15;
+ int gap_between_radio_buttons = 10;
+ views::View* radio_button =
+ new views::RadioButton(L"Asparagus", 1);
+ radio_button->SetID(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 views::RadioButton(L"Broccoli", 1);
+ radio_button->SetID(kBroccoliButtonID);
+ 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 views::RadioButton(L"Cauliflower", 1);
+ radio_button->SetID(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;
+
+ views::View* inner_container = new views::View();
+ inner_container->set_border(
+ views::Border::CreateSolidBorder(1, SK_ColorBLACK));
+ inner_container->set_background(
+ views::Background::CreateSolidBackground(230, 230, 230));
+ inner_container->SetID(kInnerContainerID);
+ right_container->AddChildView(inner_container);
+ inner_container->SetBounds(100, 10, 150, 180);
+
+ views::ScrollView* scroll_view = new views::ScrollView();
+ scroll_view->SetID(kScrollViewID);
+ inner_container->AddChildView(scroll_view);
+ scroll_view->SetBounds(1, 1, 148, 178);
+
+ views::View* scroll_content = new views::View();
+ scroll_content->SetBounds(0, 0, 200, 200);
+ scroll_content->set_background(
+ views::Background::CreateSolidBackground(200, 200, 200));
+ scroll_view->SetContents(scroll_content);
+
+ static const wchar_t* const kTitles[] = {
+ L"Rosetta", L"Stupeur et tremblement", L"The diner game",
+ L"Ridicule", L"Le placard", L"Les Visiteurs", L"Amelie",
+ L"Joyeux Noel", L"Camping", L"Brice de Nice",
+ L"Taxi", L"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 (int i = 0; i < arraysize(kTitles); ++i) {
+ views::Link* link = new views::Link(kTitles[i]);
+ link->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ link->SetID(kIDs[i]);
+ scroll_content->AddChildView(link);
+ link->SetBounds(5, y, 300, 15);
+ y += 15;
+ }
+
+ y = 250;
+ int width = 50;
+ button = new views::NativeButton(L"OK");
+ button->SetID(kOKButtonID);
+
+ contents_->AddChildView(button);
+ button->SetBounds(150, y, width, 20);
+
+ button = new views::NativeButton(L"Cancel");
+ button->SetID(kCancelButtonID);
+ contents_->AddChildView(button);
+ button->SetBounds(250, y, width, 20);
+
+ button = new views::NativeButton(L"Help");
+ button->SetID(kHelpButtonID);
+ contents_->AddChildView(button);
+ button->SetBounds(350, y, width, 20);
+
+ y += 40;
+
+ // Left bottom box with style checkboxes.
+ views::View* contents = new views::View();
+ contents->set_background(
+ views::Background::CreateSolidBackground(SK_ColorWHITE));
+ cb = new views::CheckBox(L"Bold");
+ contents->AddChildView(cb);
+ cb->SetBounds(10, 10, 50, 20);
+ cb->SetID(kBoldCheckBoxID);
+
+ cb = new views::CheckBox(L"Italic");
+ contents->AddChildView(cb);
+ cb->SetBounds(70, 10, 50, 20);
+ cb->SetID(kItalicCheckBoxID);
+
+ cb = new views::CheckBox(L"Underlined");
+ contents->AddChildView(cb);
+ cb->SetBounds(130, 10, 70, 20);
+ cb->SetID(kUnderlinedCheckBoxID);
+
+ style_tab_ = new views::TabbedPane();
+ style_tab_->SetID(kStyleContainerID);
+ contents_->AddChildView(style_tab_);
+ style_tab_->SetBounds(10, y, 210, 50);
+ style_tab_->AddTab(L"Style", contents);
+ style_tab_->AddTab(L"Other", new views::View());
+
+ // Right bottom box with search.
+ contents = new views::View();
+ contents->set_background(
+ views::Background::CreateSolidBackground(SK_ColorWHITE));
+ text_field = new views::TextField();
+ contents->AddChildView(text_field);
+ text_field->SetBounds(10, 10, 100, 20);
+ text_field->SetID(kSearchTextFieldID);
+
+ button = new views::NativeButton(L"Search");
+ contents->AddChildView(button);
+ button->SetBounds(115, 10, 50, 20);
+ button->SetID(kSearchButtonID);
+
+ views::Link* link = new views::Link(L"Help");
+ link->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+ link->SetID(kHelpLinkID);
+ contents->AddChildView(link);
+ link->SetBounds(170, 10, 30, 15);
+
+ search_border_view_ = new BorderView(contents);
+ search_border_view_->SetID(kSearchContainerID);
+
+ contents_->AddChildView(search_border_view_);
+ search_border_view_->SetBounds(300, y, 200, 50);
+
+ y += 60;
+
+ contents = new views::View();
+ contents->SetFocusable(true);
+ contents->set_background(
+ views::Background::CreateSolidBackground(SK_ColorBLUE));
+ contents->SetID(kThumbnailContainerID);
+ button = new views::NativeButton(L"Star");
+ contents->AddChildView(button);
+ button->SetBounds(5, 5, 50, 20);
+ button->SetID(kThumbnailStarID);
+ button = new views::NativeButton(L"SuperStar");
+ contents->AddChildView(button);
+ button->SetBounds(60, 5, 100, 20);
+ button->SetID(kThumbnailSuperStarID);
+
+ contents_->AddChildView(contents);
+ contents->SetBounds(200, y, 200, 50);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// FocusManagerTest
+////////////////////////////////////////////////////////////////////////////////
+
+FocusManagerTest::FocusManagerTest() {
+}
+
+FocusManagerTest::~FocusManagerTest() {
+}
+
+TestViewWindow* FocusManagerTest::GetWindow() {
+ return test_window_;
+}
+
+void FocusManagerTest::SetUp() {
+ OleInitialize(NULL);
+ test_window_ = new TestViewWindow(this);
+ test_window_->Init();
+ ShowWindow(test_window_->GetNativeView(), SW_SHOW);
+}
+
+void FocusManagerTest::TearDown() {
+ test_window_->CloseNow();
+
+ // Flush the message loop to make Purify happy.
+ message_loop_.RunAllPending();
+ OleUninitialize();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// The tests
+////////////////////////////////////////////////////////////////////////////////
+
+
+TEST_F(FocusManagerTest, NormalTraversal) {
+ const int kTraversalIDs[] = { kTopCheckBoxID, kAppleTextFieldID,
+ kOrangeTextFieldID, kBananaTextFieldID, kKiwiTextFieldID,
+ kFruitButtonID, kFruitCheckBoxID, kAsparagusButtonID, kRosettaLinkID,
+ kStupeurEtTremblementLinkID,
+ kDinerGameLinkID, kRidiculeLinkID, kClosetLinkID, kVisitingLinkID,
+ kAmelieLinkID, kJoyeuxNoelLinkID, kCampingLinkID, kBriceDeNiceLinkID,
+ kTaxiLinkID, kAsterixLinkID, kOKButtonID, kCancelButtonID, kHelpButtonID,
+ kStyleContainerID, kBoldCheckBoxID, kItalicCheckBoxID,
+ kUnderlinedCheckBoxID, kSearchTextFieldID, kSearchButtonID, kHelpLinkID,
+ kThumbnailContainerID, kThumbnailStarID, kThumbnailSuperStarID };
+
+ // Uncomment the following line if you want to test manually the UI of this
+ // test.
+ // MessageLoop::current()->Run(new views::AcceleratorHandler());
+
+ views::FocusManager* focus_manager =
+ views::FocusManager::GetFocusManager(test_window_->GetNativeView());
+ // Let's traverse the whole focus hierarchy (several times, to make sure it
+ // loops OK).
+ focus_manager->SetFocusedView(NULL);
+ for (int i = 0; i < 3; ++i) {
+ for (int j = 0; j < arraysize(kTraversalIDs); j++) {
+ focus_manager->AdvanceFocus(false);
+ views::View* focused_view = focus_manager->GetFocusedView();
+ EXPECT_TRUE(focused_view != NULL);
+ if (focused_view)
+ EXPECT_EQ(kTraversalIDs[j], focused_view->GetID());
+ }
+ }
+
+ // Focus the 1st item.
+ views::RootView* root_view = test_window_->GetContentsRootView();
+ focus_manager->SetFocusedView(root_view->GetViewByID(kTraversalIDs[0]));
+
+ /* BROKEN because of bug #1153276. The reverse order of traversal in Tabbed
+ Panes is broken (we go to the tab before going to the content
+ // Let's traverse in reverse order.
+ for (int i = 0; i < 3; ++i) {
+ for (int j = arraysize(kTraversalIDs) - 1; j >= 0; --j) {
+ focus_manager->AdvanceFocus(true);
+ views::View* focused_view = focus_manager->GetFocusedView();
+ EXPECT_TRUE(focused_view != NULL);
+ if (focused_view)
+ EXPECT_EQ(kTraversalIDs[j], focused_view->GetID());
+ }
+ }
+ */
+}
+
+TEST_F(FocusManagerTest, TraversalWithNonEnabledViews) {
+ const int kMainContentsDisabledIDs[] = {
+ kBananaTextFieldID, kFruitCheckBoxID, kAsparagusButtonID,
+ kCauliflowerButtonID, kClosetLinkID, kVisitingLinkID, kBriceDeNiceLinkID,
+ kTaxiLinkID, kAsterixLinkID, kHelpButtonID };
+
+ const int kStyleContentsDisabledIDs[] = { kBoldCheckBoxID };
+
+ const int kSearchContentsDisabledIDs[] = { kSearchTextFieldID, kHelpLinkID };
+
+ const int kTraversalIDs[] = { kTopCheckBoxID, kAppleTextFieldID,
+ kOrangeTextFieldID, kKiwiTextFieldID, kFruitButtonID, kBroccoliButtonID,
+ kRosettaLinkID, kStupeurEtTremblementLinkID, kDinerGameLinkID,
+ kRidiculeLinkID, kAmelieLinkID, kJoyeuxNoelLinkID, kCampingLinkID,
+ kOKButtonID, kCancelButtonID, kStyleContainerID,
+ kItalicCheckBoxID, kUnderlinedCheckBoxID, kSearchButtonID,
+ kThumbnailContainerID, kThumbnailStarID, kThumbnailSuperStarID };
+
+ // Let's disable some views.
+ views::RootView* root_view = test_window_->GetContentsRootView();
+ for (int i = 0; i < arraysize(kMainContentsDisabledIDs); i++) {
+ views::View* v = root_view->GetViewByID(kMainContentsDisabledIDs[i]);
+ ASSERT_TRUE(v != NULL);
+ if (v)
+ v->SetEnabled(false);
+ }
+ root_view = test_window_->GetStyleRootView();
+ for (int i = 0; i < arraysize(kStyleContentsDisabledIDs); i++) {
+ views::View* v = root_view->GetViewByID(kStyleContentsDisabledIDs[i]);
+ ASSERT_TRUE(v != NULL);
+ if (v)
+ v->SetEnabled(false);
+ }
+ root_view = test_window_->GetSearchRootView();
+ for (int i = 0; i < arraysize(kSearchContentsDisabledIDs); i++) {
+ views::View* v =
+ root_view->GetViewByID(kSearchContentsDisabledIDs[i]);
+ ASSERT_TRUE(v != NULL);
+ if (v)
+ v->SetEnabled(false);
+ }
+
+
+ views::FocusManager* focus_manager =
+ views::FocusManager::GetFocusManager(test_window_->GetNativeView());
+ views::View* focused_view;
+ // Let's do one traversal (several times, to make sure it loops ok).
+ for (int i = 0; i < 3;++i) {
+ for (int j = 0; j < arraysize(kTraversalIDs); j++) {
+ focus_manager->AdvanceFocus(false);
+ focused_view = focus_manager->GetFocusedView();
+ EXPECT_TRUE(focused_view != NULL);
+ if (focused_view)
+ EXPECT_EQ(kTraversalIDs[j], focused_view->GetID());
+ }
+ }
+
+ // Focus the 1st item.
+ focus_manager->AdvanceFocus(false);
+ focused_view = focus_manager->GetFocusedView();
+ EXPECT_TRUE(focused_view != NULL);
+ if (focused_view)
+ EXPECT_EQ(kTraversalIDs[0], focused_view->GetID());
+
+ // Same thing in reverse.
+ /* BROKEN because of bug #1153276. The reverse order of traversal in Tabbed
+ Panes is broken (we go to the tab before going to the content
+
+ for (int i = 0; i < 3; ++i) {
+ for (int j = arraysize(kTraversalIDs) - 1; j >= 0; --j) {
+ focus_manager->AdvanceFocus(true);
+ focused_view = focus_manager->GetFocusedView();
+ EXPECT_TRUE(focused_view != NULL);
+ if (focused_view)
+ EXPECT_EQ(kTraversalIDs[j], focused_view->GetID());
+ }
+ }
+ */
+}
+
+}