Index: chrome/browser/prerender/prerender_nostate_prefetch_test.cc |
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_test.cc b/chrome/browser/prerender/prerender_nostate_prefetch_test.cc |
index c6a751dc5ac5827aa5ad900486802349458dd34f..5fe40034962750951d4ea185f556acaea5aef3cd 100644 |
--- a/chrome/browser/prerender/prerender_nostate_prefetch_test.cc |
+++ b/chrome/browser/prerender/prerender_nostate_prefetch_test.cc |
@@ -36,16 +36,18 @@ namespace prerender { |
// etc) are fussy about relative versus absolute paths. With the exception of |
// kPrefetchLoaderPath, which is only used in PrerenderTestURLImpl, all other |
// paths should be relative. |
+const char kPrefetchMetaCSP[] = "prerender/prerender_prefetch_meta_csp.html"; |
+const char kPrefetchResponseHeaderCSP[] = |
+ "prerender/prerender_prefetch_response_csp.html"; |
+const char kPrefetchImagePage[] = "prerender/prerender_prefetch_image.html"; |
+const char kPrefetchJpeg[] = "prerender/image.jpeg"; |
const char kPrefetchLoaderPath[] = "/prerender/prerender_prefetch_loader.html"; |
+const char kPrefetchLoopPage[] = "prerender/prerender_prefetch_loop.html"; |
const char kPrefetchPage[] = "prerender/prerender_prefetch_page.html"; |
-const char kPrefetchScript[] = "prerender/prerender_prefetch.js"; |
const char kPrefetchPage2[] = "prerender/prerender_prefetch_page2.html"; |
-const char kPrefetchScript2[] = "prerender/prerender_prefetch2.js"; |
-const char kPrefetchImagePage[] = "prerender/prerender_prefetch_image.html"; |
-const char kPrefetchLoopPage[] = "prerender/prerender_prefetch_loop.html"; |
- |
-const char kPrefetchJpeg[] = "prerender/image.jpeg"; |
const char kPrefetchPng[] = "prerender/image.png"; |
+const char kPrefetchScript[] = "prerender/prerender_prefetch.js"; |
+const char kPrefetchScript2[] = "prerender/prerender_prefetch2.js"; |
const char kPageBool[] = "pageBool"; |
const char kScriptBool[] = "scriptBool"; |
@@ -74,6 +76,18 @@ class NoStatePrefetchBrowserTest |
counter->AsWeakPtr())); |
} |
+ // Set up a request counter for a specific URL, serving data from path. |
+ void CountRequestFor(const GURL& url, |
+ const std::string& path, |
+ RequestCounter* counter) { |
+ base::FilePath url_file = |
+ ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path)); |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, FROM_HERE, |
+ base::Bind(&CreateCountingInterceptorOnIO, url, url_file, |
+ counter->AsWeakPtr())); |
+ } |
+ |
// Fetches a boolean value from javascript. Returns whether the fetch |
// succeeded; the value of the variable is returned in value. If |
// javascript_variable does not exist, this returns false and value is |
@@ -217,6 +231,47 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) { |
"Prerender.webcross_PrerenderNotSwappedInPLT", 1); |
} |
+// Check that response header CSP is handled correctly. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) { |
+ static const std::string secondary_domain = "foo.bar"; |
+ host_resolver()->AddRule(secondary_domain, "127.0.0.1"); |
+ RequestCounter main_page; |
+ CountRequestFor(kPrefetchResponseHeaderCSP, &main_page); |
+ RequestCounter first_script; |
+ CountRequestFor(kPrefetchScript, &first_script); |
+ RequestCounter second_script; |
+ GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); |
+ CountRequestFor(second_script_url, kPrefetchScript2, &second_script); |
+ PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1); |
+ // The second scrip is in the correct domain for CSP, but the first script is |
droger
2016/09/21 11:05:39
s/scrip/script/
mattcary
2016/09/21 14:47:47
Done.
|
+ // not. |
+ main_page.WaitForCount(1); |
+ second_script.WaitForCount(1); |
+ first_script.WaitForCount(0); |
+} |
+ |
+// Check CSP in the meta tag cancels the prefetch. |
+// TODO(mattcary): probably we don't want to cancel this so we're consistent |
+// with response-header CSP. But it seems to be difficult, and probably meta tag |
+// CSP is not as common, so it may not be worth the complexity. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) { |
+ static const std::string secondary_domain = "foo.bar"; |
+ host_resolver()->AddRule(secondary_domain, "127.0.0.1"); |
+ RequestCounter main_page; |
+ CountRequestFor(kPrefetchMetaCSP, &main_page); |
+ RequestCounter first_script; |
+ CountRequestFor(kPrefetchScript, &first_script); |
+ RequestCounter second_script; |
+ GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); |
+ CountRequestFor(second_script_url, kPrefetchScript2, &second_script); |
+ PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1); |
+ // Probably we should be loading the second script. But currently we bail on |
+ // the preload scanner if we see the CSP meta tag |
+ main_page.WaitForCount(1); |
+ second_script.WaitForCount(0); |
+ first_script.WaitForCount(0); |
+} |
+ |
// Check that we support simultaneous prefetch. |
IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { |
RequestCounter first_main_counter; |