Index: chrome/browser/prerender/prerender_browsertest.cc |
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
index 004b6277fbe3ebe938ac3cb86333e4d2d2ac2ef4..41aa1a5978fb740ab2dbe3e4a08eb15230f39f50 100644 |
--- a/chrome/browser/prerender/prerender_browsertest.cc |
+++ b/chrome/browser/prerender/prerender_browsertest.cc |
@@ -53,6 +53,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) { |
+ 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: |
@@ -96,6 +108,7 @@ class TestPrerenderContents : public PrerenderContents { |
// When the PrerenderContents is destroyed, quit the UI message loop. |
// This happens on navigation to used prerendered pages, and soon |
// after cancellation of unused prerendered pages. |
+ MessageLoopForUI::current()->RunAllPending(); |
MessageLoopForUI::current()->Quit(); |
} |
@@ -113,7 +126,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) { |
@@ -284,6 +297,30 @@ class PrerenderBrowserTest : public InProcessBrowserTest { |
NavigateToURLImpl(dest_url_); |
} |
+ void OpenDestUrlInNewWindowViaJs() 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(JsOpenLinkInNewWindow())", |
+ &open_window_result)); |
+ EXPECT_TRUE(open_window_result); |
+ } |
+ |
+ void OpenDestUrlInNewWindowViaClick() 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(ClickOpenLinkInNewWindow())", |
+ &click_prerendered_link_result)); |
+ EXPECT_TRUE(click_prerendered_link_result); |
+ } |
+ |
// 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); |
@@ -374,26 +411,23 @@ 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(FINAL_STATUS_MAX, prerender_contents->final_status()); |
+ |
+ 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); |
} |
} |
@@ -1081,4 +1115,27 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { |
1); |
} |
+// 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 |