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