Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: chrome/browser/prerender/prerender_nostate_prefetch_test.cc

Issue 2350813003: NoState Prefetch: CSP test (Closed)
Patch Set: comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/test/data/prerender/prefetch_meta_csp.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | chrome/test/data/prerender/prefetch_meta_csp.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698