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 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 |