Index: chrome/browser/prerender/prerender_browsertest.cc |
=================================================================== |
--- chrome/browser/prerender/prerender_browsertest.cc (revision 265252) |
+++ chrome/browser/prerender/prerender_browsertest.cc (working copy) |
@@ -1110,6 +1110,15 @@ |
return scoped_ptr<TestPrerender>(prerenders[0]); |
} |
+ // Navigates to a URL, unrelated to prerendering |
+ void NavigateStraightToURL(const std::string dest_html_file) { |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ current_browser(), |
+ test_server()->GetURL(dest_html_file), |
+ CURRENT_TAB, |
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ } |
+ |
void NavigateToDestURL() const { |
NavigateToDestURLWithDisposition(CURRENT_TAB, true); |
} |
@@ -1470,6 +1479,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_; |
@@ -4149,6 +4174,62 @@ |
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); |
+ |
+ // 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) { |
+ 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_USED); |
+ 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"); |
+ |
+ // Navigate to the prerendered URL. The prerender should be swapped in, |
+ // and the changes should now be visible. |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ current_browser(), |
+ url, |
+ CURRENT_TAB, |
+ ui_test_utils::BROWSER_TEST_NONE); |
+ NavigateStraightToURL( |
+ "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); |
+ RunJSReturningString("GetCookie('c')", &value); |
+ ASSERT_EQ(value, "2"); |
+} |
+ |
class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { |
public: |
virtual void SetUpOnMainThread() OVERRIDE { |