Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Unified Diff: chrome/browser/prerender/prerender_browsertest.cc

Issue 233353003: Only commit cookie changes in prerenders after a prerender is shown (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: sync @269781 + 'autlock'->'autolock' from erik's comment that was not included before Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
« no previous file with comments | « chrome/browser/prerender/external_prerender_handler_android.cc ('k') | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698