Chromium Code Reviews| Index: chrome/browser/prerender/prerender_browsertest.cc |
| =================================================================== |
| --- chrome/browser/prerender/prerender_browsertest.cc (revision 98079) |
| +++ chrome/browser/prerender/prerender_browsertest.cc (working copy) |
| @@ -21,6 +21,7 @@ |
| #include "chrome/browser/task_manager/task_manager.h" |
| #include "chrome/browser/task_manager/task_manager_browsertest_util.h" |
| #include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/ui/browser_list.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| #include "chrome/common/chrome_notification_types.h" |
| @@ -438,66 +439,71 @@ |
| NavigateToURLImpl(dest_url_, disposition); |
| } |
| - void OpenDestUrlInNewWindowViaJs() const { |
| - // Make sure in navigating we have a URL to use in the PrerenderManager. |
| - TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
| - ASSERT_TRUE(prerender_contents != NULL); |
| - prerender_contents->set_quit_message_loop_on_destruction(false); |
| + void OpenDestURLViaClick() const { |
| + OpenDestURLWithJSImpl(L"Click", true); |
| + } |
| - bool open_window_result = false; |
| - ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| - browser()->GetSelectedTabContents()->render_view_host(), L"", |
| - L"window.domAutomationController.send(JsOpenLinkInNewWindow())", |
| - &open_window_result)); |
| - EXPECT_TRUE(open_window_result); |
| + void OpenDestURLViaClickTarget() const { |
| + OpenDestURLWithJSImpl(L"ClickTarget", false); |
| + } |
| - // If the prerender contents has not been destroyed, run message loop. |
| - if (GetPrerenderContents() != NULL) { |
| - prerender_contents->set_quit_message_loop_on_destruction(true); |
| - ui_test_utils::RunMessageLoop(); |
| - } |
| + void OpenDestURLViaClickNewWindow() const { |
| + OpenDestURLWithJSImpl(L"ShiftClick", true); |
| } |
| - void OpenDestUrlInNewWindowViaClick() const { |
| - // Make sure in navigating we have a URL to use in the PrerenderManager. |
| - TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
| - ASSERT_TRUE(prerender_contents != NULL); |
| - prerender_contents->set_quit_message_loop_on_destruction(false); |
| + void OpenDestURLViaClickNewForegroundTab() const { |
| +#if defined(OS_MACOSX) |
|
cbentzel
2011/08/30 13:44:54
Oops!
|
| + OpenDestURLWithJSImpl(L"MetaShiftClick", true); |
| +#else |
| + OpenDestURLWithJSImpl(L"CtrlShiftClick", true); |
| +#endif |
| + } |
| - bool click_prerendered_link_result = false; |
| - ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| - browser()->GetSelectedTabContents()->render_view_host(), L"", |
| - L"window.domAutomationController.send(ClickOpenLinkInNewWindow())", |
| - &click_prerendered_link_result)); |
| - EXPECT_TRUE(click_prerendered_link_result); |
| + void OpenDestURLViaClickNewBackgroundTab() const { |
| +#if defined(OS_MACOSX) |
| + OpenDestURLWithJSImpl(L"MetaClick", false); |
| +#else |
| + OpenDestURLWithJSImpl(L"CtrlClick", false); |
| +#endif |
| + } |
| - // If the prerender contents has not been destroyed, run message loop. |
| - if (GetPrerenderContents() != NULL) { |
| - prerender_contents->set_quit_message_loop_on_destruction(true); |
| - ui_test_utils::RunMessageLoop(); |
| - } |
| + void OpenDestURLViaWindowOpen() const { |
| + OpenDestURLWithJSImpl(L"WindowOpen", false); |
| } |
| - void OpenDestUrlViaClick() const { |
| - // Make sure in navigating we have a URL to use in the PrerenderManager. |
| - TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
| - ASSERT_TRUE(prerender_contents != NULL); |
| - prerender_contents->set_quit_message_loop_on_destruction(false); |
| - |
| - bool click_prerendered_link_result = false; |
| + void ClickToNextPageAfterPrerender(Browser* browser) { |
| + ui_test_utils::WindowedNotificationObserver new_page_observer( |
| + content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| + NotificationService::AllSources()); |
| + bool click_link_result = false; |
| ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| - browser()->GetSelectedTabContents()->render_view_host(), L"", |
| + browser->GetSelectedTabContents()->render_view_host(), L"", |
| L"window.domAutomationController.send(ClickOpenLink())", |
| - &click_prerendered_link_result)); |
| - EXPECT_TRUE(click_prerendered_link_result); |
| + &click_link_result)); |
| + EXPECT_TRUE(click_link_result); |
| + new_page_observer.Wait(); |
| + } |
| - // If the prerender contents has not been destroyed, run message loop. |
| - if (GetPrerenderContents() != NULL) { |
| - prerender_contents->set_quit_message_loop_on_destruction(true); |
| - ui_test_utils::RunMessageLoop(); |
| - } |
| + void NavigateToNextPageAfterPrerender(Browser* browser) { |
| + ui_test_utils::NavigateToURL( |
| + browser, |
| + test_server()->GetURL("files/prerender/prerender_page.html")); |
| } |
| + void GoBackToPrerender(Browser* browser) { |
| + ui_test_utils::WindowedNotificationObserver back_nav_observer( |
| + content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| + NotificationService::AllSources()); |
| + browser->GoBack(CURRENT_TAB); |
| + back_nav_observer.Wait(); |
| + bool original_prerender_page = false; |
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + browser->GetSelectedTabContents()->render_view_host(), L"", |
| + L"window.domAutomationController.send(IsOriginalPrerenderPage())", |
| + &original_prerender_page)); |
| + EXPECT_TRUE(original_prerender_page); |
| + } |
| + |
| // Should be const but test_server()->GetURL(...) is not const. |
| void NavigateToURL(const std::string& dest_html_file) { |
| GURL dest_url = test_server()->GetURL(dest_html_file); |
| @@ -684,6 +690,34 @@ |
| } |
| } |
| + // Opens the prerendered page using javascript functions in the |
| + // loader page. |javascript_function_name| should be a 0 argument function |
| + // which is invoked. |contents_should_be_shown| indicates whether the |
| + // prerendered page expects to become visible or stay hidden. |
| + void OpenDestURLWithJSImpl(const std::wstring& javascript_function_name, |
| + bool contents_should_be_shown) const { |
| + TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
| + ASSERT_TRUE(prerender_contents != NULL); |
| + prerender_contents->set_quit_message_loop_on_destruction(false); |
| + prerender_contents->set_should_be_shown(contents_should_be_shown); |
| + |
| + bool javascript_function_result = false; |
| + std::wstring javascript_to_execute = |
| + L"window.domAutomationController.send(" + |
| + javascript_function_name + |
| + L"())"; |
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + browser()->GetSelectedTabContents()->render_view_host(), L"", |
| + javascript_to_execute, &javascript_function_result)); |
| + EXPECT_TRUE(javascript_function_result); |
| + |
| + // If the prerender contents has not been destroyed, run message loop. |
| + if (GetPrerenderContents() != NULL) { |
| + prerender_contents->set_quit_message_loop_on_destruction(true); |
| + ui_test_utils::RunMessageLoop(); |
| + } |
| + } |
| + |
| WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; |
| #if defined(ENABLE_SAFE_BROWSING) |
| scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; |
| @@ -1393,22 +1427,20 @@ |
| // Checks that if a page is opened in a new window by javascript the |
| // prerendered page is not used. |
| -IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| - PrerenderWindowOpenerJsOpenInNewPageTest) { |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowOpenerWindowOpen) { |
| PrerenderTestURL("files/prerender/prerender_page.html", |
| FINAL_STATUS_WINDOW_OPENER, |
| 1); |
| - OpenDestUrlInNewWindowViaJs(); |
| + OpenDestURLViaWindowOpen(); |
| } |
| // Checks that if a page is opened due to click on a href with target="_blank" |
| // the prerendered page is not used. |
| -IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| - PrerenderWindowOpenerClickOpenInNewPageTest) { |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowOpenerClickTarget) { |
| PrerenderTestURL("files/prerender/prerender_page.html", |
| FINAL_STATUS_WINDOW_OPENER, |
| 1); |
| - OpenDestUrlInNewWindowViaClick(); |
| + OpenDestURLViaClickTarget(); |
| } |
| // TODO(shishir): Add a test for the case when the page having the |
| @@ -1637,48 +1669,115 @@ |
| EXPECT_TRUE(GetPrerenderContents() == NULL); |
| } |
| -// Flaky on windows: http://crbug.com/92478 |
| -#if defined(OS_WIN) |
| -#define MAYBE_BackToPrerenderedPage DISABLED_BackToPrerenderedPage |
| -#else |
| -#define MAYBE_BackToPrerenderedPage BackToPrerenderedPage |
| -#endif |
| +// Prerendering and history tests. |
| +// The prerendered page is navigated to in several ways [navigate via |
| +// omnibox, click on link, key-modified click to open in background tab, etc], |
| +// followed by a navigation to another page from the prerendered page, followed |
| +// by a back navigation. |
| -IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_BackToPrerenderedPage) { |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { |
| PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| FINAL_STATUS_USED, |
| 1); |
| + NavigateToDestURL(); |
| + ClickToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| - OpenDestUrlViaClick(); |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderNavigateNavigateGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + NavigateToDestURL(); |
| + NavigateToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| - // Click on the link in the page and wait for it to commit |
| - { |
| - ui_test_utils::WindowedNotificationObserver new_page_observer( |
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| - NotificationService::AllSources()); |
| - bool click_link_result = false; |
| - ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| - browser()->GetSelectedTabContents()->render_view_host(), L"", |
| - L"window.domAutomationController.send(ClickOpenLink())", |
| - &click_link_result)); |
| - EXPECT_TRUE(click_link_result); |
| - new_page_observer.Wait(); |
| - } |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickClickGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClick(); |
| + ClickToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| - // Now, go back to the prerendered page. |
| - { |
| - ui_test_utils::WindowedNotificationObserver back_nav_observer( |
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| - NotificationService::AllSources()); |
| - browser()->GoBack(CURRENT_TAB); |
| - back_nav_observer.Wait(); |
| - bool original_prerender_page = false; |
| - ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| - browser()->GetSelectedTabContents()->render_view_host(), L"", |
| - L"window.domAutomationController.send(IsOriginalPrerenderPage())", |
| - &original_prerender_page)); |
| - EXPECT_TRUE(original_prerender_page); |
| - } |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClick(); |
| + NavigateToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| } |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderClickNewWindowClickGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClickNewWindow(); |
| + Browser* new_browser = BrowserList::GetLastActive(); |
| + NavigateToNextPageAfterPrerender(new_browser); |
| + GoBackToPrerender(new_browser); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderClickNewWindowNavigateGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClickNewWindow(); |
| + Browser* new_browser = BrowserList::GetLastActive(); |
| + ClickToNextPageAfterPrerender(new_browser); |
| + GoBackToPrerender(new_browser); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderClickNewForegroundTabClickGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClickNewForegroundTab(); |
| + NavigateToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderClickNewForegroundTabNavigateGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClickNewForegroundTab(); |
| + ClickToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderClickNewBackgroundTabClickGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClickNewBackgroundTab(); |
| + // SelectNextTab completes synchronously, in terms of |
| + // updating the active index. |
| + browser()->SelectNextTab(); |
| + NavigateToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + PrerenderClickNewBackgroundTabNavigateGoBack) { |
| + PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
| + FINAL_STATUS_USED, |
| + 1); |
| + OpenDestURLViaClickNewBackgroundTab(); |
| + // SelectNextTab completes synchronously, in terms of |
| + // updating the active index. |
| + browser()->SelectNextTab(); |
| + ClickToNextPageAfterPrerender(browser()); |
| + GoBackToPrerender(browser()); |
| +} |
| + |
| } // namespace prerender |