Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc

Issue 2452313002: Revert of [NoStatePrefetch] Kill renderer after preload scanning (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_message_filter.cc ('k') | chrome/browser/prerender/prerender_test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698