Index: chrome/browser/prerender/prerender_browsertest.cc |
=================================================================== |
--- chrome/browser/prerender/prerender_browsertest.cc (revision 269781) |
+++ chrome/browser/prerender/prerender_browsertest.cc (working copy) |
@@ -1124,6 +1124,12 @@ |
return scoped_ptr<TestPrerender>(prerenders[0]); |
} |
+ // Navigates to a URL, unrelated to prerendering |
+ void NavigateStraightToURL(const std::string dest_html_file) { |
+ ui_test_utils::NavigateToURL(current_browser(), |
+ test_server()->GetURL(dest_html_file)); |
+ } |
+ |
void NavigateToDestURL() const { |
NavigateToDestURLWithDisposition(CURRENT_TAB, true); |
} |
@@ -1484,6 +1490,22 @@ |
base::ASCIIToUTF16(page_title)); |
} |
+ void RunJSReturningString(const char* js, std::string* result) { |
+ ASSERT_TRUE( |
+ content::ExecuteScriptAndExtractString( |
+ GetActiveWebContents(), |
+ base::StringPrintf("window.domAutomationController.send(%s)", |
+ js).c_str(), |
+ result)); |
+ } |
+ |
+ void RunJS(const char* js) { |
+ ASSERT_TRUE(content::ExecuteScript( |
+ GetActiveWebContents(), |
+ base::StringPrintf("window.domAutomationController.send(%s)", |
+ js).c_str())); |
+ } |
+ |
protected: |
bool autostart_test_server_; |
@@ -4153,6 +4175,103 @@ |
histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); |
} |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
+ PrerenderCookieChangeConflictTest) { |
+ NavigateStraightToURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); |
+ |
+ GURL url = test_server()->GetURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); |
+ |
+ scoped_ptr<TestPrerender> prerender = |
+ ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); |
+ AddPrerender(url, 1); |
+ prerender->WaitForStart(); |
+ prerender->WaitForLoads(1); |
+ // Ensure that in the prerendered page, querying the cookie again |
+ // via javascript yields the same value that was set during load. |
+ EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); |
+ |
+ // The prerender has loaded. Ensure that the change is not visible |
+ // to visible tabs. |
+ std::string value; |
+ RunJSReturningString("GetCookie('c')", &value); |
+ ASSERT_EQ(value, "1"); |
+ |
+ // Make a conflicting cookie change, which should cancel the prerender. |
+ RunJS("SetCookie('c', '3')"); |
+ prerender->WaitForStop(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCookieChangeUseTest) { |
+ // Permit 2 concurrent prerenders. |
+ GetPrerenderManager()->mutable_config().max_link_concurrency = 2; |
+ GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; |
+ |
+ // Go to a first URL setting the cookie to value "1". |
+ NavigateStraightToURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); |
+ |
+ // Prerender a URL setting the cookie to value "2". |
+ GURL url = test_server()->GetURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); |
+ |
+ scoped_ptr<TestPrerender> prerender1 = ExpectPrerender(FINAL_STATUS_USED); |
+ AddPrerender(url, 1); |
+ prerender1->WaitForStart(); |
+ prerender1->WaitForLoads(1); |
+ |
+ // Launch a second prerender, setting the cookie to value "3". |
+ scoped_ptr<TestPrerender> prerender2 = |
+ ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); |
+ AddPrerender(test_server()->GetURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=3"), 1); |
+ prerender2->WaitForStart(); |
+ prerender2->WaitForLoads(1); |
+ |
+ // Both prerenders have loaded. Ensure that the visible tab is still |
+ // unchanged and cannot see their changes. |
+ // to visible tabs. |
+ std::string value; |
+ RunJSReturningString("GetCookie('c')", &value); |
+ ASSERT_EQ(value, "1"); |
+ |
+ // Navigate to the prerendered URL. The first prerender should be swapped in, |
+ // and the changes should now be visible. The second prerender should |
+ // be cancelled due to the conflict. |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ current_browser(), |
+ url, |
+ CURRENT_TAB, |
+ ui_test_utils::BROWSER_TEST_NONE); |
+ RunJSReturningString("GetCookie('c')", &value); |
+ ASSERT_EQ(value, "2"); |
+ prerender2->WaitForStop(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
+ PrerenderCookieChangeConflictHTTPHeaderTest) { |
+ NavigateStraightToURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); |
+ |
+ GURL url = test_server()->GetURL("set-cookie?c=2"); |
+ scoped_ptr<TestPrerender> prerender = |
+ ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); |
+ AddPrerender(url, 1); |
+ prerender->WaitForStart(); |
+ prerender->WaitForLoads(1); |
+ |
+ // The prerender has loaded. Ensure that the change is not visible |
+ // to visible tabs. |
+ std::string value; |
+ RunJSReturningString("GetCookie('c')", &value); |
+ ASSERT_EQ(value, "1"); |
+ |
+ // Make a conflicting cookie change, which should cancel the prerender. |
+ RunJS("SetCookie('c', '3')"); |
+ prerender->WaitForStop(); |
+} |
+ |
// Checks that a prerender which calls window.close() on itself is aborted. |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { |
DisableLoadEventCheck(); |