Chromium Code Reviews| Index: chrome/browser/prerender/prerender_browsertest.cc |
| diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
| index a8b274f1db4a7882c3a4de3b17b02656e67be010..f7deae5b482d29819c3c3acae51ce4316322d738 100644 |
| --- a/chrome/browser/prerender/prerender_browsertest.cc |
| +++ b/chrome/browser/prerender/prerender_browsertest.cc |
| @@ -49,6 +49,18 @@ std::string CreateServerRedirect(const std::string& dest_url) { |
| return kServerRedirectBase + dest_url; |
| } |
| +// Returns true iff the final status is one in which the prerendered |
| +// page should prerender correctly. The page still may not be used. |
| +bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) { |
|
cbentzel
2011/05/12 11:17:08
Is this needed anymore? The prerendered page is de
Shishir
2011/05/12 22:05:18
This is still needed as in the opener case, the pr
|
| + switch (status) { |
| + case FINAL_STATUS_USED: |
| + case FINAL_STATUS_WINDOW_OPENER: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| // PrerenderContents that stops the UI message loop on DidStopLoading(). |
| class TestPrerenderContents : public PrerenderContents { |
| public: |
| @@ -89,7 +101,7 @@ class TestPrerenderContents : public PrerenderContents { |
| virtual void DidStopLoading() OVERRIDE { |
| PrerenderContents::DidStopLoading(); |
| ++number_of_loads_; |
| - if (expected_final_status_ == FINAL_STATUS_USED && |
| + if (ShouldRenderPrerenderedPageCorrectly(expected_final_status_) && |
| number_of_loads_ >= expected_number_of_loads_) { |
| MessageLoopForUI::current()->Quit(); |
| } else if (expected_final_status_ == FINAL_STATUS_RENDERER_CRASHED) { |
| @@ -211,6 +223,14 @@ class PrerenderBrowserTest : public InProcessBrowserTest { |
| NavigateToURLImpl(dest_url_); |
| } |
| + void OpenDestUrlInNewWindowViaJs() const { |
|
cbentzel
2011/05/12 11:17:08
In these two cases, you don't need to do the inter
Shishir
2011/05/12 22:05:18
Done.
|
| + OpenDestUrlInNewWindowViaJsImpl(); |
| + } |
| + |
| + void OpenDestUrlInNewWindowViaClick() const { |
| + OpenDestUrlInNewWindowViaClickImpl(); |
| + } |
| + |
| // 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); |
| @@ -301,29 +321,50 @@ class PrerenderBrowserTest : public InProcessBrowserTest { |
| static_cast<TestPrerenderContents*>( |
| prerender_manager()->FindEntry(dest_url_)); |
| - switch (expected_final_status) { |
| - case FINAL_STATUS_USED: { |
| - ASSERT_TRUE(prerender_contents != NULL); |
| - |
| - if (call_javascript_) { |
| - // Check if page behaves as expected while in prerendered state. |
| - bool prerender_test_result = false; |
| - ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| - prerender_contents->render_view_host_mutable(), L"", |
| - L"window.domAutomationController.send(DidPrerenderPass())", |
| - &prerender_test_result)); |
| - EXPECT_TRUE(prerender_test_result); |
| - } |
| - break; |
| + if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { |
| + ASSERT_TRUE(prerender_contents != NULL); |
| + EXPECT_EQ(prerender_contents->final_status(), FINAL_STATUS_MAX); |
|
sreeram
2011/05/12 02:36:41
Swap the arguments. In EXPECT_EQ, the first argume
Shishir
2011/05/12 22:05:18
Done.
|
| + |
| + if (call_javascript_) { |
| + // Check if page behaves as expected while in prerendered state. |
| + bool prerender_test_result = false; |
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + prerender_contents->render_view_host_mutable(), L"", |
| + L"window.domAutomationController.send(DidPrerenderPass())", |
| + &prerender_test_result)); |
| + EXPECT_TRUE(prerender_test_result); |
| } |
| - default: |
| - // In the failure case, we should have removed dest_url_ from the |
| - // prerender_manager. |
| - EXPECT_TRUE(prerender_contents == NULL); |
| - break; |
| + } else { |
| + // In the failure case, we should have removed dest_url_ from the |
| + // prerender_manager. |
| + EXPECT_TRUE(prerender_contents == NULL); |
| } |
| } |
| + void OpenDestUrlInNewWindowViaClickImpl() const { |
| + // Make sure in navigating we have a URL to use in the PrerenderManager. |
| + EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) != NULL); |
| + |
| + bool click_prerendered_link_result = false; |
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + browser()->GetSelectedTabContents()->render_view_host(), L"", |
| + L"window.domAutomationController.send(ClickOpenPrerenderedLinkInNewWindow())", |
|
cbentzel
2011/05/12 11:17:08
Nit: 80 char-line. However, this may be more reada
Shishir
2011/05/12 22:05:18
Done.
|
| + &click_prerendered_link_result)); |
| + EXPECT_TRUE(click_prerendered_link_result); |
| + } |
| + |
| + void OpenDestUrlInNewWindowViaJsImpl() const { |
| + // Make sure in navigating we have a URL to use in the PrerenderManager. |
| + EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) != NULL); |
| + |
| + bool open_window_result = false; |
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + browser()->GetSelectedTabContents()->render_view_host(), L"", |
| + L"window.domAutomationController.send(JsOpenPrerenderedLinkInNewWindow())", |
| + &open_window_result)); |
| + EXPECT_TRUE(open_window_result); |
| + } |
| + |
| void NavigateToURLImpl(const GURL& dest_url) const { |
| // Make sure in navigating we have a URL to use in the PrerenderManager. |
| EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) != NULL); |
| @@ -953,4 +994,27 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { |
| NavigateToDestURL(); |
| } |
| +// 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) { |
| + PrerenderTestURL("files/prerender/prerender_page.html", |
| + FINAL_STATUS_WINDOW_OPENER, |
| + 1); |
| + OpenDestUrlInNewWindowViaJs(); |
| +} |
| + |
| +// 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) { |
| + PrerenderTestURL("files/prerender/prerender_page.html", |
| + FINAL_STATUS_WINDOW_OPENER, |
| + 1); |
| + OpenDestUrlInNewWindowViaClick(); |
| +} |
| + |
| +// TODO(shishir): Add a test for the case when the page having the |
| +// prerendering link already has an opener set. |
| + |
| } // namespace prerender |