| Index: chrome/browser/browser_focus_uitest.cc
|
| ===================================================================
|
| --- chrome/browser/browser_focus_uitest.cc (revision 26504)
|
| +++ chrome/browser/browser_focus_uitest.cc (working copy)
|
| @@ -147,7 +147,8 @@
|
| public:
|
| TestInterstitialPage(TabContents* tab, bool new_navigation, const GURL& url)
|
| : InterstitialPage(tab, new_navigation, url),
|
| - waiting_for_dom_response_(false) {
|
| + waiting_for_dom_response_(false),
|
| + waiting_for_focus_change_(false) {
|
| FilePath file_path;
|
| bool r = PathService::Get(chrome::DIR_TEST_DATA, &file_path);
|
| EXPECT_TRUE(r);
|
| @@ -192,10 +193,25 @@
|
| return render_view_host()->view()->HasFocus();
|
| }
|
|
|
| + void WaitForFocusChange() {
|
| + waiting_for_focus_change_ = true;
|
| + ui_test_utils::RunMessageLoop();
|
| + }
|
| +
|
| + protected:
|
| + virtual void FocusedNodeChanged() {
|
| + if (!waiting_for_focus_change_)
|
| + return;
|
| +
|
| + waiting_for_focus_change_= false;
|
| + MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| + }
|
| +
|
| private:
|
| std::string html_contents_;
|
|
|
| bool waiting_for_dom_response_;
|
| + bool waiting_for_focus_change_;
|
| std::string dom_response_;
|
|
|
| };
|
| @@ -396,6 +412,10 @@
|
| }
|
|
|
| // Focus traversal on a regular page.
|
| +// Note that this test relies on a notification from the renderer that the
|
| +// focus has changed in the page. The notification in the renderer may change
|
| +// at which point this test would fail (see comment in
|
| +// RenderWidget::didFocus()).
|
| IN_PROC_BROWSER_TEST_F(BrowserFocusTest, FocusTraversal) {
|
| HTTPTestServer* server = StartHTTPServer();
|
|
|
| @@ -420,7 +440,7 @@
|
| CheckViewHasFocus(VIEW_ID_LOCATION_BAR);
|
|
|
| // Now let's press tab to move the focus.
|
| - for (int j = 0; j < 7; ++j) {
|
| + for (size_t j = 0; j < arraysize(kExpElementIDs); ++j) {
|
| // Let's make sure the focus is on the expected element in the page.
|
| std::string actual;
|
| ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
|
| @@ -430,21 +450,22 @@
|
| &actual));
|
| ASSERT_STREQ(kExpElementIDs[j], actual.c_str());
|
|
|
| - ui_controls::SendKeyPressNotifyWhenDone(window, base::VKEY_TAB, false,
|
| - false, false,
|
| - new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| - // Ideally, we wouldn't sleep here and instead would use the event
|
| - // processed ack notification from the renderer. I am reluctant to create
|
| - // a new notification/callback for that purpose just for this test.
|
| - PlatformThread::Sleep(kActionDelayMs);
|
| + ASSERT_TRUE(ui_controls::SendKeyPress(window, base::VKEY_TAB,
|
| + false, false, false));
|
| +
|
| + if (j < arraysize(kExpElementIDs) - 1) {
|
| + ui_test_utils::WaitForFocusChange(browser()->GetSelectedTabContents()->
|
| + render_view_host());
|
| + } else {
|
| + // On the last tab key press, the focus returns to the browser.
|
| + ui_test_utils::WaitForFocusInBrowser(browser());
|
| + }
|
| }
|
|
|
| // At this point the renderer has sent us a message asking to advance the
|
| // focus (as the end of the focus loop was reached in the renderer).
|
| // We need to run the message loop to process it.
|
| - MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| + MessageLoop::current()->RunAllPending();
|
| }
|
|
|
| // Now let's try reverse focus traversal.
|
| @@ -453,13 +474,18 @@
|
| CheckViewHasFocus(VIEW_ID_LOCATION_BAR);
|
|
|
| // Now let's press shift-tab to move the focus in reverse.
|
| - for (int j = 0; j < 7; ++j) {
|
| - ui_controls::SendKeyPressNotifyWhenDone(window, base::VKEY_TAB, false,
|
| - true, false,
|
| - new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| - PlatformThread::Sleep(kActionDelayMs);
|
| + for (size_t j = 0; j < 7; ++j) {
|
| + ASSERT_TRUE(ui_controls::SendKeyPress(window, base::VKEY_TAB,
|
| + false, true, false));
|
|
|
| + if (j < arraysize(kExpElementIDs) - 1) {
|
| + ui_test_utils::WaitForFocusChange(browser()->GetSelectedTabContents()->
|
| + render_view_host());
|
| + } else {
|
| + // On the last tab key press, the focus returns to the browser.
|
| + ui_test_utils::WaitForFocusInBrowser(browser());
|
| + }
|
| +
|
| // Let's make sure the focus is on the expected element in the page.
|
| std::string actual;
|
| ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
|
| @@ -473,8 +499,7 @@
|
| // At this point the renderer has sent us a message asking to advance the
|
| // focus (as the end of the focus loop was reached in the renderer).
|
| // We need to run the message loop to process it.
|
| - MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| + MessageLoop::current()->RunAllPending();
|
| }
|
| }
|
|
|
| @@ -517,26 +542,26 @@
|
| CheckViewHasFocus(VIEW_ID_LOCATION_BAR);
|
|
|
| // Now let's press tab to move the focus.
|
| - for (int j = 0; j < 7; ++j) {
|
| + for (size_t j = 0; j < 7; ++j) {
|
| // Let's make sure the focus is on the expected element in the page.
|
| std::string actual = interstitial_page->GetFocusedElement();
|
| ASSERT_STREQ(kExpElementIDs[j], actual.c_str());
|
|
|
| - ui_controls::SendKeyPressNotifyWhenDone(window, base::VKEY_TAB, false,
|
| - false, false,
|
| - new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| - // Ideally, we wouldn't sleep here and instead would use the event
|
| - // processed ack notification from the renderer. I am reluctant to create
|
| - // a new notification/callback for that purpose just for this test.
|
| - PlatformThread::Sleep(kActionDelayMs);
|
| + ASSERT_TRUE(ui_controls::SendKeyPress(window, base::VKEY_TAB,
|
| + false, false, false));
|
| +
|
| + if (j < arraysize(kExpElementIDs) - 1) {
|
| + interstitial_page->WaitForFocusChange();
|
| + } else {
|
| + // On the last tab key press, the focus returns to the browser.
|
| + ui_test_utils::WaitForFocusInBrowser(browser());
|
| + }
|
| }
|
|
|
| // At this point the renderer has sent us a message asking to advance the
|
| // focus (as the end of the focus loop was reached in the renderer).
|
| // We need to run the message loop to process it.
|
| - MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| + MessageLoop::current()->RunAllPending();
|
| }
|
|
|
| // Now let's try reverse focus traversal.
|
| @@ -545,13 +570,17 @@
|
| CheckViewHasFocus(VIEW_ID_LOCATION_BAR);
|
|
|
| // Now let's press shift-tab to move the focus in reverse.
|
| - for (int j = 0; j < 7; ++j) {
|
| - ui_controls::SendKeyPressNotifyWhenDone(window, base::VKEY_TAB, false,
|
| - true, false,
|
| - new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| - PlatformThread::Sleep(kActionDelayMs);
|
| + for (size_t j = 0; j < 7; ++j) {
|
| + ASSERT_TRUE(ui_controls::SendKeyPress(window, base::VKEY_TAB,
|
| + false, true, false));
|
|
|
| + if (j < arraysize(kExpElementIDs) - 1) {
|
| + interstitial_page->WaitForFocusChange();
|
| + } else {
|
| + // On the last tab key press, the focus returns to the browser.
|
| + ui_test_utils::WaitForFocusInBrowser(browser());
|
| + }
|
| +
|
| // Let's make sure the focus is on the expected element in the page.
|
| std::string actual = interstitial_page->GetFocusedElement();
|
| ASSERT_STREQ(kExpElementIDs[6 - j], actual.c_str());
|
| @@ -560,8 +589,7 @@
|
| // At this point the renderer has sent us a message asking to advance the
|
| // focus (as the end of the focus loop was reached in the renderer).
|
| // We need to run the message loop to process it.
|
| - MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| - ui_test_utils::RunMessageLoop();
|
| + MessageLoop::current()->RunAllPending();
|
| }
|
| }
|
|
|
|
|