diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-25 01:35:56 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-25 01:35:56 +0000 |
commit | f2ac24f080bba97cafaca933e7d4efcf0e9eb9d6 (patch) | |
tree | 54c2592a9ae0cd2066e0756350ad9876a558b841 | |
parent | 6c5a7c761466d79810aaa871b6ac6eb3e2375c2c (diff) | |
download | chromium_src-f2ac24f080bba97cafaca933e7d4efcf0e9eb9d6.zip chromium_src-f2ac24f080bba97cafaca933e7d4efcf0e9eb9d6.tar.gz chromium_src-f2ac24f080bba97cafaca933e7d4efcf0e9eb9d6.tar.bz2 |
Landing again the move of browser focus UI tests to in process.
TBR=sky
Review URL: http://codereview.chromium.org/28097
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10318 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/scoped_ole_initializer.h | 5 | ||||
-rw-r--r-- | chrome/browser/browser_focus_uitest.cc | 526 | ||||
-rw-r--r-- | chrome/browser/views/find_bar_win_unittest.cc | 3 | ||||
-rw-r--r-- | chrome/browser/views/frame/browser_view.h | 1 | ||||
-rw-r--r-- | chrome/test/in_process_browser_test.cc | 16 | ||||
-rw-r--r-- | chrome/test/in_process_browser_test.h | 14 | ||||
-rw-r--r-- | chrome/test/interactive_ui/interactive_ui.vcproj | 113 | ||||
-rw-r--r-- | chrome/test/ui_test_utils.cc | 4 | ||||
-rw-r--r-- | chrome/test/unit/chrome_test_suite.h | 4 | ||||
-rw-r--r-- | chrome/test/unit/unittests.vcproj | 4 |
10 files changed, 443 insertions, 247 deletions
diff --git a/chrome/app/scoped_ole_initializer.h b/chrome/app/scoped_ole_initializer.h index 3560374..1dcc0d5 100644 --- a/chrome/app/scoped_ole_initializer.h +++ b/chrome/app/scoped_ole_initializer.h @@ -6,6 +6,7 @@ #define CHROME_APP_SCOPED_OLE_INITIALIZER_H_ #include "base/logging.h" +#include "base/message_loop.h" #include "build/build_config.h" // Wraps OLE initialization in a cross-platform class meant to be used on the @@ -19,12 +20,16 @@ class ScopedOleInitializer { public: ScopedOleInitializer() { + msg_loop_ = MessageLoop::current(); int ole_result = OleInitialize(NULL); DCHECK(ole_result == S_OK); } ~ScopedOleInitializer() { + DCHECK(msg_loop_ == MessageLoop::current()); OleUninitialize(); } + + MessageLoop* msg_loop_; }; #else diff --git a/chrome/browser/browser_focus_uitest.cc b/chrome/browser/browser_focus_uitest.cc index ca68034..6ff0f35 100644 --- a/chrome/browser/browser_focus_uitest.cc +++ b/chrome/browser/browser_focus_uitest.cc @@ -2,157 +2,183 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/message_loop.h" +#include "chrome/browser/automation/ui_controls.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/dom_operation_notification_details.h" +#include "chrome/browser/tab_contents/web_contents.h" #include "chrome/browser/view_ids.h" +#include "chrome/browser/views/frame/browser_view.h" +#include "chrome/browser/views/location_bar_view.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_service.h" +#include "chrome/common/notification_source.h" +#include "chrome/common/notification_type.h" +#include "chrome/views/focus_manager.h" #include "chrome/views/view.h" -#include "chrome/test/automation/browser_proxy.h" -#include "chrome/test/automation/window_proxy.h" -#include "chrome/test/automation/tab_proxy.h" -#include "chrome/test/ui/ui_test.h" -#include "net/url_request/url_request_unittest.h" +#include "chrome/views/window.h" +#include "chrome/test/in_process_browser_test.h" +#include "chrome/test/ui_test_utils.h" + namespace { -// The delay waited after sending an OS simulated event. +// The delay waited in some cases where we don't have a notifications for an +// action we take. const int kActionDelayMs = 500; -const wchar_t kDocRoot[] = L"chrome/test/data"; - const wchar_t kSimplePage[] = L"files/focus/page_with_focus.html"; const wchar_t kStealFocusPage[] = L"files/focus/page_steals_focus.html"; const wchar_t kTypicalPage[] = L"files/focus/typical_page.html"; -class BrowserFocusTest : public UITest { +class BrowserFocusTest : public InProcessBrowserTest { public: BrowserFocusTest() { - show_window_ = true; - dom_automation_enabled_ = true; + set_show_window(true); + EnableDOMAutomation(); } }; -// Activate a tab by clicking on it. Returns true if the call was successful -// (meaning the messages were correctly sent, but does not guarantee the tab -// has been changed). -bool ActivateTabByClick(AutomationProxy* automation, - WindowProxy* browser_window, - int tab_index) { - // Click on the tab. - gfx::Rect bounds; +class JavaScriptRunner : public NotificationObserver { + public: + JavaScriptRunner(WebContents* web_contents, + const std::wstring& frame_xpath, + const std::wstring& jscript) + : web_contents_(web_contents), + frame_xpath_(frame_xpath), + jscript_(jscript) { + NotificationService::current()-> + AddObserver(this, NotificationType::DOM_OPERATION_RESPONSE, + Source<WebContents>(web_contents)); + } + + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + Details<DomOperationNotificationDetails> dom_op_details(details); + result_ = dom_op_details->json(); + // The Jasonified response has quotes, remove them. + if (result_.length() > 1 && result_[0] == '"') + result_ = result_.substr(1, result_.length() - 2); + + NotificationService::current()-> + RemoveObserver(this, NotificationType::DOM_OPERATION_RESPONSE, + Source<WebContents>(web_contents_)); + MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); + } - if (!browser_window->GetViewBounds(VIEW_ID_TAB_0 + tab_index, &bounds, true)) - return false; + std::string Run() { + // The DOMAutomationController requires an automation ID, eventhough we are + // not using it in this case. + web_contents_->render_view_host()->ExecuteJavascriptInWebFrame( + frame_xpath_, L"window.domAutomationController.setAutomationId(0);"); - POINT click(bounds.CenterPoint().ToPOINT()); - if (!browser_window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)) - return false; + web_contents_->render_view_host()->ExecuteJavascriptInWebFrame(frame_xpath_, + jscript_); + ui_test_utils::RunMessageLoop(); + return result_; + } - // Wait a bit to let the click be processed. - ::Sleep(kActionDelayMs); + private: + WebContents* web_contents_; + std::wstring frame_xpath_; + std::wstring jscript_; + std::string result_; - return true; -} + DISALLOW_COPY_AND_ASSIGN(JavaScriptRunner); +}; } // namespace -TEST_F(BrowserFocusTest, BrowsersRememberFocus) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(kDocRoot, NULL); - ASSERT_TRUE(NULL != server.get()); +IN_PROC_BROWSER_TEST_F(BrowserFocusTest, BrowsersRememberFocus) { + HTTPTestServer* server = StartHTTPServer(); // First we navigate to our test page. GURL url = server->TestServerPageW(kSimplePage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - EXPECT_NE(AUTOMATION_MSG_NAVIGATION_ERROR, tab->NavigateToURL(url)); + ui_test_utils::NavigateToURL(browser(), url); // The focus should be on the Tab contents. - scoped_ptr<WindowProxy> window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); + HWND hwnd = reinterpret_cast<HWND>(browser()->window()->GetNativeHandle()); + BrowserView* browser_view = BrowserView::GetBrowserViewForHWND(hwnd); + ASSERT_TRUE(browser_view); + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(hwnd); + ASSERT_TRUE(focus_manager); - scoped_ptr<BrowserProxy> browser(window->GetBrowser()); - ASSERT_TRUE(browser.get() != NULL); - - int focused_view_id; - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_TAB_CONTAINER, focused_view_id); + EXPECT_EQ(browser_view->GetContentsView(), focus_manager->GetFocusedView()); // Now hide the window, show it again, the focus should not have changed. - EXPECT_TRUE(window->SetVisible(false)); - EXPECT_TRUE(window->SetVisible(true)); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_TAB_CONTAINER, focused_view_id); + // TODO(jcampan): retrieve the WidgetWin and show/hide on it instead of + // using Windows API. + ::ShowWindow(hwnd, SW_HIDE); + ::ShowWindow(hwnd, SW_SHOW); + EXPECT_EQ(browser_view->GetContentsView(), focus_manager->GetFocusedView()); // Click on the location bar. - gfx::Rect bounds; - EXPECT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &bounds, false)); - POINT click(bounds.CenterPoint().ToPOINT()); - - EXPECT_TRUE(window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)); - ::Sleep(kActionDelayMs); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); + LocationBarView* location_bar = browser_view->GetLocationBarView(); + ui_controls::MoveMouseToCenterAndPress(location_bar, + ui_controls::LEFT, + ui_controls::DOWN | ui_controls::UP, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + // Location bar should have focus. + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); // Hide the window, show it again, the focus should not have changed. - EXPECT_TRUE(window->SetVisible(false)); - EXPECT_TRUE(window->SetVisible(true)); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); + ::ShowWindow(hwnd, SW_HIDE); + ::ShowWindow(hwnd, SW_SHOW); + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); // Open a new browser window. - EXPECT_TRUE(automation()->OpenNewBrowserWindow(SW_SHOWNORMAL)); - scoped_ptr<WindowProxy> new_window(automation()->GetActiveWindow()); - ASSERT_TRUE(new_window.get() != NULL); - scoped_ptr<BrowserProxy> new_browser(new_window->GetBrowser()); - ASSERT_TRUE(new_browser.get() != NULL); - - // Let's make sure we have 2 different browser windows. - EXPECT_TRUE(browser->handle() != new_browser->handle()); - - tab.reset(new_browser->GetActiveTab()); - EXPECT_TRUE(tab.get()); - tab->NavigateToURL(url); + Browser* browser2 = Browser::Create(browser()->profile()); + ASSERT_TRUE(browser2); + browser2->AddBlankTab(true); + browser2->window()->Show(); + ui_test_utils::NavigateToURL(browser2, url); + + HWND hwnd2 = reinterpret_cast<HWND>(browser2->window()->GetNativeHandle()); + BrowserView* browser_view2 = BrowserView::GetBrowserViewForHWND(hwnd2); + ASSERT_TRUE(browser_view2); + views::FocusManager* focus_manager2 = + views::FocusManager::GetFocusManager(hwnd2); + ASSERT_TRUE(focus_manager2); + EXPECT_EQ(browser_view2->GetContentsView(), focus_manager2->GetFocusedView()); // Switch to the 1st browser window, focus should still be on the location // bar and the second browser should have nothing focused. - EXPECT_TRUE(window->Activate()); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); - EXPECT_TRUE(new_window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(-1, focused_view_id); + browser()->window()->Activate(); + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); + EXPECT_EQ(NULL, focus_manager2->GetFocusedView()); // Switch back to the second browser, focus should still be on the page. - EXPECT_TRUE(new_window->Activate()); - EXPECT_TRUE(new_window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_TAB_CONTAINER, focused_view_id); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(-1, focused_view_id); + browser2->window()->Activate(); + EXPECT_EQ(NULL, focus_manager->GetFocusedView()); + EXPECT_EQ(browser_view2->GetContentsView(), focus_manager2->GetFocusedView()); + + // Close the 2nd browser to avoid a DCHECK(). + browser_view2->Close(); } // Tabs remember focus. -TEST_F(BrowserFocusTest, TabsRememberFocus) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(kDocRoot, NULL); - ASSERT_TRUE(NULL != server.get()); - - scoped_ptr<WindowProxy> window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); - scoped_ptr<BrowserProxy> browser(window->GetBrowser()); - ASSERT_TRUE(browser.get() != NULL); +IN_PROC_BROWSER_TEST_F(BrowserFocusTest, TabsRememberFocus) { + HTTPTestServer* server = StartHTTPServer(); // First we navigate to our test page. GURL url = server->TestServerPageW(kSimplePage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - tab->NavigateToURL(url); + ui_test_utils::NavigateToURL(browser(), url); - // Create several tabs. - EXPECT_TRUE(browser->AppendTab(url)); - EXPECT_TRUE(browser->AppendTab(url)); - EXPECT_TRUE(browser->AppendTab(url)); - EXPECT_TRUE(browser->AppendTab(url)); + HWND hwnd = reinterpret_cast<HWND>(browser()->window()->GetNativeHandle()); + BrowserView* browser_view = BrowserView::GetBrowserViewForHWND(hwnd); + ASSERT_TRUE(browser_view); - int tab_count; - EXPECT_TRUE(browser->GetTabCount(&tab_count)); - ASSERT_EQ(5, tab_count); + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(hwnd); + ASSERT_TRUE(focus_manager); + + // Create several tabs. + for (int i = 0; i < 4; ++i) + browser()->AddTabWithURL(url, GURL(), PageTransition::TYPED, true, NULL); // Alternate focus for the tab. const bool kFocusPage[3][5] = { @@ -163,234 +189,256 @@ TEST_F(BrowserFocusTest, TabsRememberFocus) { for (int i = 1; i < 3; i++) { for (int j = 0; j < 5; j++) { - // Click on the tab. - ActivateTabByClick(automation(), window.get(), j); + // Activate the tab. + browser()->SelectTabContentsAt(j, true); // Activate the location bar or the page. - int view_id = kFocusPage[i][j] ? VIEW_ID_TAB_CONTAINER : - VIEW_ID_LOCATION_BAR; - - gfx::Rect bounds; - EXPECT_TRUE(window->GetViewBounds(view_id, &bounds, true)); - POINT click(bounds.CenterPoint().ToPOINT()); - EXPECT_TRUE(window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)); - ::Sleep(kActionDelayMs); + views::View* view_to_focus = kFocusPage[i][j] ? + browser_view->GetContentsView() : + browser_view->GetLocationBarView(); + + ui_controls::MoveMouseToCenterAndPress(view_to_focus, + ui_controls::LEFT, + ui_controls::DOWN | + ui_controls::UP, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); } // Now come back to the tab and check the right view is focused. for (int j = 0; j < 5; j++) { - // Click on the tab. - ActivateTabByClick(automation(), window.get(), j); + // Activate the tab. + browser()->SelectTabContentsAt(j, true); // Activate the location bar or the page. - int exp_view_id = kFocusPage[i][j] ? VIEW_ID_TAB_CONTAINER : - VIEW_ID_LOCATION_BAR; - int focused_view_id; - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(exp_view_id, focused_view_id); + views::View* view = kFocusPage[i][j] ? + browser_view->GetContentsView() : + browser_view->GetLocationBarView(); + EXPECT_EQ(view, focus_manager->GetFocusedView()); } } } // Background window does not steal focus. -TEST_F(BrowserFocusTest, BackgroundBrowserDontStealFocus) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(kDocRoot, NULL); - ASSERT_TRUE(NULL != server.get()); +IN_PROC_BROWSER_TEST_F(BrowserFocusTest, BackgroundBrowserDontStealFocus) { + HTTPTestServer* server = StartHTTPServer(); // First we navigate to our test page. - GURL simple_page_url = server->TestServerPageW(kSimplePage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - tab->NavigateToURL(simple_page_url); - - scoped_ptr<WindowProxy> window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); - scoped_ptr<BrowserProxy> browser(window->GetBrowser()); - ASSERT_TRUE(browser.get() != NULL); + GURL url = server->TestServerPageW(kSimplePage); + ui_test_utils::NavigateToURL(browser(), url); // Open a new browser window. - EXPECT_TRUE(automation()->OpenNewBrowserWindow(SW_SHOWNORMAL)); - scoped_ptr<WindowProxy> new_window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); - scoped_ptr<BrowserProxy> new_browser(new_window->GetBrowser()); - ASSERT_TRUE(new_browser.get() != NULL); - + Browser* browser2 = Browser::Create(browser()->profile()); + ASSERT_TRUE(browser2); + browser2->AddBlankTab(true); + browser2->window()->Show(); GURL steal_focus_url = server->TestServerPageW(kStealFocusPage); - new_browser->AppendTab(steal_focus_url); + ui_test_utils::NavigateToURL(browser2, steal_focus_url); - // Make the first browser active - EXPECT_TRUE(window->Activate()); + // Activate the first browser. + browser()->window()->Activate(); // Wait for the focus to be stolen by the other browser. ::Sleep(2000); - // Make sure the 1st browser window is still active. - bool is_active = false; - EXPECT_TRUE(window->IsActive(&is_active)); - EXPECT_TRUE(is_active); + // Make sure the first browser is still active. + HWND hwnd = reinterpret_cast<HWND>(browser()->window()->GetNativeHandle()); + BrowserView* browser_view = BrowserView::GetBrowserViewForHWND(hwnd); + ASSERT_TRUE(browser_view); + EXPECT_TRUE(browser_view->frame()->GetWindow()->IsActive()); + + // Close the 2nd browser to avoid a DCHECK(). + HWND hwnd2 = reinterpret_cast<HWND>(browser2->window()->GetNativeHandle()); + BrowserView* browser_view2 = BrowserView::GetBrowserViewForHWND(hwnd2); + browser_view2->Close(); } // Page cannot steal focus when focus is on location bar. -TEST_F(BrowserFocusTest, LocationBarLockFocus) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(kDocRoot, NULL); - ASSERT_TRUE(NULL != server.get()); +IN_PROC_BROWSER_TEST_F(BrowserFocusTest, LocationBarLockFocus) { + HTTPTestServer* server = StartHTTPServer(); // Open the page that steals focus. GURL url = server->TestServerPageW(kStealFocusPage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - tab->NavigateToURL(url); + ui_test_utils::NavigateToURL(browser(), url); - scoped_ptr<WindowProxy> window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); - scoped_ptr<BrowserProxy> browser(window->GetBrowser()); - ASSERT_TRUE(browser.get() != NULL); + HWND hwnd = reinterpret_cast<HWND>(browser()->window()->GetNativeHandle()); + BrowserView* browser_view = BrowserView::GetBrowserViewForHWND(hwnd); + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(hwnd); // Click on the location bar. - gfx::Rect bounds; - EXPECT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &bounds, true)); - POINT click(bounds.CenterPoint().ToPOINT()); - EXPECT_TRUE(window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)); - ::Sleep(kActionDelayMs); + LocationBarView* location_bar = browser_view->GetLocationBarView(); + ui_controls::MoveMouseToCenterAndPress(location_bar, + ui_controls::LEFT, + ui_controls::DOWN | ui_controls::UP, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); // Wait for the page to steal focus. ::Sleep(2000); // Make sure the location bar is still focused. - int focused_view_id; - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); } // Focus traversal -TEST_F(BrowserFocusTest, FocusTraversal) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(kDocRoot, NULL); - ASSERT_TRUE(NULL != server.get()); +IN_PROC_BROWSER_TEST_F(BrowserFocusTest, FocusTraversal) { + HTTPTestServer* server = StartHTTPServer(); - // Open the page the test page. + // First we navigate to our test page. GURL url = server->TestServerPageW(kTypicalPage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - tab->NavigateToURL(url); + ui_test_utils::NavigateToURL(browser(), url); - scoped_ptr<WindowProxy> window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); - scoped_ptr<BrowserProxy> browser(window->GetBrowser()); - ASSERT_TRUE(browser.get() != NULL); + HWND hwnd = reinterpret_cast<HWND>(browser()->window()->GetNativeHandle()); + BrowserView* browser_view = BrowserView::GetBrowserViewForHWND(hwnd); + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(hwnd); // Click on the location bar. - gfx::Rect bounds; - EXPECT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &bounds, true)); - POINT click(bounds.CenterPoint().ToPOINT()); - EXPECT_TRUE(window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)); - ::Sleep(kActionDelayMs); - - const wchar_t* kExpElementIDs[] = { - L"", // Initially no element in the page should be focused - // (the location bar is focused). - L"textEdit", L"searchButton", L"luckyButton", L"googleLink", L"gmailLink", - L"gmapLink" + LocationBarView* location_bar = browser_view->GetLocationBarView(); + ui_controls::MoveMouseToCenterAndPress(location_bar, + ui_controls::LEFT, + ui_controls::DOWN | ui_controls::UP, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + + const char* kExpElementIDs[] = { + "", // Initially no element in the page should be focused + // (the location bar is focused). + "textEdit", "searchButton", "luckyButton", "googleLink", "gmailLink", + "gmapLink" }; // Test forward focus traversal. for (int i = 0; i < 3; ++i) { // Location bar should be focused. - int focused_view_id; - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); // Now let's press tab to move the focus. for (int j = 0; j < 7; ++j) { // Let's make sure the focus is on the expected element in the page. - std::wstring actual; - ASSERT_TRUE(tab->ExecuteAndExtractString(L"", - L"window.domAutomationController.send(getFocusedElement());", - &actual)); + JavaScriptRunner js_runner( + browser()->GetSelectedTabContents()->AsWebContents(), + L"", + L"window.domAutomationController.send(getFocusedElement());"); + std::string actual = js_runner.Run(); ASSERT_STREQ(kExpElementIDs[j], actual.c_str()); - window->SimulateOSKeyPress(L'\t', 0); + ui_controls::SendKeyPressNotifyWhenDone(L'\t', false, false, false, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + // Ideally, we wouldn't sleep here and instead would use the event + // processed ack nofification from the renderer. I am reluctant to create + // a new notification/callback for that purpose just for this test. ::Sleep(kActionDelayMs); } + + // 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(); } // Now let's try reverse focus traversal. for (int i = 0; i < 3; ++i) { // Location bar should be focused. - int focused_view_id; - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); - // Now let's press tab to move the focus. + // Now let's press shift-tab to move the focus in reverse. for (int j = 0; j < 7; ++j) { - window->SimulateOSKeyPress(L'\t', views::Event::EF_SHIFT_DOWN); + ui_controls::SendKeyPressNotifyWhenDone(L'\t', false, true, false, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); ::Sleep(kActionDelayMs); // Let's make sure the focus is on the expected element in the page. - std::wstring actual; - ASSERT_TRUE(tab->ExecuteAndExtractString(L"", - L"window.domAutomationController.send(getFocusedElement());", - &actual)); + JavaScriptRunner js_runner( + browser()->GetSelectedTabContents()->AsWebContents(), + L"", + L"window.domAutomationController.send(getFocusedElement());"); + std::string actual = js_runner.Run(); ASSERT_STREQ(kExpElementIDs[6 - j], actual.c_str()); } + + // 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(); } } // Make sure Find box can request focus, even when it is already open. -TEST_F(BrowserFocusTest, FindFocusTest) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(kDocRoot, NULL); - ASSERT_TRUE(NULL != server.get()); +IN_PROC_BROWSER_TEST_F(BrowserFocusTest, FindFocusTest) { + HTTPTestServer* server = StartHTTPServer(); // Open some page (any page that doesn't steal focus). GURL url = server->TestServerPageW(kTypicalPage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - tab->NavigateToURL(url); + ui_test_utils::NavigateToURL(browser(), url); - scoped_ptr<WindowProxy> window(automation()->GetActiveWindow()); - ASSERT_TRUE(window.get() != NULL); - scoped_ptr<BrowserProxy> browser(window->GetBrowser()); - ASSERT_TRUE(browser.get() != NULL); + HWND hwnd = reinterpret_cast<HWND>(browser()->window()->GetNativeHandle()); + BrowserView* browser_view = BrowserView::GetBrowserViewForHWND(hwnd); + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(hwnd); + LocationBarView* location_bar = browser_view->GetLocationBarView(); // Press Ctrl+F, which will make the Find box open and request focus. static const int VK_F = 0x46; - EXPECT_TRUE(window->SimulateOSKeyPress(VK_F, views::Event::EF_CONTROL_DOWN)); + ui_controls::SendKeyPressNotifyWhenDone(L'F', true, false, false, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + + // Ideally, we wouldn't sleep here and instead would intercept the + // RenderViewHostDelegate::HandleKeyboardEvent() callback. To do that, we + // could create a RenderViewHostDelegate wrapper and hook-it up by either: + // - creating a factory used to create the delegate + // - making the test a private and overwriting the delegate member directly. ::Sleep(kActionDelayMs); - int focused_view_id; - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD, focused_view_id); + MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + + views::View* focused_view = focus_manager->GetFocusedView(); + ASSERT_TRUE(focused_view != NULL); + EXPECT_EQ(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD, focused_view->GetID()); // Click on the location bar. - gfx::Rect bounds; - EXPECT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &bounds, true)); - POINT click(bounds.CenterPoint().ToPOINT()); - EXPECT_TRUE(window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)); - ::Sleep(kActionDelayMs); + ui_controls::MoveMouseToCenterAndPress(location_bar, + ui_controls::LEFT, + ui_controls::DOWN | ui_controls::UP, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + // Make sure the location bar is focused. - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_LOCATION_BAR, focused_view_id); + EXPECT_EQ(location_bar, focus_manager->GetFocusedView()); // Now press Ctrl+F again and focus should move to the Find box. - EXPECT_TRUE(window->SimulateOSKeyPress(VK_F, views::Event::EF_CONTROL_DOWN)); - ::Sleep(kActionDelayMs); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD, focused_view_id); + ui_controls::SendKeyPressNotifyWhenDone(L'F', true, false, false, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + focused_view = focus_manager->GetFocusedView(); + ASSERT_TRUE(focused_view != NULL); + EXPECT_EQ(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD, focused_view->GetID()); // Set focus to the page. - EXPECT_TRUE(window->GetViewBounds(VIEW_ID_TAB_CONTAINER, &bounds, true)); - click = bounds.CenterPoint().ToPOINT(); - EXPECT_TRUE(window->SimulateOSClick(click, - views::Event::EF_LEFT_BUTTON_DOWN)); - ::Sleep(kActionDelayMs); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_TAB_CONTAINER, focused_view_id); + ui_controls::MoveMouseToCenterAndPress(browser_view->GetContentsView(), + ui_controls::LEFT, + ui_controls::DOWN | ui_controls::UP, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + EXPECT_EQ(browser_view->GetContentsView(), focus_manager->GetFocusedView()); // Now press Ctrl+F again and focus should move to the Find box. - EXPECT_TRUE(window->SimulateOSKeyPress(VK_F, views::Event::EF_CONTROL_DOWN)); + ui_controls::SendKeyPressNotifyWhenDone(VK_F, true, false, false, + new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + + // See remark above on why we wait. ::Sleep(kActionDelayMs); - EXPECT_TRUE(window->GetFocusedViewID(&focused_view_id)); - EXPECT_EQ(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD, focused_view_id); + MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); + ui_test_utils::RunMessageLoop(); + + focused_view = focus_manager->GetFocusedView(); + ASSERT_TRUE(focused_view != NULL); + EXPECT_EQ(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD, focused_view->GetID()); } diff --git a/chrome/browser/views/find_bar_win_unittest.cc b/chrome/browser/views/find_bar_win_unittest.cc index 4ef345c..87d93e0 100644 --- a/chrome/browser/views/find_bar_win_unittest.cc +++ b/chrome/browser/views/find_bar_win_unittest.cc @@ -144,3 +144,6 @@ IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageFrames) { EXPECT_EQ(1, FindInPage(L"Hreggvi\u00F0ur", FWD, CASE_SENSITIVE, false)); EXPECT_EQ(0, FindInPage(L"hreggvi\u00F0ur", FWD, CASE_SENSITIVE, false)); } + +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, OtherTest) { +}
\ No newline at end of file diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h index c228246..b1f70a8 100644 --- a/chrome/browser/views/frame/browser_view.h +++ b/chrome/browser/views/frame/browser_view.h @@ -53,6 +53,7 @@ class BrowserView : public BrowserWindow, virtual ~BrowserView(); void set_frame(BrowserFrame* frame) { frame_ = frame; } + BrowserFrame* frame() const { return frame_; } // Returns a pointer to the BrowserView* interface implementation (an // instance of this object, typically) for a given HWND, or NULL if there is diff --git a/chrome/test/in_process_browser_test.cc b/chrome/test/in_process_browser_test.cc index dd1f919..aae695b 100644 --- a/chrome/test/in_process_browser_test.cc +++ b/chrome/test/in_process_browser_test.cc @@ -12,6 +12,7 @@ #include "chrome/browser/browser_shutdown.h" #include "chrome/browser/profile.h" #include "chrome/browser/profile_manager.h" +#include "chrome/browser/renderer_host/render_process_host.h" #include "chrome/browser/views/frame/browser_view.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" @@ -43,7 +44,10 @@ bool DieFileDie(const std::wstring& file, bool recurse) { } // namespace -InProcessBrowserTest::InProcessBrowserTest() : browser_(NULL) { +InProcessBrowserTest::InProcessBrowserTest() + : browser_(NULL), + show_window_(false), + dom_automation_enabled_(false) { } void InProcessBrowserTest::SetUp() { @@ -68,15 +72,23 @@ void InProcessBrowserTest::SetUp() { CommandLine* command_line = CommandLine::ForCurrentProcessMutable(); // Hide windows on show. - if (!command_line->HasSwitch(kUnitTestShowWindows)) + if (!command_line->HasSwitch(kUnitTestShowWindows) && !show_window_) BrowserView::SetShowState(SW_HIDE); + if (dom_automation_enabled_) + command_line->AppendSwitch(switches::kDomAutomationController); + command_line->AppendSwitchWithValue(switches::kUserDataDir, user_data_dir); // For some reason the sandbox wasn't happy running in test mode. These // tests aren't intended to test the sandbox, so we turn it off. command_line->AppendSwitch(switches::kNoSandbox); + // Single-process mode is not set in BrowserMain so it needs to be processed + // explicitlty. + if (command_line->HasSwitch(switches::kSingleProcess)) + RenderProcessHost::set_run_renderer_in_process(true); + // Explicitly set the path of the exe used for the renderer, otherwise it'll // try to use unit_test.exe. std::wstring renderer_path; diff --git a/chrome/test/in_process_browser_test.h b/chrome/test/in_process_browser_test.h index 230b8df..90dcdc9 100644 --- a/chrome/test/in_process_browser_test.h +++ b/chrome/test/in_process_browser_test.h @@ -5,7 +5,6 @@ #ifndef CHROME_TEST_IN_PROCESS_BROWSER_TEST_H_ #define CHROME_TEST_IN_PROCESS_BROWSER_TEST_H_ -#include "chrome/app/scoped_ole_initializer.h" #include "chrome/common/notification_registrar.h" #include "chrome/common/notification_observer.h" #include "net/url_request/url_request_unittest.h" @@ -74,6 +73,11 @@ class InProcessBrowserTest : public testing::Test, public NotificationObserver { // This is invoked from Setup. virtual Browser* CreateBrowser(Profile* profile); + // Sets some test states (see below for comments). Call this in your test + // constructor. + void set_show_window(bool show) { show_window_ = show; } + void EnableDOMAutomation() { dom_automation_enabled_ = true; } + private: // Invokes CreateBrowser to create a browser, then RunTestOnMainThread, and // destroys the browser. @@ -88,7 +92,13 @@ class InProcessBrowserTest : public testing::Test, public NotificationObserver { // HTTPServer, created when StartHTTPServer is invoked. scoped_refptr<HTTPTestServer> http_server_; - ScopedOleInitializer ole_initializer_; + // Whether this test requires the browser windows to be shown (interactive + // tests for example need the windows shown). + bool show_window_; + + // Whether the JavaScript can access the DOMAutomationController (a JS object + // that can send messages back to the browser). + bool dom_automation_enabled_; DISALLOW_COPY_AND_ASSIGN(InProcessBrowserTest); }; diff --git a/chrome/test/interactive_ui/interactive_ui.vcproj b/chrome/test/interactive_ui/interactive_ui.vcproj index a4863ee..ee5907e 100644 --- a/chrome/test/interactive_ui/interactive_ui.vcproj +++ b/chrome/test/interactive_ui/interactive_ui.vcproj @@ -12,12 +12,16 @@ /> </Platforms> <ToolFiles> + <ToolFile + RelativePath="..\..\tools\build\win\version.rules" + /> </ToolFiles> <Configurations> <Configuration Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" ConfigurationType="1" - InheritedPropertySheets="$(SolutionDir)..\build\common.vsprops;$(SolutionDir)..\build\debug.vsprops;..\..\tools\build\win\precompiled_wtl.vsprops;..\..\tools\build\win\unit_test.vsprops;$(SolutionDir)..\third_party\libpng\using_libpng.vsprops;$(SolutionDir)..\third_party\zlib\using_zlib.vsprops;$(SolutionDir)..\skia\using_skia.vsprops;$(SolutionDir)..\third_party\libxml\build\using_libxml.vsprops;..\..\..\third_party\icu38\build\using_icu.vsprops;$(SolutionDir)..\testing\using_gtest.vsprops;..\..\third_party\hunspell\using_hunspell.vsprops" + InheritedPropertySheets="$(SolutionDir)..\build\common.vsprops;$(SolutionDir)..\build\debug.vsprops;..\..\tools\build\win\precompiled_wtl.vsprops;..\..\tools\build\win\unit_test.vsprops;$(SolutionDir)..\third_party\libpng\using_libpng.vsprops;$(SolutionDir)..\third_party\zlib\using_zlib.vsprops;$(SolutionDir)..\skia\using_skia.vsprops;$(SolutionDir)..\third_party\libxml\build\using_libxml.vsprops;$(SolutionDir)..\third_party\icu38\build\using_icu.vsprops;$(SolutionDir)..\testing\using_gtest.vsprops;..\..\third_party\hunspell\using_hunspell.vsprops;..\..\installer\util\using_util.vsprops;..\..\..\third_party\npapi\using_npapi.vsprops" > <Tool Name="VCPreBuildEventTool" @@ -26,6 +30,9 @@ Name="VCCustomBuildTool" /> <Tool + Name="Version" + /> + <Tool Name="VCXMLDataGeneratorTool" /> <Tool @@ -42,12 +49,14 @@ /> <Tool Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="$(SolutionDir)..;"$(IntDir)";"$(IntDir)";"$(SolutionDir)";"$(IntDir)\..\"" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" + AdditionalDependencies="winmm.lib" /> <Tool Name="VCALinkTool" @@ -77,7 +86,7 @@ <Configuration Name="Release|Win32" ConfigurationType="1" - InheritedPropertySheets="$(SolutionDir)..\build\common.vsprops;$(SolutionDir)..\build\release.vsprops;..\..\tools\build\win\unit_test.vsprops;$(SolutionDir)..\third_party\libpng\using_libpng.vsprops;$(SolutionDir)..\third_party\zlib\using_zlib.vsprops;$(SolutionDir)..\skia\using_skia.vsprops;$(SolutionDir)..\third_party\libxml\build\using_libxml.vsprops;..\..\..\third_party\icu38\build\using_icu.vsprops;$(SolutionDir)..\testing\using_gtest.vsprops;..\..\third_party\hunspell\using_hunspell.vsprops" + InheritedPropertySheets="$(SolutionDir)..\build\common.vsprops;$(SolutionDir)..\build\release.vsprops;..\..\tools\build\win\unit_test.vsprops;$(SolutionDir)..\third_party\libpng\using_libpng.vsprops;$(SolutionDir)..\third_party\zlib\using_zlib.vsprops;$(SolutionDir)..\skia\using_skia.vsprops;$(SolutionDir)..\third_party\libxml\build\using_libxml.vsprops;$(SolutionDir)..\third_party\icu38\build\using_icu.vsprops;$(SolutionDir)..\testing\using_gtest.vsprops;..\..\third_party\hunspell\using_hunspell.vsprops;..\..\installer\util\using_util.vsprops;..\..\..\third_party\npapi\using_npapi.vsprops" > <Tool Name="VCPreBuildEventTool" @@ -86,6 +95,9 @@ Name="VCCustomBuildTool" /> <Tool + Name="Version" + /> + <Tool Name="VCXMLDataGeneratorTool" /> <Tool @@ -102,6 +114,7 @@ /> <Tool Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="$(SolutionDir)..;"$(IntDir)";"$(IntDir)";"$(SolutionDir)";"$(IntDir)\..\"" /> <Tool Name="VCPreLinkEventTool" @@ -143,6 +156,14 @@ Name="Common" > <File + RelativePath="..\in_process_browser_test.cc" + > + </File> + <File + RelativePath="..\in_process_browser_test.h" + > + </File> + <File RelativePath="..\ui\npapi_test_helper.cc" > </File> @@ -191,6 +212,14 @@ > </File> <File + RelativePath="..\ui_test_utils.cc" + > + </File> + <File + RelativePath="..\ui_test_utils.h" + > + </File> + <File RelativePath=".\view_event_test_base.cc" > </File> @@ -200,6 +229,86 @@ </File> </Filter> <Filter + Name="resources" + > + <File + RelativePath="..\..\..\webkit\glue\resources\aliasb.cur" + > + </File> + <File + RelativePath="$(OutDir)\grit_derived_sources\browser_resources.rc" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\cell.cur" + > + </File> + <File + RelativePath="..\..\app\chrome_dll.rc" + > + </File> + <File + RelativePath="..\..\app\chrome_dll_resource.h" + > + </File> + <File + RelativePath="..\..\app\chrome_dll_version.rc.version" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\col_resize.cur" + > + </File> + <File + RelativePath="$(OutDir)\grit_derived_sources\common_resources.rc" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\copy.cur" + > + </File> + <File + RelativePath="$(OutDir)\grit_derived_sources\debugger_resources.rc" + > + </File> + <File + RelativePath="$(OutDir)\grit_derived_sources\net_resources.rc" + > + </File> + <File + RelativePath="$(OutDir)\grit_derived_sources\renderer_resources.rc" + > + </File> + <File + RelativePath="..\data\resource.h" + > + </File> + <File + RelativePath="..\data\resource.rc" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\row_resize.cur" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\vertical_text.cur" + > + </File> + <File + RelativePath="$(OutDir)\grit_derived_sources\webkit_resources.rc" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\zoom_in.cur" + > + </File> + <File + RelativePath="..\..\..\webkit\glue\resources\zoom_out.cur" + > + </File> + </Filter> + <Filter Name="TestBookmarkBarView" > <File diff --git a/chrome/test/ui_test_utils.cc b/chrome/test/ui_test_utils.cc index 1293f72..7471711 100644 --- a/chrome/test/ui_test_utils.cc +++ b/chrome/test/ui_test_utils.cc @@ -10,6 +10,7 @@ #include "chrome/browser/tab_contents/web_contents.h" #include "chrome/common/notification_registrar.h" #include "chrome/common/notification_service.h" +#include "chrome/views/accelerator_handler.h" #include "googleurl/src/gurl.h" namespace ui_test_utils { @@ -59,7 +60,8 @@ void RunMessageLoop() { MessageLoopForUI* loop = MessageLoopForUI::current(); bool did_allow_task_nesting = loop->NestableTasksAllowed(); loop->SetNestableTasksAllowed(true); - loop->Run(NULL); + views::AcceleratorHandler handler; + loop->Run(&handler); loop->SetNestableTasksAllowed(did_allow_task_nesting); } diff --git a/chrome/test/unit/chrome_test_suite.h b/chrome/test/unit/chrome_test_suite.h index 79c5e19..3382d972 100644 --- a/chrome/test/unit/chrome_test_suite.h +++ b/chrome/test/unit/chrome_test_suite.h @@ -12,6 +12,7 @@ #include "base/path_service.h" #include "base/scoped_nsautorelease_pool.h" #include "base/test_suite.h" +#include "chrome/app/scoped_ole_initializer.h" #include "chrome/browser/browser_process.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" @@ -78,11 +79,12 @@ protected: // Tear down shared StatsTable; prevents unit_tests from leaking it. StatsTable::set_current(NULL); delete stats_table_; - + TestSuite::Shutdown(); } StatsTable* stats_table_; + ScopedOleInitializer ole_initializer_; }; #endif // CHROME_TEST_UNIT_CHROME_TEST_SUITE_H_ diff --git a/chrome/test/unit/unittests.vcproj b/chrome/test/unit/unittests.vcproj index e6ba858..969e173 100644 --- a/chrome/test/unit/unittests.vcproj +++ b/chrome/test/unit/unittests.vcproj @@ -995,6 +995,10 @@ > </File> </Filter> + <File + RelativePath="..\..\browser\browser_focus_uitest.cc" + > + </File> </Files> <Globals> </Globals> |