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 18 matching lines...) Expand all Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |