Chromium Code Reviews| 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..c373f0865c6d13ab304c16e85e3301eff7217767 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, |
|
pasko
2016/09/26 17:05:10
CountRequestForUrl() looks better than this overlo
mattcary
2016/09/27 08:13:18
Done.
|
| + 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 script is in the correct domain for CSP, but the first script is |
| + // not. |
| + main_page.WaitForCount(1); |
| + second_script.WaitForCount(1); |
| + first_script.WaitForCount(0); |
|
pasko
2016/09/26 17:05:10
does WaitForCount actually check that it won't cou
mattcary
2016/09/27 08:13:18
No. There doesn't seem to be an easy way to confir
pasko
2016/10/05 14:09:55
Agreed. I am working on signalling from the scanne
mattcary
2016/10/12 15:09:10
Done.
|
| +} |
| + |
| +// Check CSP in the meta tag cancels the prefetch. |
| +// TODO(mattcary): probably we don't want to cancel this so we're consistent |
|
pasko
2016/09/26 17:05:10
by 'this' do you mean the prefetch or the request?
mattcary
2016/09/27 08:13:18
Clarified the comment.
By "this" I mean the prere
pasko
2016/10/05 14:09:55
Ah, good to know. It is indeed good to have a test
|
| +// 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 |
|
pasko
2016/09/26 17:05:10
I am confused. What does it mean to 'bail out on t
mattcary
2016/09/27 08:13:18
Clarified the comment. See above.
|
| + 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; |