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

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

Issue 2350813003: NoState Prefetch: CSP test (Closed)
Patch Set: response headers Created 4 years, 3 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/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 18 matching lines...) Expand all
29 using prerender::test_utils::RequestCounter; 29 using prerender::test_utils::RequestCounter;
30 using prerender::test_utils::TestPrerender; 30 using prerender::test_utils::TestPrerender;
31 using prerender::test_utils::TestPrerenderContents; 31 using prerender::test_utils::TestPrerenderContents;
32 using task_manager::browsertest_util::WaitForTaskManagerRows; 32 using task_manager::browsertest_util::WaitForTaskManagerRows;
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 kPrefetchMetaCSP[] = "prerender/prerender_prefetch_meta_csp.html";
40 const char kPrefetchResponseHeaderCSP[] =
41 "prerender/prerender_prefetch_response_csp.html";
42 const char kPrefetchImagePage[] = "prerender/prerender_prefetch_image.html";
43 const char kPrefetchJpeg[] = "prerender/image.jpeg";
39 const char kPrefetchLoaderPath[] = "/prerender/prerender_prefetch_loader.html"; 44 const char kPrefetchLoaderPath[] = "/prerender/prerender_prefetch_loader.html";
45 const char kPrefetchLoopPage[] = "prerender/prerender_prefetch_loop.html";
40 const char kPrefetchPage[] = "prerender/prerender_prefetch_page.html"; 46 const char kPrefetchPage[] = "prerender/prerender_prefetch_page.html";
47 const char kPrefetchPage2[] = "prerender/prerender_prefetch_page2.html";
48 const char kPrefetchPng[] = "prerender/image.png";
41 const char kPrefetchScript[] = "prerender/prerender_prefetch.js"; 49 const char kPrefetchScript[] = "prerender/prerender_prefetch.js";
42 const char kPrefetchPage2[] = "prerender/prerender_prefetch_page2.html";
43 const char kPrefetchScript2[] = "prerender/prerender_prefetch2.js"; 50 const char kPrefetchScript2[] = "prerender/prerender_prefetch2.js";
44 const char kPrefetchImagePage[] = "prerender/prerender_prefetch_image.html";
45 const char kPrefetchLoopPage[] = "prerender/prerender_prefetch_loop.html";
46
47 const char kPrefetchJpeg[] = "prerender/image.jpeg";
48 const char kPrefetchPng[] = "prerender/image.png";
49 51
50 const char kPageBool[] = "pageBool"; 52 const char kPageBool[] = "pageBool";
51 const char kScriptBool[] = "scriptBool"; 53 const char kScriptBool[] = "scriptBool";
52 54
53 class NoStatePrefetchBrowserTest 55 class NoStatePrefetchBrowserTest
54 : public test_utils::PrerenderInProcessBrowserTest { 56 : public test_utils::PrerenderInProcessBrowserTest {
55 public: 57 public:
56 NoStatePrefetchBrowserTest() {} 58 NoStatePrefetchBrowserTest() {}
57 59
58 void SetUpCommandLine(base::CommandLine* command_line) override { 60 void SetUpCommandLine(base::CommandLine* command_line) override {
59 PrerenderInProcessBrowserTest::SetUpCommandLine(command_line); 61 PrerenderInProcessBrowserTest::SetUpCommandLine(command_line);
60 command_line->AppendSwitchASCII( 62 command_line->AppendSwitchASCII(
61 switches::kPrerenderMode, switches::kPrerenderModeSwitchValuePrefetch); 63 switches::kPrerenderMode, switches::kPrerenderModeSwitchValuePrefetch);
62 } 64 }
63 65
64 // Set up a request counter for the path. 66 // Set up a request counter for the path.
65 void CountRequestFor(const std::string& path, RequestCounter* counter) { 67 void CountRequestFor(const std::string& path, RequestCounter* counter) {
66 GURL::Replacements replacement; 68 GURL::Replacements replacement;
67 replacement.SetPathStr(path); 69 replacement.SetPathStr(path);
68 const GURL url = src_server()->base_url().ReplaceComponents(replacement); 70 const GURL url = src_server()->base_url().ReplaceComponents(replacement);
69 base::FilePath url_file = 71 base::FilePath url_file =
70 ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path)); 72 ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path));
71 content::BrowserThread::PostTask( 73 content::BrowserThread::PostTask(
72 content::BrowserThread::IO, FROM_HERE, 74 content::BrowserThread::IO, FROM_HERE,
73 base::Bind(&CreateCountingInterceptorOnIO, url, url_file, 75 base::Bind(&CreateCountingInterceptorOnIO, url, url_file,
74 counter->AsWeakPtr())); 76 counter->AsWeakPtr()));
75 } 77 }
76 78
79 // Set up a request counter for a specific URL, serving data from path.
80 void CountRequestFor(const GURL& url,
81 const std::string& path,
82 RequestCounter* counter) {
83 base::FilePath url_file =
84 ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path));
85 content::BrowserThread::PostTask(
86 content::BrowserThread::IO, FROM_HERE,
87 base::Bind(&CreateCountingInterceptorOnIO, url, url_file,
88 counter->AsWeakPtr()));
89 }
90
77 // Fetches a boolean value from javascript. Returns whether the fetch 91 // Fetches a boolean value from javascript. Returns whether the fetch
78 // succeeded; the value of the variable is returned in value. If 92 // succeeded; the value of the variable is returned in value. If
79 // javascript_variable does not exist, this returns false and value is 93 // javascript_variable does not exist, this returns false and value is
80 // unchanged. The function checks that script execution works. 94 // unchanged. The function checks that script execution works.
81 bool GetJavascriptBoolean(const std::string& javascript_variable, 95 bool GetJavascriptBoolean(const std::string& javascript_variable,
82 content::WebContents* web_contents, 96 content::WebContents* web_contents,
83 bool* value) { 97 bool* value) {
84 // In order to detect unknown variables we need a three-valued return. 98 // In order to detect unknown variables we need a three-valued return.
85 int result; 99 int result;
86 EXPECT_TRUE(content::ExecuteScriptAndExtractInt( 100 EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 GURL cross_domain_url(base::StringPrintf( 224 GURL cross_domain_url(base::StringPrintf(
211 "http://%s:%d/%s", secondary_domain.c_str(), 225 "http://%s:%d/%s", secondary_domain.c_str(),
212 embedded_test_server()->host_port_pair().port(), kPrefetchPage)); 226 embedded_test_server()->host_port_pair().port(), kPrefetchPage));
213 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); 227 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1);
214 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1); 228 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1);
215 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 229 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
216 histogram_tester().ExpectTotalCount( 230 histogram_tester().ExpectTotalCount(
217 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); 231 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
218 } 232 }
219 233
234 // Check that response header CSP is handled correctly.
235 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) {
236 static const std::string secondary_domain = "foo.bar";
237 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
238 RequestCounter main_page;
239 CountRequestFor(kPrefetchResponseHeaderCSP, &main_page);
240 RequestCounter first_script;
241 CountRequestFor(kPrefetchScript, &first_script);
242 RequestCounter second_script;
243 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2);
244 CountRequestFor(second_script_url, kPrefetchScript2, &second_script);
245 PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1);
246 // 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.
247 // not.
248 main_page.WaitForCount(1);
249 second_script.WaitForCount(1);
250 first_script.WaitForCount(0);
251 }
252
253 // Check CSP in the meta tag cancels the prefetch.
254 // TODO(mattcary): probably we don't want to cancel this so we're consistent
255 // with response-header CSP. But it seems to be difficult, and probably meta tag
256 // CSP is not as common, so it may not be worth the complexity.
257 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) {
258 static const std::string secondary_domain = "foo.bar";
259 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
260 RequestCounter main_page;
261 CountRequestFor(kPrefetchMetaCSP, &main_page);
262 RequestCounter first_script;
263 CountRequestFor(kPrefetchScript, &first_script);
264 RequestCounter second_script;
265 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2);
266 CountRequestFor(second_script_url, kPrefetchScript2, &second_script);
267 PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1);
268 // Probably we should be loading the second script. But currently we bail on
269 // the preload scanner if we see the CSP meta tag
270 main_page.WaitForCount(1);
271 second_script.WaitForCount(0);
272 first_script.WaitForCount(0);
273 }
274
220 // Check that we support simultaneous prefetch. 275 // Check that we support simultaneous prefetch.
221 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { 276 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
222 RequestCounter first_main_counter; 277 RequestCounter first_main_counter;
223 CountRequestFor(kPrefetchPage, &first_main_counter); 278 CountRequestFor(kPrefetchPage, &first_main_counter);
224 RequestCounter second_main_counter; 279 RequestCounter second_main_counter;
225 CountRequestFor(kPrefetchPage2, &second_main_counter); 280 CountRequestFor(kPrefetchPage2, &second_main_counter);
226 RequestCounter first_script_counter; 281 RequestCounter first_script_counter;
227 CountRequestFor(kPrefetchScript, &first_script_counter); 282 CountRequestFor(kPrefetchScript, &first_script_counter);
228 RequestCounter second_script_counter; 283 RequestCounter second_script_counter;
229 CountRequestFor(kPrefetchScript2, &second_script_counter); 284 CountRequestFor(kPrefetchScript2, &second_script_counter);
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); 464 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
410 // Prefetch resource are blocked, but the prerender is not killed in any 465 // Prefetch resource are blocked, but the prerender is not killed in any
411 // special way. 466 // special way.
412 // TODO(mattcary): do we care about detecting if the main resource is fetched 467 // TODO(mattcary): do we care about detecting if the main resource is fetched
413 // and preload scanning has started? 468 // and preload scanning has started?
414 std::unique_ptr<TestPrerender> prerender = 469 std::unique_ptr<TestPrerender> prerender =
415 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 0); 470 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 0);
416 } 471 }
417 472
418 } // namespace prerender 473 } // namespace prerender
OLDNEW
« no previous file with comments | « no previous file | chrome/test/data/prerender/prerender_prefetch_meta_csp.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698