| Index: chrome/browser/prerender/prerender_browsertest.cc
|
| ===================================================================
|
| --- chrome/browser/prerender/prerender_browsertest.cc (revision 269838)
|
| +++ 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();
|
| @@ -4230,6 +4349,11 @@
|
|
|
| // Checks that closing the omnibox popup cancels an omnibox prerender.
|
| IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxCancel) {
|
| + // Ensure the cookie store has been loaded.
|
| + ui_test_utils::NavigateToURL(
|
| + current_browser(),
|
| + test_server()->GetURL("files/empty.html?loadcookies"));
|
| +
|
| // Fake an omnibox prerender.
|
| scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender(
|
| test_server()->GetURL("files/empty.html"),
|
| @@ -4247,6 +4371,11 @@
|
| GetPrerenderManager()->mutable_config().abandon_time_to_live =
|
| base::TimeDelta::FromDays(999);
|
|
|
| + // Ensure the cookie store has been loaded.
|
| + ui_test_utils::NavigateToURL(
|
| + current_browser(),
|
| + test_server()->GetURL("files/empty.html?loadcookies"));
|
| +
|
| // Enter a URL into the Omnibox.
|
| OmniboxView* omnibox_view = GetOmniboxView();
|
| omnibox_view->OnBeforePossibleChange();
|
|
|