Commit 61c33815 authored by Matthew Cary's avatar Matthew Cary Committed by Commit Bot

Prerender: reland test for nostate prefetch cookie behavior.

This relands crrev.com/c/691663 which confirms that nostate prefetch
sets cookies on all fetches. In the interim a test for cross-domain
fetches has been added.

The original CL was reverted due to flakes on windows. I could not
reliably reproduce the flakes, but in addition to the usual CQ, I've
run this several times on the windows bots, and it is no longer
flaking. Perhaps commit e23356c2 which moved browser_test_utils to
mojo access of cookies removed whatever race existed, or perhaps using
PostDelayedTask instead of sleeping fixed it.

Bug: 
Change-Id: I71ef3053c71da53e21093dc57d977e3992d279ef
Reviewed-on: https://chromium-review.googlesource.com/695221
Commit-Queue: Matthew Cary <mattcary@chromium.org>
Reviewed-by: default avatarEgor Pasko <pasko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#522067}
parent 7e085497
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/task_scheduler/post_task.h" #include "base/task_scheduler/post_task.h"
#include "base/test/simple_test_tick_clock.h" #include "base/test/simple_test_tick_clock.h"
#include "base/threading/platform_thread.h"
#include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/history/history_test_utils.h" #include "chrome/browser/history/history_test_utils.h"
#include "chrome/browser/prerender/prerender_handle.h" #include "chrome/browser/prerender/prerender_handle.h"
...@@ -39,19 +40,71 @@ ...@@ -39,19 +40,71 @@
#include "content/public/test/url_loader_interceptor.h" #include "content/public/test/url_loader_interceptor.h"
#include "net/base/escape.h" #include "net/base/escape.h"
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/cookies/cookie_store.h"
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/request_handler_util.h" #include "net/test/embedded_test_server/request_handler_util.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
using prerender::test_utils::DestructionWaiter; using prerender::test_utils::DestructionWaiter;
using prerender::test_utils::RequestCounter; using prerender::test_utils::RequestCounter;
using prerender::test_utils::TestPrerender; using prerender::test_utils::TestPrerender;
namespace {
// Helper method that verifies cookies for PrefetchCookies* tests. When the
// cookies expected from loading test/data/prerender/cookie.{js,html}. |loop| is
// notified when the cookies are found; if the cookies are not found this will
// wait forever.
void CheckCookiesForPrefetchCookieTest(base::RunLoop* loop,
GURL url,
net::CookieStore* cookie_store,
const net::CookieList& cookies) {
bool found_chocolate = false;
bool found_oatmeal = false;
for (const auto& c : cookies) {
if (c.Name() == "chocolate-chip") {
EXPECT_EQ("the-best", c.Value());
found_chocolate = true;
}
if (c.Name() == "oatmeal") {
EXPECT_EQ("sublime", c.Value());
found_oatmeal = true;
}
}
if (found_oatmeal && found_chocolate) {
loop->Quit();
} else {
content::BrowserThread::PostDelayedTask(
content::BrowserThread::IO, FROM_HERE,
base::BindOnce(&net::CookieStore::GetAllCookiesForURLAsync,
base::Unretained(cookie_store), url,
base::BindOnce(CheckCookiesForPrefetchCookieTest, loop,
url, cookie_store)),
base::TimeDelta::FromMilliseconds(250));
}
}
// Launches the CheckCookiesForPrefetchCookieTest from the IO thread.
void LaunchPrefetchCookieTestFromIO(content::StoragePartition* storage,
base::RunLoop* loop,
GURL url) {
net::CookieStore* cookie_store =
storage->GetURLRequestContext()->GetURLRequestContext()->cookie_store();
cookie_store->GetAllCookiesForURLAsync(
url, base::BindOnce(CheckCookiesForPrefetchCookieTest, loop, url,
cookie_store));
}
} // namespace
namespace prerender { namespace prerender {
const char k302RedirectPage[] = "/prerender/302_redirect.html"; const char k302RedirectPage[] = "/prerender/302_redirect.html";
const char kPrefetchAppcache[] = "/prerender/prefetch_appcache.html"; const char kPrefetchAppcache[] = "/prerender/prefetch_appcache.html";
const char kPrefetchAppcacheManifest[] = "/prerender/appcache.manifest"; const char kPrefetchAppcacheManifest[] = "/prerender/appcache.manifest";
const char kPrefetchCookiePage[] = "/prerender/cookie.html";
const char kPrefetchImagePage[] = "/prerender/prefetch_image.html"; const char kPrefetchImagePage[] = "/prerender/prefetch_image.html";
const char kPrefetchJpeg[] = "/prerender/image.jpeg"; const char kPrefetchJpeg[] = "/prerender/image.jpeg";
const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html";
...@@ -64,9 +117,9 @@ const char kPrefetchResponseHeaderCSP[] = ...@@ -64,9 +117,9 @@ const char kPrefetchResponseHeaderCSP[] =
"/prerender/prefetch_response_csp.html"; "/prerender/prefetch_response_csp.html";
const char kPrefetchScript[] = "/prerender/prefetch.js"; const char kPrefetchScript[] = "/prerender/prefetch.js";
const char kPrefetchScript2[] = "/prerender/prefetch2.js"; const char kPrefetchScript2[] = "/prerender/prefetch2.js";
const char kServiceWorkerLoader[] = "/prerender/service_worker.html";
const char kPrefetchSubresourceRedirectPage[] = const char kPrefetchSubresourceRedirectPage[] =
"/prerender/prefetch_subresource_redirect.html"; "/prerender/prefetch_subresource_redirect.html";
const char kServiceWorkerLoader[] = "/prerender/service_worker.html";
class NoStatePrefetchBrowserTest class NoStatePrefetchBrowserTest
: public test_utils::PrerenderInProcessBrowserTest, : public test_utils::PrerenderInProcessBrowserTest,
...@@ -230,6 +283,46 @@ IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchSimple) { ...@@ -230,6 +283,46 @@ IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchSimple) {
WaitForRequestCount(src_server()->GetURL(kPrefetchScript2), 0); WaitForRequestCount(src_server()->GetURL(kPrefetchScript2), 0);
} }
// Check cookie loading for prefetched pages.
IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchCookie) {
GURL url = src_server()->GetURL(kPrefetchCookiePage);
std::unique_ptr<TestPrerender> test_prerender =
PrefetchFromURL(url, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
content::StoragePartition* storage_partition =
content::BrowserContext::GetStoragePartitionForSite(
current_browser()->profile(), url, false);
base::RunLoop loop;
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
base::BindOnce(LaunchPrefetchCookieTestFromIO, storage_partition, &loop,
url));
loop.Run();
// Will timeout if cookies aren't found.
}
// Check cookie loading for a cross-domain prefetched pages.
IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchCookieCrossDomain) {
static const std::string secondary_domain = "www.foo.com";
GURL cross_domain_url(base::StringPrintf(
"http://%s:%d%s", secondary_domain.c_str(),
embedded_test_server()->host_port_pair().port(), kPrefetchCookiePage));
std::unique_ptr<TestPrerender> test_prerender =
PrefetchFromURL(cross_domain_url, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
content::StoragePartition* storage_partition =
content::BrowserContext::GetStoragePartitionForSite(
current_browser()->profile(), cross_domain_url, false);
base::RunLoop loop;
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
base::BindOnce(LaunchPrefetchCookieTestFromIO, storage_partition, &loop,
cross_domain_url));
loop.Run();
// Will timeout if cookies aren't found.
}
// Check that the LOAD_PREFETCH flag is set. // Check that the LOAD_PREFETCH flag is set.
IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchLoadFlag) { IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchLoadFlag) {
GURL prefetch_page = src_server()->GetURL(kPrefetchPage); GURL prefetch_page = src_server()->GetURL(kPrefetchPage);
......
<html>
<!--
This page checks that cookies are set when prefetching happens.
This page (cookie.html) sets one cookie, and the included script (cookie.js)
sets a different cookie. Both cookies are expected to be set during no-state
prefetch.
-->
<head>
<title>Prefetch Page</title>
<script src="cookie.js" type="text/javascript"></script>
</head>
<body>
<img src="image.png"/>
</body>
</html>
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: chocolate-chip=the-best
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This trivial JS file is just an excuse to set a cookie.
var theScriptHasExecuted = true;
HTTP/1.1 200 OK
Content-Type: text/javascript
Set-Cookie: oatmeal=sublime
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment