Chromium Code Reviews| 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 |