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 |