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 |