OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/strings/string_split.h" | 6 #include "base/strings/string_split.h" |
7 #include "chrome/browser/prerender/prerender_manager.h" | 7 #include "chrome/browser/prerender/prerender_manager.h" |
8 #include "chrome/browser/prerender/prerender_manager_factory.h" | 8 #include "chrome/browser/prerender/prerender_manager_factory.h" |
9 #include "chrome/browser/prerender/prerender_test_utils.h" | 9 #include "chrome/browser/prerender/prerender_test_utils.h" |
10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
(...skipping 22 matching lines...) Expand all Loading... | |
33 namespace prerender { | 33 namespace prerender { |
34 | 34 |
35 // The various uses of URLs in these tests (the test server, request capture, | 35 // The various uses of URLs in these tests (the test server, request capture, |
36 // etc) are fussy about relative versus absolute paths. With the exception of | 36 // etc) are fussy about relative versus absolute paths. With the exception of |
37 // kPrefetchLoaderPath, which is only used in PrerenderTestURLImpl, all other | 37 // kPrefetchLoaderPath, which is only used in PrerenderTestURLImpl, all other |
38 // paths should be relative. | 38 // paths should be relative. |
39 const char kPrefetchImagePage[] = "prerender/prefetch_image.html"; | 39 const char kPrefetchImagePage[] = "prerender/prefetch_image.html"; |
40 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; | 40 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; |
41 const char kPrefetchJpeg[] = "prerender/image.jpeg"; | 41 const char kPrefetchJpeg[] = "prerender/image.jpeg"; |
42 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; | 42 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; |
43 const char kPrefetchMetaCSP[] = "prerender/prefetch_meta_csp.html"; | |
pasko
2016/10/05 14:09:55
I liked how you sorted these before, what made you
mattcary
2016/10/12 15:09:10
There may be a merge thing here: the names are sor
pasko
2016/10/12 15:48:55
kPrefetchLoopPage[] looks misordered ..
mattcary
2016/10/13 08:44:27
Gah, thanks. Rebasing is hard.
| |
43 const char kPrefetchPage[] = "prerender/prefetch_page.html"; | 44 const char kPrefetchPage[] = "prerender/prefetch_page.html"; |
44 const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; | 45 const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; |
45 const char kPrefetchPng[] = "prerender/image.png"; | 46 const char kPrefetchPng[] = "prerender/image.png"; |
47 const char kPrefetchResponseHeaderCSP[] = | |
48 "prerender/prefetch_response_csp.html"; | |
46 const char kPrefetchScript[] = "prerender/prefetch.js"; | 49 const char kPrefetchScript[] = "prerender/prefetch.js"; |
47 const char kPrefetchScript2[] = "prerender/prefetch2.js"; | 50 const char kPrefetchScript2[] = "prerender/prefetch2.js"; |
48 const char kPrefetchSubresourceRedirectPage[] = | 51 const char kPrefetchSubresourceRedirectPage[] = |
49 "prerender/prefetch_subresource_redirect.html"; | 52 "prerender/prefetch_subresource_redirect.html"; |
50 | 53 |
51 const char kPageBool[] = "pageBool"; | 54 const char kPageBool[] = "pageBool"; |
52 const char kScriptBool[] = "scriptBool"; | 55 const char kScriptBool[] = "scriptBool"; |
53 | 56 |
54 class NoStatePrefetchBrowserTest | 57 class NoStatePrefetchBrowserTest |
55 : public test_utils::PrerenderInProcessBrowserTest { | 58 : public test_utils::PrerenderInProcessBrowserTest { |
56 public: | 59 public: |
57 NoStatePrefetchBrowserTest() {} | 60 NoStatePrefetchBrowserTest() {} |
58 | 61 |
59 void SetUpCommandLine(base::CommandLine* command_line) override { | 62 void SetUpCommandLine(base::CommandLine* command_line) override { |
60 PrerenderInProcessBrowserTest::SetUpCommandLine(command_line); | 63 PrerenderInProcessBrowserTest::SetUpCommandLine(command_line); |
61 command_line->AppendSwitchASCII( | 64 command_line->AppendSwitchASCII( |
62 switches::kPrerenderMode, switches::kPrerenderModeSwitchValuePrefetch); | 65 switches::kPrerenderMode, switches::kPrerenderModeSwitchValuePrefetch); |
63 } | 66 } |
64 | 67 |
65 // Set up a request counter for the path. | 68 // Set up a request counter for a path. The url used will be derived from |
69 // |path|, which also provides that data served. | |
66 void CountRequestFor(const std::string& path, RequestCounter* counter) { | 70 void CountRequestFor(const std::string& path, RequestCounter* counter) { |
67 GURL::Replacements replacement; | 71 GURL::Replacements replacement; |
68 replacement.SetPathStr(path); | 72 replacement.SetPathStr(path); |
69 const GURL url = src_server()->base_url().ReplaceComponents(replacement); | 73 const GURL url = src_server()->base_url().ReplaceComponents(replacement); |
74 CountRequestForUrl(url, path, counter); | |
75 } | |
76 | |
77 // Set up a request counter for a specific URL, serving data from |path|. | |
78 void CountRequestForUrl(const GURL& url, | |
79 const std::string& path, | |
80 RequestCounter* counter) { | |
70 base::FilePath url_file = | 81 base::FilePath url_file = |
71 ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path)); | 82 ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path)); |
72 content::BrowserThread::PostTask( | 83 content::BrowserThread::PostTask( |
73 content::BrowserThread::IO, FROM_HERE, | 84 content::BrowserThread::IO, FROM_HERE, |
74 base::Bind(&CreateCountingInterceptorOnIO, url, url_file, | 85 base::Bind(&CreateCountingInterceptorOnIO, url, url_file, |
75 counter->AsWeakPtr())); | 86 counter->AsWeakPtr())); |
76 } | 87 } |
77 | 88 |
78 // Fetches a boolean value from javascript. Returns whether the fetch | 89 // Fetches a boolean value from javascript. Returns whether the fetch |
79 // succeeded; the value of the variable is returned in value. If | 90 // succeeded; the value of the variable is returned in value. If |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
246 GURL cross_domain_url(base::StringPrintf( | 257 GURL cross_domain_url(base::StringPrintf( |
247 "http://%s:%d/%s", secondary_domain.c_str(), | 258 "http://%s:%d/%s", secondary_domain.c_str(), |
248 embedded_test_server()->host_port_pair().port(), kPrefetchPage)); | 259 embedded_test_server()->host_port_pair().port(), kPrefetchPage)); |
249 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); | 260 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); |
250 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1); | 261 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1); |
251 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | 262 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); |
252 histogram_tester().ExpectTotalCount( | 263 histogram_tester().ExpectTotalCount( |
253 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); | 264 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); |
254 } | 265 } |
255 | 266 |
267 // Check that response header CSP is handled correctly. | |
pasko
2016/10/05 14:09:55
Preferable: s/is handled correctly/prevents fetchi
mattcary
2016/10/12 15:09:10
Done.
| |
268 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) { | |
269 static const std::string secondary_domain = "foo.bar"; | |
270 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); | |
271 RequestCounter main_page; | |
272 CountRequestFor(kPrefetchResponseHeaderCSP, &main_page); | |
273 RequestCounter first_script; | |
274 CountRequestFor(kPrefetchScript, &first_script); | |
275 RequestCounter second_script; | |
276 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); | |
277 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); | |
278 PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1); | |
279 // The second script is in the correct domain for CSP, but the first script is | |
280 // not. | |
281 main_page.WaitForCount(1); | |
282 second_script.WaitForCount(1); | |
283 first_script.WaitForCount(0); | |
284 } | |
285 | |
286 // Check CSP in the meta tag cancels the prefetch. | |
287 | |
288 // TODO(mattcary): probably this behavior should be consistent with | |
289 // response-header CSP. See crbug/XXX. | |
290 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) { | |
291 static const std::string secondary_domain = "foo.bar"; | |
292 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); | |
293 RequestCounter main_page; | |
294 CountRequestFor(kPrefetchMetaCSP, &main_page); | |
295 RequestCounter first_script; | |
296 CountRequestFor(kPrefetchScript, &first_script); | |
297 RequestCounter second_script; | |
298 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); | |
299 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); | |
300 PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1); | |
301 // TODO(mattcary): See test comment above. If the meta CSP tag were parsed, | |
302 // |second_script| would be loaded. Instead as the background scanner bails as | |
303 // soon as the meta CSP tag is seen, only |main_page| is fetched. | |
304 main_page.WaitForCount(1); | |
305 second_script.WaitForCount(0); | |
306 first_script.WaitForCount(0); | |
307 } | |
308 | |
256 // Check that we support simultaneous prefetch. | 309 // Check that we support simultaneous prefetch. |
257 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { | 310 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { |
258 RequestCounter first_main_counter; | 311 RequestCounter first_main_counter; |
259 CountRequestFor(kPrefetchPage, &first_main_counter); | 312 CountRequestFor(kPrefetchPage, &first_main_counter); |
260 RequestCounter second_main_counter; | 313 RequestCounter second_main_counter; |
261 CountRequestFor(kPrefetchPage2, &second_main_counter); | 314 CountRequestFor(kPrefetchPage2, &second_main_counter); |
262 RequestCounter first_script_counter; | 315 RequestCounter first_script_counter; |
263 CountRequestFor(kPrefetchScript, &first_script_counter); | 316 CountRequestFor(kPrefetchScript, &first_script_counter); |
264 RequestCounter second_script_counter; | 317 RequestCounter second_script_counter; |
265 CountRequestFor(kPrefetchScript2, &second_script_counter); | 318 CountRequestFor(kPrefetchScript2, &second_script_counter); |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
458 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); | 511 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
459 // Prefetch resource are blocked, but the prerender is not killed in any | 512 // Prefetch resource are blocked, but the prerender is not killed in any |
460 // special way. | 513 // special way. |
461 // TODO(mattcary): do we care about detecting if the main resource is fetched | 514 // TODO(mattcary): do we care about detecting if the main resource is fetched |
462 // and preload scanning has started? | 515 // and preload scanning has started? |
463 std::unique_ptr<TestPrerender> prerender = | 516 std::unique_ptr<TestPrerender> prerender = |
464 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 0); | 517 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 0); |
465 } | 518 } |
466 | 519 |
467 } // namespace prerender | 520 } // namespace prerender |
OLD | NEW |