| 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/string16.h" | 6 #include "base/strings/string16.h" |
| 7 #include "base/strings/string_split.h" | 7 #include "base/strings/string_split.h" |
| 8 #include "base/task_scheduler/post_task.h" | 8 #include "base/task_scheduler/post_task.h" |
| 9 #include "chrome/browser/prerender/prerender_handle.h" | |
| 10 #include "chrome/browser/prerender/prerender_manager.h" | 9 #include "chrome/browser/prerender/prerender_manager.h" |
| 11 #include "chrome/browser/prerender/prerender_manager_factory.h" | 10 #include "chrome/browser/prerender/prerender_manager_factory.h" |
| 12 #include "chrome/browser/prerender/prerender_test_utils.h" | 11 #include "chrome/browser/prerender/prerender_test_utils.h" |
| 13 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
| 14 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" | 13 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" |
| 15 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
| 16 #include "chrome/browser/ui/browser_commands.h" | 15 #include "chrome/browser/ui/browser_commands.h" |
| 17 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 16 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 18 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
| 19 #include "chrome/grit/generated_resources.h" | 18 #include "chrome/grit/generated_resources.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 30 using prerender::test_utils::CreateCountingInterceptorOnIO; | 29 using prerender::test_utils::CreateCountingInterceptorOnIO; |
| 31 using prerender::test_utils::DestructionWaiter; | 30 using prerender::test_utils::DestructionWaiter; |
| 32 using prerender::test_utils::RequestCounter; | 31 using prerender::test_utils::RequestCounter; |
| 33 using prerender::test_utils::TestPrerender; | 32 using prerender::test_utils::TestPrerender; |
| 34 using prerender::test_utils::TestPrerenderContents; | 33 using prerender::test_utils::TestPrerenderContents; |
| 35 using task_manager::browsertest_util::WaitForTaskManagerRows; | 34 using task_manager::browsertest_util::WaitForTaskManagerRows; |
| 36 | 35 |
| 37 namespace prerender { | 36 namespace prerender { |
| 38 | 37 |
| 39 // These URLs used for test resources must be relative with the exception of | 38 // These URLs used for test resources must be relative with the exception of |
| 40 // |kPrefetchLoaderPath|. | 39 // |PrefetchLoaderPath|, which is only used in |PrerenderTestURLImpl()|. |
| 41 const char kPrefetchImagePage[] = "prerender/prefetch_image.html"; | 40 const char kPrefetchImagePage[] = "prerender/prefetch_image.html"; |
| 42 const char kPrefetchJpeg[] = "prerender/image.jpeg"; | 41 const char kPrefetchJpeg[] = "prerender/image.jpeg"; |
| 43 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; | 42 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; |
| 44 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; | 43 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; |
| 45 const char kPrefetchMetaCSP[] = "prerender/prefetch_meta_csp.html"; | 44 const char kPrefetchMetaCSP[] = "prerender/prefetch_meta_csp.html"; |
| 46 const char kPrefetchPage[] = "prerender/prefetch_page.html"; | 45 const char kPrefetchPage[] = "prerender/prefetch_page.html"; |
| 47 const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; | 46 const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; |
| 48 const char kPrefetchPng[] = "prerender/image.png"; | 47 const char kPrefetchPng[] = "prerender/image.png"; |
| 49 const char kPrefetchResponseHeaderCSP[] = | 48 const char kPrefetchResponseHeaderCSP[] = |
| 50 "prerender/prefetch_response_csp.html"; | 49 "prerender/prefetch_response_csp.html"; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 base::FilePath url_file = ui_test_utils::GetTestFilePath( | 122 base::FilePath url_file = ui_test_utils::GetTestFilePath( |
| 124 base::FilePath(), base::FilePath::FromUTF8Unsafe(path_str)); | 123 base::FilePath(), base::FilePath::FromUTF8Unsafe(path_str)); |
| 125 content::BrowserThread::PostTask( | 124 content::BrowserThread::PostTask( |
| 126 content::BrowserThread::IO, FROM_HERE, | 125 content::BrowserThread::IO, FROM_HERE, |
| 127 base::Bind(&CreateCountingInterceptorOnIO, url, url_file, | 126 base::Bind(&CreateCountingInterceptorOnIO, url, url_file, |
| 128 counter->AsWeakPtr())); | 127 counter->AsWeakPtr())); |
| 129 } | 128 } |
| 130 | 129 |
| 131 BrowserTestTime* GetTimeOverride() const { return browser_test_time_; } | 130 BrowserTestTime* GetTimeOverride() const { return browser_test_time_; } |
| 132 | 131 |
| 133 protected: | 132 private: |
| 134 std::unique_ptr<TestPrerender> PrefetchFromURL( | 133 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl( |
| 135 const GURL& target_url, | 134 const GURL& prerender_url, |
| 136 FinalStatus expected_final_status) { | 135 const std::vector<FinalStatus>& expected_final_status_queue, |
| 137 GURL loader_url = ServeLoaderURL( | 136 int expected_number_of_loads) override { |
| 138 kPrefetchLoaderPath, "REPLACE_WITH_PREFETCH_URL", target_url, ""); | 137 base::StringPairs replacement_text; |
| 139 std::vector<FinalStatus> expected_final_status_queue(1, | 138 replacement_text.push_back( |
| 140 expected_final_status); | 139 make_pair("REPLACE_WITH_PREFETCH_URL", prerender_url.spec())); |
| 140 std::string replacement_path; |
| 141 net::test_server::GetFilePathWithReplacements( |
| 142 kPrefetchLoaderPath, replacement_text, &replacement_path); |
| 143 GURL loader_url = src_server()->GetURL(replacement_path); |
| 144 |
| 141 std::vector<std::unique_ptr<TestPrerender>> prerenders = | 145 std::vector<std::unique_ptr<TestPrerender>> prerenders = |
| 142 NavigateWithPrerenders(loader_url, expected_final_status_queue); | 146 NavigateWithPrerenders(loader_url, expected_final_status_queue, |
| 143 prerenders[0]->WaitForStop(); | 147 expected_number_of_loads); |
| 144 return std::move(prerenders[0]); | 148 |
| 149 TestPrerenderContents* prerender_contents = prerenders[0]->contents(); |
| 150 if (expected_number_of_loads > 0) { |
| 151 CHECK(prerender_contents); |
| 152 // Checks that the prerender contents final status is unchanged from its |
| 153 // default value, meaning that the contents has not been destroyed. |
| 154 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); |
| 155 } |
| 156 EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads()); |
| 157 |
| 158 return prerenders; |
| 145 } | 159 } |
| 146 | 160 |
| 147 std::unique_ptr<TestPrerender> PrefetchFromFile( | |
| 148 const std::string& html_file, | |
| 149 FinalStatus expected_final_status) { | |
| 150 return PrefetchFromURL(src_server()->GetURL(MakeAbsolute(html_file)), | |
| 151 expected_final_status); | |
| 152 } | |
| 153 | |
| 154 private: | |
| 155 BrowserTestTime* browser_test_time_; | 161 BrowserTestTime* browser_test_time_; |
| 156 | |
| 157 DISALLOW_COPY_AND_ASSIGN(NoStatePrefetchBrowserTest); | |
| 158 }; | 162 }; |
| 159 | 163 |
| 160 // Checks that a page is correctly prefetched in the case of a | 164 // Checks that a page is correctly prefetched in the case of a |
| 161 // <link rel=prerender> tag and the JavaScript on the page is not executed. | 165 // <link rel=prerender> tag and the JavaScript on the page is not executed. |
| 162 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) { | 166 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) { |
| 163 RequestCounter main_counter; | 167 RequestCounter main_counter; |
| 164 CountRequestFor(kPrefetchPage, &main_counter); | 168 CountRequestFor(kPrefetchPage, &main_counter); |
| 165 RequestCounter script_counter; | 169 RequestCounter script_counter; |
| 166 CountRequestFor(kPrefetchScript, &script_counter); | 170 CountRequestFor(kPrefetchScript, &script_counter); |
| 167 RequestCounter script2_counter; | 171 RequestCounter script2_counter; |
| 168 CountRequestFor(kPrefetchScript2, &script2_counter); | 172 CountRequestFor(kPrefetchScript2, &script2_counter); |
| 169 | 173 |
| 170 std::unique_ptr<TestPrerender> test_prerender = | 174 std::unique_ptr<TestPrerender> test_prerender = |
| 171 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 175 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); |
| 172 main_counter.WaitForCount(1); | 176 main_counter.WaitForCount(1); |
| 173 script_counter.WaitForCount(1); | 177 script_counter.WaitForCount(1); |
| 174 script2_counter.WaitForCount(0); | 178 script2_counter.WaitForCount(0); |
| 175 | |
| 176 // Verify that the page load did not happen. | |
| 177 test_prerender->WaitForLoads(0); | |
| 178 } | 179 } |
| 179 | 180 |
| 180 // Checks the prefetch of an img tag. | 181 // Checks the prefetch of an img tag. |
| 181 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) { | 182 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) { |
| 182 RequestCounter image_counter; | 183 RequestCounter image_counter; |
| 183 CountRequestFor(kPrefetchJpeg, &image_counter); | 184 CountRequestFor(kPrefetchJpeg, &image_counter); |
| 184 base::StringPairs replacement_text; | 185 base::StringPairs replacement_text; |
| 185 replacement_text.push_back( | 186 replacement_text.push_back( |
| 186 std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg))); | 187 std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg))); |
| 187 std::string main_page_path; | 188 std::string main_page_path; |
| 188 net::test_server::GetFilePathWithReplacements( | 189 net::test_server::GetFilePathWithReplacements( |
| 189 kPrefetchImagePage, replacement_text, &main_page_path); | 190 kPrefetchImagePage, replacement_text, &main_page_path); |
| 190 // Note CountRequestFor cannot be used on the main page as the test server | 191 // Note CountRequestFor cannot be used on the main page as the test server |
| 191 // must handling the image url replacement. | 192 // must handling the image url replacement. |
| 192 PrefetchFromFile(main_page_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 193 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1); |
| 193 image_counter.WaitForCount(1); | 194 image_counter.WaitForCount(1); |
| 194 } | 195 } |
| 195 | 196 |
| 196 // Checks that a cross-domain prefetching works correctly. | 197 // Checks that a cross-domain prefetching works correctly. |
| 197 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) { | 198 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) { |
| 198 static const std::string secondary_domain = "www.foo.com"; | 199 static const std::string secondary_domain = "www.foo.com"; |
| 199 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); | 200 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); |
| 200 GURL cross_domain_url(base::StringPrintf( | 201 GURL cross_domain_url(base::StringPrintf( |
| 201 "http://%s:%d/%s", secondary_domain.c_str(), | 202 "http://%s:%d/%s", secondary_domain.c_str(), |
| 202 embedded_test_server()->host_port_pair().port(), kPrefetchPage)); | 203 embedded_test_server()->host_port_pair().port(), kPrefetchPage)); |
| 203 RequestCounter cross_domain_counter; | 204 RequestCounter cross_domain_counter; |
| 204 CountRequestForUrl(cross_domain_url, kPrefetchPage, &cross_domain_counter); | 205 CountRequestForUrl(cross_domain_url, kPrefetchPage, &cross_domain_counter); |
| 205 PrefetchFromURL(cross_domain_url, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 206 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); |
| 206 cross_domain_counter.WaitForCount(1); | 207 cross_domain_counter.WaitForCount(1); |
| 207 } | 208 } |
| 208 | 209 |
| 209 // Checks that response header CSP is respected. | 210 // Checks that response header CSP is respected. |
| 210 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) { | 211 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) { |
| 211 static const std::string secondary_domain = "foo.bar"; | 212 static const std::string secondary_domain = "foo.bar"; |
| 212 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); | 213 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); |
| 213 RequestCounter main_page; | 214 RequestCounter main_page; |
| 214 CountRequestFor(kPrefetchResponseHeaderCSP, &main_page); | 215 CountRequestFor(kPrefetchResponseHeaderCSP, &main_page); |
| 215 RequestCounter first_script; | 216 RequestCounter first_script; |
| 216 CountRequestFor(kPrefetchScript, &first_script); | 217 CountRequestFor(kPrefetchScript, &first_script); |
| 217 RequestCounter second_script; | 218 RequestCounter second_script; |
| 218 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); | 219 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); |
| 219 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); | 220 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); |
| 220 PrefetchFromFile(kPrefetchResponseHeaderCSP, | 221 PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1); |
| 221 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | |
| 222 // The second script is in the correct domain for CSP, but the first script is | 222 // The second script is in the correct domain for CSP, but the first script is |
| 223 // not. | 223 // not. |
| 224 main_page.WaitForCount(1); | 224 main_page.WaitForCount(1); |
| 225 second_script.WaitForCount(1); | 225 second_script.WaitForCount(1); |
| 226 // TODO(pasko): wait for prefetch to be finished before checking the counts. |
| 226 first_script.WaitForCount(0); | 227 first_script.WaitForCount(0); |
| 227 } | 228 } |
| 228 | 229 |
| 229 // Checks that CSP in the meta tag cancels the prefetch. | 230 // Checks that CSP in the meta tag cancels the prefetch. |
| 230 // TODO(mattcary): probably this behavior should be consistent with | 231 // TODO(mattcary): probably this behavior should be consistent with |
| 231 // response-header CSP. See crbug/656581. | 232 // response-header CSP. See crbug/656581. |
| 232 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) { | 233 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) { |
| 233 static const std::string secondary_domain = "foo.bar"; | 234 static const std::string secondary_domain = "foo.bar"; |
| 234 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); | 235 host_resolver()->AddRule(secondary_domain, "127.0.0.1"); |
| 235 RequestCounter main_page; | 236 RequestCounter main_page; |
| 236 CountRequestFor(kPrefetchMetaCSP, &main_page); | 237 CountRequestFor(kPrefetchMetaCSP, &main_page); |
| 237 RequestCounter first_script; | 238 RequestCounter first_script; |
| 238 CountRequestFor(kPrefetchScript, &first_script); | 239 CountRequestFor(kPrefetchScript, &first_script); |
| 239 RequestCounter second_script; | 240 RequestCounter second_script; |
| 240 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); | 241 GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2); |
| 241 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); | 242 CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script); |
| 242 PrefetchFromFile(kPrefetchMetaCSP, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 243 PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1); |
| 243 // TODO(mattcary): See test comment above. If the meta CSP tag were parsed, | 244 // TODO(mattcary): See test comment above. If the meta CSP tag were parsed, |
| 244 // |second_script| would be loaded. Instead as the background scanner bails as | 245 // |second_script| would be loaded. Instead as the background scanner bails as |
| 245 // soon as the meta CSP tag is seen, only |main_page| is fetched. | 246 // soon as the meta CSP tag is seen, only |main_page| is fetched. |
| 246 main_page.WaitForCount(1); | 247 main_page.WaitForCount(1); |
| 248 // TODO(pasko): wait for prefetch to be finished before checking the counts. |
| 247 second_script.WaitForCount(0); | 249 second_script.WaitForCount(0); |
| 248 first_script.WaitForCount(0); | 250 first_script.WaitForCount(0); |
| 249 } | 251 } |
| 250 | 252 |
| 251 // Checks that the second prefetch request succeeds. TODO(pasko): This test | 253 // Checks simultaneous prefetch. |
| 252 // waits for Prerender Stop before starting the second request, add a test that | |
| 253 // starts the second request from the UI thread immediately without waiting. | |
| 254 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { | 254 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { |
| 255 RequestCounter first_main_counter; | 255 RequestCounter first_main_counter; |
| 256 CountRequestFor(kPrefetchPage, &first_main_counter); | 256 CountRequestFor(kPrefetchPage, &first_main_counter); |
| 257 RequestCounter second_main_counter; | 257 RequestCounter second_main_counter; |
| 258 CountRequestFor(kPrefetchPage2, &second_main_counter); | 258 CountRequestFor(kPrefetchPage2, &second_main_counter); |
| 259 RequestCounter first_script_counter; | 259 RequestCounter first_script_counter; |
| 260 CountRequestFor(kPrefetchScript, &first_script_counter); | 260 CountRequestFor(kPrefetchScript, &first_script_counter); |
| 261 RequestCounter second_script_counter; | 261 RequestCounter second_script_counter; |
| 262 CountRequestFor(kPrefetchScript2, &second_script_counter); | 262 CountRequestFor(kPrefetchScript2, &second_script_counter); |
| 263 | 263 |
| 264 // The first prerender is marked as canceled. When the second prerender | 264 // The first prerender is marked as canceled. When the second prerender |
| 265 // starts, it sees that the first has been abandoned (because the earlier | 265 // starts, it sees that the first has been abandoned (because the earlier |
| 266 // prerender is detached immediately and so dies quickly). | 266 // prerender is detached immediately and so dies quickly). |
| 267 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 267 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_CANCELLED, 1); |
| 268 PrefetchFromFile(kPrefetchPage2, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 268 PrerenderTestURL(kPrefetchPage2, FINAL_STATUS_APP_TERMINATING, 1); |
| 269 first_main_counter.WaitForCount(1); | 269 first_main_counter.WaitForCount(1); |
| 270 second_main_counter.WaitForCount(1); | 270 second_main_counter.WaitForCount(1); |
| 271 first_script_counter.WaitForCount(1); | 271 first_script_counter.WaitForCount(1); |
| 272 second_script_counter.WaitForCount(1); | 272 second_script_counter.WaitForCount(1); |
| 273 } | 273 } |
| 274 | 274 |
| 275 // Checks a prefetch to a nonexisting page. | 275 // Checks a prefetch to a nonexisting page. |
| 276 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchNonexisting) { | 276 // TODO(mattcary): disabled as prefetch process teardown is racey with prerender |
| 277 std::unique_ptr<TestPrerender> test_prerender = PrefetchFromFile( | 277 // contents destruction, can fix when prefetch prerenderers are destroyed |
| 278 "nonexisting-page.html", FINAL_STATUS_UNSUPPORTED_SCHEME); | 278 // deterministically. |
| 279 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, |
| 280 DISABLED_PrefetchNonexisting) { |
| 281 PrerenderTestURL("nonexisting-page.html", FINAL_STATUS_APP_TERMINATING, 0); |
| 282 // TODO(mattcary): we fire up a prerenderer before we discover that the main |
| 283 // page doesn't exist, we still count this as a prerender. Also we don't fail |
| 284 // the renderer (presumably because we've detached the resource, etc). Is this |
| 285 // what we want? At any rate, we can't positively check any of that now due to |
| 286 // histogram race conditions, and only test that we don't crash on a |
| 287 // nonexisting page. |
| 279 } | 288 } |
| 280 | 289 |
| 281 // Checks that a 301 redirect is followed. | 290 // Checks that a 301 redirect is followed. |
| 282 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) { | 291 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) { |
| 283 RequestCounter script_counter; | 292 RequestCounter script_counter; |
| 284 CountRequestFor(kPrefetchScript, &script_counter); | 293 CountRequestFor(kPrefetchScript, &script_counter); |
| 285 PrefetchFromFile( | 294 PrerenderTestURL( |
| 286 "/server-redirect/?" + | 295 "/server-redirect/?" + |
| 287 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), | 296 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), |
| 288 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 297 FINAL_STATUS_APP_TERMINATING, 1); |
| 289 script_counter.WaitForCount(1); | 298 script_counter.WaitForCount(1); |
| 290 } | 299 } |
| 291 | 300 |
| 292 // Checks that a subresource 301 redirect is followed. | 301 // Checks that a subresource 301 redirect is followed. |
| 293 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) { | 302 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) { |
| 294 RequestCounter script_counter; | 303 RequestCounter script_counter; |
| 295 CountRequestFor(kPrefetchScript, &script_counter); | 304 CountRequestFor(kPrefetchScript, &script_counter); |
| 296 PrefetchFromFile(kPrefetchSubresourceRedirectPage, | 305 PrerenderTestURL(kPrefetchSubresourceRedirectPage, |
| 297 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 306 FINAL_STATUS_APP_TERMINATING, 1); |
| 298 script_counter.WaitForCount(1); | 307 script_counter.WaitForCount(1); |
| 299 } | 308 } |
| 300 | 309 |
| 301 // Checks a client redirect is not followed. | 310 // Checks a client redirect is not followed. |
| 302 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) { | 311 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) { |
| 303 RequestCounter script_counter; | 312 RequestCounter script_counter; |
| 304 CountRequestFor(kPrefetchScript, &script_counter); | 313 CountRequestFor(kPrefetchScript, &script_counter); |
| 305 // A complete load of kPrefetchPage2 is used as a sentinal. Otherwise the test | 314 // A complete load of kPrefetchPage2 is used as a sentinal. Otherwise the test |
| 306 // ends before script_counter would reliably see the load of kPrefetchScript, | 315 // ends before script_counter would reliably see the load of kPrefetchScript, |
| 307 // were it to happen. | 316 // were it to happen. |
| 308 RequestCounter sentinel_counter; | 317 RequestCounter sentinel_counter; |
| 309 CountRequestFor(kPrefetchScript2, &sentinel_counter); | 318 CountRequestFor(kPrefetchScript2, &sentinel_counter); |
| 310 PrefetchFromFile( | 319 PrerenderTestURL( |
| 311 "/client-redirect/?" + | 320 "/client-redirect/?" + |
| 312 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), | 321 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), |
| 313 FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 322 FINAL_STATUS_APP_TERMINATING, 1); |
| 314 ui_test_utils::NavigateToURL( | 323 ui_test_utils::NavigateToURL( |
| 315 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2))); | 324 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2))); |
| 316 sentinel_counter.WaitForCount(1); | 325 sentinel_counter.WaitForCount(1); |
| 317 script_counter.WaitForCount(0); | 326 script_counter.WaitForCount(0); |
| 318 } | 327 } |
| 319 | 328 |
| 320 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) { | 329 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) { |
| 321 UseHttpsSrcServer(); | 330 UseHttpsSrcServer(); |
| 322 RequestCounter main_counter; | 331 RequestCounter main_counter; |
| 323 CountRequestFor(kPrefetchPage, &main_counter); | 332 CountRequestFor(kPrefetchPage, &main_counter); |
| 324 RequestCounter script_counter; | 333 RequestCounter script_counter; |
| 325 CountRequestFor(kPrefetchScript, &script_counter); | 334 CountRequestFor(kPrefetchScript, &script_counter); |
| 326 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 335 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); |
| 327 main_counter.WaitForCount(1); | 336 main_counter.WaitForCount(1); |
| 328 script_counter.WaitForCount(1); | 337 script_counter.WaitForCount(1); |
| 329 } | 338 } |
| 330 | 339 |
| 331 // Checks that an SSL error prevents prefetch. | 340 // Checks that an SSL error prevents prefetch. |
| 332 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) { | 341 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) { |
| 333 // Only send the loaded page, not the loader, through SSL. | 342 // Only send the loaded page, not the loader, through SSL. |
| 334 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 343 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
| 335 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); | 344 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
| 336 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); | 345 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
| 337 ASSERT_TRUE(https_server.Start()); | 346 ASSERT_TRUE(https_server.Start()); |
| 338 std::unique_ptr<TestPrerender> prerender = PrefetchFromURL( | 347 std::unique_ptr<TestPrerender> prerender = |
| 339 https_server.GetURL(MakeAbsolute(kPrefetchPage)), FINAL_STATUS_SSL_ERROR); | 348 PrerenderTestURL(https_server.GetURL(MakeAbsolute(kPrefetchPage)), |
| 349 FINAL_STATUS_SSL_ERROR, 0); |
| 340 DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR); | 350 DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR); |
| 341 EXPECT_TRUE(waiter.WaitForDestroy()); | 351 EXPECT_TRUE(waiter.WaitForDestroy()); |
| 342 } | 352 } |
| 343 | 353 |
| 344 // Checks that a subresource failing SSL does not prevent prefetch on the rest | 354 // Checks that a subresource failing SSL does not prevent prefetch on the rest |
| 345 // of the page. | 355 // of the page. |
| 346 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) { | 356 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) { |
| 347 // First confirm that the image loads as expected. | 357 // First confirm that the image loads as expected. |
| 348 | 358 |
| 349 // A separate HTTPS server is started for the subresource; src_server() is | 359 // A separate HTTPS server is started for the subresource; src_server() is |
| 350 // non-HTTPS. | 360 // non-HTTPS. |
| 351 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 361 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
| 352 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); | 362 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
| 353 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); | 363 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
| 354 ASSERT_TRUE(https_server.Start()); | 364 ASSERT_TRUE(https_server.Start()); |
| 355 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); | 365 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); |
| 356 base::StringPairs replacement_text; | 366 base::StringPairs replacement_text; |
| 357 replacement_text.push_back( | 367 replacement_text.push_back( |
| 358 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); | 368 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); |
| 359 std::string main_page_path; | 369 std::string main_page_path; |
| 360 net::test_server::GetFilePathWithReplacements( | 370 net::test_server::GetFilePathWithReplacements( |
| 361 kPrefetchImagePage, replacement_text, &main_page_path); | 371 kPrefetchImagePage, replacement_text, &main_page_path); |
| 362 RequestCounter script_counter; | 372 RequestCounter script_counter; |
| 363 CountRequestFor(kPrefetchScript, &script_counter); | 373 CountRequestFor(kPrefetchScript, &script_counter); |
| 364 | 374 |
| 365 std::unique_ptr<TestPrerender> prerender = | 375 std::unique_ptr<TestPrerender> prerender = |
| 366 PrefetchFromFile(main_page_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 376 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1); |
| 367 // Checks that the presumed failure of the image load didn't affect the script | 377 // Checks that the presumed failure of the image load didn't affect the script |
| 368 // fetch. This assumes waiting for the script load is enough to see any error | 378 // fetch. This assumes waiting for the script load is enough to see any error |
| 369 // from the image load. | 379 // from the image load. |
| 370 script_counter.WaitForCount(1); | 380 script_counter.WaitForCount(1); |
| 371 } | 381 } |
| 372 | 382 |
| 373 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) { | 383 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) { |
| 374 RequestCounter script_counter; | 384 RequestCounter script_counter; |
| 375 CountRequestFor(kPrefetchScript, &script_counter); | 385 CountRequestFor(kPrefetchScript, &script_counter); |
| 376 RequestCounter main_counter; | 386 RequestCounter main_counter; |
| 377 CountRequestFor(kPrefetchLoopPage, &main_counter); | 387 CountRequestFor(kPrefetchLoopPage, &main_counter); |
| 378 | 388 |
| 379 std::unique_ptr<TestPrerender> test_prerender = PrefetchFromFile( | 389 std::unique_ptr<TestPrerender> test_prerender = |
| 380 kPrefetchLoopPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 390 PrerenderTestURL(kPrefetchLoopPage, FINAL_STATUS_APP_TERMINATING, 1); |
| 381 main_counter.WaitForCount(1); | 391 main_counter.WaitForCount(1); |
| 382 script_counter.WaitForCount(1); | 392 script_counter.WaitForCount(1); |
| 383 } | 393 } |
| 384 | 394 |
| 385 #if defined(ENABLE_TASK_MANAGER) | 395 #if defined(ENABLE_TASK_MANAGER) |
| 386 | 396 |
| 387 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, | 397 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, |
| 388 OpenTaskManagerBeforePrefetch) { | 398 OpenTaskManagerBeforePrefetch) { |
| 389 const base::string16 any_prerender = MatchTaskManagerPrerender("*"); | 399 const base::string16 any_prerender = MatchTaskManagerPrerender("*"); |
| 390 const base::string16 any_tab = MatchTaskManagerTab("*"); | 400 const base::string16 any_tab = MatchTaskManagerTab("*"); |
| 391 const base::string16 original = MatchTaskManagerTab("Prefetch Loader"); | 401 const base::string16 original = MatchTaskManagerTab("Prefetch Loader"); |
| 392 // The page title is not visible in the task manager, presumably because the | 402 // The page title is not visible in the task manager, presumably because the |
| 393 // page has not been fully parsed. | 403 // page has not been fully parsed. |
| 394 const base::string16 prerender = | 404 const base::string16 prerender = |
| 395 MatchTaskManagerPrerender("*prefetch_page.html*"); | 405 MatchTaskManagerPrerender("*prefetch_page.html*"); |
| 396 | 406 |
| 397 // Show the task manager. This populates the model. | 407 // Show the task manager. This populates the model. |
| 398 chrome::OpenTaskManager(current_browser()); | 408 chrome::OpenTaskManager(current_browser()); |
| 399 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); | 409 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); |
| 400 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); | 410 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); |
| 401 | 411 |
| 402 // Prerender a page in addition to the original tab. | 412 // Prerender a page in addition to the original tab. |
| 403 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 413 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); |
| 404 | 414 |
| 405 // A TaskManager entry should appear like "Prerender: Prerender Page" | 415 // A TaskManager entry should appear like "Prerender: Prerender Page" |
| 406 // alongside the original tab entry. There should be just these two entries. | 416 // alongside the original tab entry. There should be just these two entries. |
| 407 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); | 417 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); |
| 408 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); | 418 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); |
| 409 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); | 419 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); |
| 410 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); | 420 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); |
| 411 } | 421 } |
| 412 | 422 |
| 413 #endif // defined(ENABLE_TASK_MANAGER) | 423 #endif // defined(ENABLE_TASK_MANAGER) |
| 414 | 424 |
| 415 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) { | 425 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) { |
| 416 // Navigate to about:blank to get the session storage namespace. | 426 std::unique_ptr<TestPrerender> prerender = |
| 417 ui_test_utils::NavigateToURL(current_browser(), GURL(url::kAboutBlankURL)); | 427 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_RENDERER_CRASHED, 1); |
| 418 content::SessionStorageNamespace* storage_namespace = | 428 prerender->contents()->prerender_contents()->GetController().LoadURL( |
| 419 GetActiveWebContents() | 429 GURL(content::kChromeUICrashURL), content::Referrer(), |
| 420 ->GetController() | 430 ui::PAGE_TRANSITION_TYPED, std::string()); |
| 421 .GetDefaultSessionStorageNamespace(); | 431 prerender->WaitForStop(); |
| 422 | |
| 423 // Navigate to about:crash without an intermediate loader because chrome:// | |
| 424 // URLs are ignored in renderers, and the test server has no support for them. | |
| 425 const gfx::Size kSize(640, 480); | |
| 426 std::unique_ptr<TestPrerender> test_prerender = | |
| 427 prerender_contents_factory()->ExpectPrerenderContents( | |
| 428 FINAL_STATUS_RENDERER_CRASHED); | |
| 429 std::unique_ptr<PrerenderHandle> prerender_handle( | |
| 430 GetPrerenderManager()->AddPrerenderFromExternalRequest( | |
| 431 GURL(content::kChromeUICrashURL), content::Referrer(), | |
| 432 storage_namespace, gfx::Rect(kSize))); | |
| 433 ASSERT_EQ(prerender_handle->contents(), test_prerender->contents()); | |
| 434 test_prerender->WaitForStop(); | |
| 435 } | 432 } |
| 436 | 433 |
| 437 // Checks that the prefetch of png correctly loads the png. | 434 // Checks that the prefetch of png correctly loads the png. |
| 438 // TODO(pasko): Add support for prefetching non-HTML documents and re-enable the | 435 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Png) { |
| 439 // test. | |
| 440 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, DISABLED_Png) { | |
| 441 RequestCounter counter; | 436 RequestCounter counter; |
| 442 CountRequestFor(kPrefetchPng, &counter); | 437 CountRequestFor(kPrefetchPng, &counter); |
| 443 PrefetchFromFile(kPrefetchPng, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 438 PrerenderTestURL(kPrefetchPng, FINAL_STATUS_APP_TERMINATING, 1); |
| 444 counter.WaitForCount(1); | 439 counter.WaitForCount(1); |
| 445 } | 440 } |
| 446 | 441 |
| 447 // Checks that the prefetch of png correctly loads the jpeg. | 442 // Checks that the prefetch of png correctly loads the jpeg. |
| 448 // TODO(pasko): Add support for prefetching non-HTML documents and re-enable the | 443 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Jpeg) { |
| 449 // test. | |
| 450 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, DISABLED_Jpeg) { | |
| 451 RequestCounter counter; | 444 RequestCounter counter; |
| 452 CountRequestFor(kPrefetchJpeg, &counter); | 445 CountRequestFor(kPrefetchJpeg, &counter); |
| 453 PrefetchFromFile(kPrefetchJpeg, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); | 446 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_APP_TERMINATING, 1); |
| 454 counter.WaitForCount(1); | 447 counter.WaitForCount(1); |
| 455 } | 448 } |
| 456 | 449 |
| 457 // Checks that nothing is prefetched from malware sites. | 450 // Checks that nothing is prefetched from malware sites. |
| 458 // TODO(mattcary): disabled as prefetch process teardown is racey with prerender | 451 // TODO(mattcary): disabled as prefetch process teardown is racey with prerender |
| 459 // contents destruction, can fix when prefetch prerenderers are destroyed | 452 // contents destruction, can fix when prefetch prerenderers are destroyed |
| 460 // deterministically. | 453 // deterministically. |
| 461 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, | 454 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, |
| 462 DISABLED_PrerenderSafeBrowsingTopLevel) { | 455 DISABLED_PrerenderSafeBrowsingTopLevel) { |
| 463 GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage)); | 456 GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage)); |
| 464 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( | 457 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( |
| 465 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); | 458 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
| 466 // Prefetch resources are blocked, but the prerender is not killed in any | 459 // Prefetch resources are blocked, but the prerender is not killed in any |
| 467 // special way. | 460 // special way. |
| 468 // TODO(mattcary): since the prerender will count itself as loaded even if the | 461 // TODO(mattcary): since the prerender will count itself as loaded even if the |
| 469 // fetch of the main resource fails, the test doesn't actually confirm what we | 462 // fetch of the main resource fails, the test doesn't actually confirm what we |
| 470 // want it to confirm. This may be fixed by planned changes to the prerender | 463 // want it to confirm. This may be fixed by planned changes to the prerender |
| 471 // lifecycle. | 464 // lifecycle. |
| 472 std::unique_ptr<TestPrerender> prerender = | 465 std::unique_ptr<TestPrerender> prerender = |
| 473 PrefetchFromFile(kPrefetchPage, FINAL_STATUS_SAFE_BROWSING); | 466 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_SAFE_BROWSING, 1); |
| 474 } | 467 } |
| 475 | 468 |
| 476 } // namespace prerender | 469 } // namespace prerender |
| OLD | NEW |