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

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

Issue 2304953002: NoState Prefetch: nostate prefetch browser tests. (Closed)
Patch Set: histogram name fixes Created 4 years, 3 months 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/command_line.h"
6 #include "base/strings/string_split.h"
7 #include "chrome/browser/prerender/prerender_manager.h"
8 #include "chrome/browser/prerender/prerender_manager_factory.h"
9 #include "chrome/browser/prerender/prerender_test_utils.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_commands.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/grit/generated_resources.h"
17 #include "chrome/test/base/ui_test_utils.h"
18 #include "content/public/common/content_switches.h"
19 #include "content/public/common/url_constants.h"
20 #include "content/public/test/browser_test_utils.h"
21 #include "net/base/escape.h"
22 #include "net/dns/mock_host_resolver.h"
23 #include "net/test/embedded_test_server/request_handler_util.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25 #include "ui/base/l10n/l10n_util.h"
26
27 using prerender::test_utils::CreateCountingInterceptorOnIO;
28 using prerender::test_utils::DestructionWaiter;
29 using prerender::test_utils::RequestCounter;
30 using prerender::test_utils::TestPrerender;
31 using prerender::test_utils::TestPrerenderContents;
32 using task_manager::browsertest_util::WaitForTaskManagerRows;
33 namespace prerender {
pasko 2016/09/30 18:29:21 nit: extra empty line above namespace
mattcary 2016/10/03 10:58:35 Done.
34
35 // The various uses of URLs in these tests (the test server, request capture,
36 // etc) are fussy about relative versus absolute paths. With the exception of
pasko 2016/09/30 18:29:21 fussy? that's very concrete and easy to understand
mattcary 2016/10/03 10:58:35 Acknowledged.
37 // kPrefetchLoaderPath, which is only used in PrerenderTestURLImpl, all other
38 // paths should be relative.
39 const char kPrefetchImagePage[] = "prerender/prefetch_image.html";
40 const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html";
41 const char kPrefetchJpeg[] = "prerender/image.jpeg";
42 const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html";
43 const char kPrefetchPage[] = "prerender/prefetch_page.html";
44 const char kPrefetchPage2[] = "prerender/prefetch_page2.html";
45 const char kPrefetchPng[] = "prerender/image.png";
46 const char kPrefetchScript[] = "prerender/prefetch.js";
47 const char kPrefetchScript2[] = "prerender/prefetch2.js";
48 const char kPrefetchSubresourceRedirectPage[] =
49 "prerender/prefetch_subresource_redirect.html";
50
51 const char kPageBool[] = "pageBool";
52 const char kScriptBool[] = "scriptBool";
53
54 class NoStatePrefetchBrowserTest
55 : public test_utils::PrerenderInProcessBrowserTest {
56 public:
57 NoStatePrefetchBrowserTest() {}
58
59 void SetUpCommandLine(base::CommandLine* command_line) override {
60 PrerenderInProcessBrowserTest::SetUpCommandLine(command_line);
61 command_line->AppendSwitchASCII(
62 switches::kPrerenderMode, switches::kPrerenderModeSwitchValuePrefetch);
63 }
64
65 // Set up a request counter for the path.
66 void CountRequestFor(const std::string& path, RequestCounter* counter) {
67 GURL::Replacements replacement;
68 replacement.SetPathStr(path);
69 const GURL url = src_server()->base_url().ReplaceComponents(replacement);
70 base::FilePath url_file =
71 ui_test_utils::GetTestFilePath(base::FilePath(), base::FilePath(path));
72 content::BrowserThread::PostTask(
73 content::BrowserThread::IO, FROM_HERE,
74 base::Bind(&CreateCountingInterceptorOnIO, url, url_file,
75 counter->AsWeakPtr()));
76 }
77
78 // Fetches a boolean value from javascript. Returns whether the fetch
79 // succeeded; the value of the variable is returned in value. If
80 // javascript_variable does not exist, this returns false and value is
81 // unchanged. The function checks that script execution works.
82 bool GetJavascriptBoolean(const std::string& javascript_variable,
pasko 2016/09/30 18:29:20 static? why does this need to be in the NoStatePre
mattcary 2016/10/03 10:58:35 Done.
83 content::WebContents* web_contents,
84 bool* value) {
85 // In order to detect unknown variables we need a three-valued return.
pasko 2016/09/30 18:29:20 nit: ... a three-valued return is needed.
mattcary 2016/10/03 10:58:34 Done.
86 int result;
87 EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
pasko 2016/09/30 18:29:21 should this rather be a fatal failure? It does not
mattcary 2016/10/03 10:58:35 Yes, but it won't compile! ASSERT_TRUE can only be
droger 2016/10/03 11:07:13 The relevant gtest doc is here: https://github.com
pasko 2016/10/03 18:54:16 Thanks for investigation, folks. Agreed that ASSER
mattcary 2016/10/04 08:25:12 Acknowledged.
88 web_contents,
89 "try { if (" + javascript_variable + ") { " +
90 "window.domAutomationController.send(1) } else { " +
91 "window.domAutomationController.send(0); } } catch(err) {" +
92 "window.domAutomationController.send(2) }",
93 &result));
94 if (result == 2) {
95 // This means an exception was caught, usually because of a missing
96 // variable.
97 return false;
98 }
99 *value = (result == 1);
100 return true;
101 }
102
103 // As above, but just checks for a missing variable.
104 bool JavascriptVariableMissing(const std::string& javascript_variable,
105 content::WebContents* web_contents) {
106 bool unused;
107 return !GetJavascriptBoolean(javascript_variable, web_contents, &unused);
108 }
109
110 private:
111 ScopedVector<TestPrerender> PrerenderTestURLImpl(
112 const GURL& prerender_url,
113 const std::vector<FinalStatus>& expected_final_status_queue,
114 int expected_number_of_loads) override {
115 base::StringPairs replacement_text;
116 replacement_text.push_back(
117 make_pair("REPLACE_WITH_PREFETCH_URL", prerender_url.spec()));
118 std::string replacement_path;
119 net::test_server::GetFilePathWithReplacements(
120 kPrefetchLoaderPath, replacement_text, &replacement_path);
121 GURL loader_url = src_server()->GetURL(replacement_path);
122
123 ScopedVector<TestPrerender> prerenders = NavigateWithPrerenders(
124 loader_url, expected_final_status_queue, expected_number_of_loads);
125
126 TestPrerenderContents* prerender_contents = prerenders[0]->contents();
127 CHECK(prerender_contents);
128 // Check that the prerender contents final status is unchanged from its
129 // default value, meaning that the contents has not been destroyed.
130 EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status());
131
132 EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads());
133
134 return prerenders;
135 }
136 };
137
138 // Checks that when the prefetch page is loaded in full, javascript values are
pasko 2016/09/30 18:29:20 s/prefetch/prefetcher/ or 'the initial page reques
mattcary 2016/10/03 10:58:34 Done.
139 // set as expected. This checks that our test system is working as expected.
140 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, CheckJavascript) {
141 ui_test_utils::NavigateToURL(
142 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage)));
143 content::WebContents* web_contents =
144 current_browser()->tab_strip_model()->GetActiveWebContents();
145
146 // Confirm we can get true and false values.
147 bool value = false;
148 EXPECT_TRUE(GetJavascriptBoolean(kPageBool, web_contents, &value));
149 EXPECT_TRUE(value);
150 value = true;
151 EXPECT_TRUE(GetJavascriptBoolean("pageAntiBool", web_contents, &value));
152 EXPECT_FALSE(value);
153
154 // Confirm a value from the script is plumbed through.
155 value = false;
156 EXPECT_TRUE(GetJavascriptBoolean(kScriptBool, web_contents, &value));
157 EXPECT_TRUE(value);
158
159 // Confirm that the expected happens when a value doesn't exist.
160 EXPECT_TRUE(JavascriptVariableMissing("iDontExist", web_contents));
161 }
162
163 // Checks that a page is correctly prefetched in the case of a
164 // <link rel=prerender> tag and then loaded into a tab in response to a
165 // navigation, when NoState Prefetch is enabled, but that the page is not loaded
166 // (which confirmed by checking that javascript is not executed).
167 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) {
168 RequestCounter script_counter;
169 CountRequestFor(kPrefetchScript, &script_counter);
170 RequestCounter main_counter;
171 CountRequestFor(kPrefetchPage, &main_counter);
172
173 std::unique_ptr<TestPrerender> test_prerender =
174 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
175 main_counter.WaitForCount(1);
176 script_counter.WaitForCount(1);
177
178 content::WebContents* contents =
179 test_prerender->contents()->prerender_contents();
180 content::WebContents* active_contents =
181 current_browser()->tab_strip_model()->GetActiveWebContents();
182 EXPECT_TRUE(JavascriptVariableMissing(kPageBool, contents));
183 EXPECT_TRUE(JavascriptVariableMissing(kScriptBool, contents));
184 EXPECT_TRUE(JavascriptVariableMissing(kPageBool, active_contents));
185 EXPECT_TRUE(JavascriptVariableMissing(kScriptBool, active_contents));
186 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1);
187 histogram_tester().ExpectBucketCount(
188 "Prerender.websame_NoStatePrefetchResponseTypes",
189 4 /* cacheable, main resource */, 1);
190 histogram_tester().ExpectBucketCount(
191 "Prerender.websame_NoStatePrefetchResponseTypes",
192 0 /* cacheable, non-main resource */, 1);
193 histogram_tester().ExpectTotalCount("Prerender.none_MainResourceRedirects",
194 0);
195 histogram_tester().ExpectTotalCount("Prerender.none_SubResourceRedirects", 0);
196 }
197
198 // Check the histograms on reuse of a prefetch.
pasko 2016/09/30 18:29:20 More concrete: Checks that the TTFCP histograms ar
mattcary 2016/10/03 10:58:35 Done.
199 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
200 PrefetchReusedWarmHistograms) {
201 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
202 GetTestPrerenderManager()->AdvanceTime(base::TimeDelta::FromSeconds(10));
203 ui_test_utils::NavigateToURL(
204 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage)));
205 histogram_tester().ExpectTotalCount(
206 "Prerender.websame_NoStatePrefetchTTFCP.Warm.Cacheable", 1);
207 histogram_tester().ExpectTotalCount(
208 "Prerender.websame_NoStatePrefetchTTFCP.Cold.Cacheable", 0);
209 }
210
211 // Check the histograms on reuse of a prefetch.
pasko 2016/09/30 18:29:20 Checks
mattcary 2016/10/03 10:58:35 Done.
212 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
213 PrefetchReusedColdHistograms) {
214 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_TIMED_OUT, 1);
215 GetTestPrerenderManager()->AdvanceTime(base::TimeDelta::FromSeconds(600));
216 ui_test_utils::NavigateToURL(
217 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage)));
218
219 histogram_tester().ExpectTotalCount(
220 "Prerender.websame_NoStatePrefetchTTFCP.Warm.Cacheable", 0);
221 histogram_tester().ExpectTotalCount(
222 "Prerender.websame_NoStatePrefetchTTFCP.Cold.Cacheable", 1);
223 }
224
225 // Test that we prefetch an img tag in body using our particular
pasko 2016/09/30 18:29:21 Tests avoid we, our why using polluting words lik
mattcary 2016/10/03 10:58:35 Done.
226 // prerender_prefetch_image.html setup.
227 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) {
228 RequestCounter image_counter;
229 CountRequestFor(kPrefetchJpeg, &image_counter);
230 base::StringPairs replacement_text;
231 replacement_text.push_back(
232 std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg)));
233 std::string main_page_path;
234 net::test_server::GetFilePathWithReplacements(
235 kPrefetchImagePage, replacement_text, &main_page_path);
236 // Note that we can't CountRequestFor the main page as we use the test server
237 // for handling the image url replacement.
238 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1);
239 image_counter.WaitForCount(1);
240 }
241
242 // Check cross-domain prefetching by looking at histograms.
pasko 2016/09/30 18:29:20 Checks that .. cross-domain prefetching does X whe
mattcary 2016/10/03 10:58:35 Done.
243 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) {
244 static const std::string secondary_domain = "www.foo.com";
245 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
246 GURL cross_domain_url(base::StringPrintf(
247 "http://%s:%d/%s", secondary_domain.c_str(),
248 embedded_test_server()->host_port_pair().port(), kPrefetchPage));
249 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1);
250 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1);
251 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
252 histogram_tester().ExpectTotalCount(
253 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
254 }
255
256 // Check that we support simultaneous prefetch.
257 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
258 RequestCounter first_main_counter;
259 CountRequestFor(kPrefetchPage, &first_main_counter);
260 RequestCounter second_main_counter;
261 CountRequestFor(kPrefetchPage2, &second_main_counter);
262 RequestCounter first_script_counter;
263 CountRequestFor(kPrefetchScript, &first_script_counter);
264 RequestCounter second_script_counter;
265 CountRequestFor(kPrefetchScript2, &second_script_counter);
266
267 // The first prerender is marked as canceled as when the second starts, it
268 // sees that the first has been abandoned (presumably because we detach
269 // immediately and so it dies quickly).
270 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_CANCELLED, 1);
271 PrerenderTestURL(kPrefetchPage2, FINAL_STATUS_APP_TERMINATING, 1);
272 first_main_counter.WaitForCount(1);
273 second_main_counter.WaitForCount(1);
274 first_script_counter.WaitForCount(1);
275 second_script_counter.WaitForCount(1);
276 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 2);
277 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 2);
278 }
279
280 // Check that we correctly handle a prefetch to a nonexisting page.
281 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchNonexisting) {
282 PrerenderTestURL("nonexisting-page.html", FINAL_STATUS_APP_TERMINATING, 0);
283 // TODO(mattcary): we fire up a prerenderer before we discover that the main
284 // page doesn't exist, we still count this as a prerender. Also we don't fail
285 // the renderer (presumably because we've detached the resource, etc). Is this
286 // what we want?
287 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1);
288 }
289
290 // Check that we follow a 301 redirect.
291 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) {
292 RequestCounter script_counter;
293 CountRequestFor(kPrefetchScript, &script_counter);
294 PrerenderTestURL(
295 "/server-redirect/?" +
296 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
297 FINAL_STATUS_APP_TERMINATING, 1);
298 script_counter.WaitForCount(1);
299 histogram_tester().ExpectTotalCount(
300 "Prerender.websame_NoStatePrefetchMainResourceRedirects", 1);
301 }
302
303 // Check that we follow a subresource 301 redirect.
304 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) {
305 RequestCounter script_counter;
306 CountRequestFor(kPrefetchScript, &script_counter);
307 PrerenderTestURL(kPrefetchSubresourceRedirectPage,
308 FINAL_STATUS_APP_TERMINATING, 1);
309 script_counter.WaitForCount(1);
310 histogram_tester().ExpectTotalCount(
311 "Prerender.websame_NoStatePrefetchMainResourceRedirects", 1);
312 }
313
314 // Check that we don't follow a client redirect.
315 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) {
316 RequestCounter script_counter;
317 CountRequestFor(kPrefetchScript, &script_counter);
318 // We use a sentinel via a complete load kPrefetchPage2. Otherwise we end
319 // before script_counter would reliable see the load of kPrefetchScript, were
320 // it to happen.
321 RequestCounter sentinel_counter;
322 CountRequestFor(kPrefetchScript2, &sentinel_counter);
323 PrerenderTestURL(
324 "/client-redirect/?" +
325 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
326 FINAL_STATUS_APP_TERMINATING, 1);
327 ui_test_utils::NavigateToURL(
328 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2)));
329 sentinel_counter.WaitForCount(1);
330 script_counter.WaitForCount(0);
331 }
332
333 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) {
334 UseHttpsSrcServer();
335 RequestCounter main_counter;
336 CountRequestFor(kPrefetchPage, &main_counter);
337 RequestCounter script_counter;
338 CountRequestFor(kPrefetchScript, &script_counter);
339 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
340 main_counter.WaitForCount(1);
341 script_counter.WaitForCount(1);
342 }
343
344 // Check that if an SSL error happens we don't fetch.
345 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) {
346 // We only send the loaded page, not the loader, through SSL.
347 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
348 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
349 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
350 ASSERT_TRUE(https_server.Start());
351 std::unique_ptr<TestPrerender> prerender =
352 PrerenderTestURL(https_server.GetURL(MakeAbsolute(kPrefetchPage)),
353 FINAL_STATUS_SSL_ERROR, 0);
354 DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR);
355 EXPECT_TRUE(waiter.WaitForDestroy());
356 }
357
358 // We should not have a problem if a subresource fails SSL.
359 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) {
360 // First confirm that the image loads as expected.
361
362 // Note that we start a separate HTTPS server for the subresource;
363 // src_server() is non-HTTPS.
364 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
365 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
366 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
367 ASSERT_TRUE(https_server.Start());
368 GURL https_url = https_server.GetURL("/prerender/image.jpeg");
369 base::StringPairs replacement_text;
370 replacement_text.push_back(
371 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
372 std::string main_page_path;
373 net::test_server::GetFilePathWithReplacements(
374 kPrefetchImagePage, replacement_text, &main_page_path);
375 RequestCounter script_counter;
376 CountRequestFor(kPrefetchScript, &script_counter);
377
378 std::unique_ptr<TestPrerender> prerender =
379 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1);
380 // Check that the presumed failure of the image load didn't affect the script
381 // fetch. This assumes waiting for the script load is enough to see any error
382 // from the image load.
383 script_counter.WaitForCount(1);
384 }
385
386 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) {
387 RequestCounter script_counter;
388 CountRequestFor(kPrefetchScript, &script_counter);
389 RequestCounter main_counter;
390 CountRequestFor(kPrefetchLoopPage, &main_counter);
391
392 std::unique_ptr<TestPrerender> test_prerender =
393 PrerenderTestURL(kPrefetchLoopPage, FINAL_STATUS_APP_TERMINATING, 1);
394 main_counter.WaitForCount(1);
395 script_counter.WaitForCount(1);
396 }
397
398 #if defined(ENABLE_TASK_MANAGER)
399
400 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
401 OpenTaskManagerBeforePrefetch) {
402 const base::string16 any_prerender = MatchTaskManagerPrerender("*");
403 const base::string16 any_tab = MatchTaskManagerTab("*");
404 const base::string16 original = MatchTaskManagerTab("Prefetch Loader");
405 // Presumably we don't see the title in the task manager as the page has not
406 // been fully parsed.
407 const base::string16 prerender =
408 MatchTaskManagerPrerender("*prefetch_page.html*");
409
410 // Show the task manager. This populates the model.
411 chrome::OpenTaskManager(current_browser());
412 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab));
413 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender));
414
415 // Prerender a page in addition to the original tab.
416 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
417
418 // A TaskManager entry should appear like "Prerender: Prerender Page"
419 // alongside the original tab entry. There should be just these two entries.
420 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender));
421 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original));
422 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender));
423 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab));
424 }
425
426 #endif // defined(ENABLE_TASK_MANAGER)
427
428 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) {
429 std::unique_ptr<TestPrerender> prerender =
430 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_RENDERER_CRASHED, 1);
431 prerender->contents()->prerender_contents()->GetController().LoadURL(
432 GURL(content::kChromeUICrashURL), content::Referrer(),
433 ui::PAGE_TRANSITION_TYPED, std::string());
434 prerender->WaitForStop();
435 }
436
437 // For the next two tests, there is nothing for the prefetch scanner to do. But
438 // we make sure we behave as expect.
439 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Png) {
440 RequestCounter counter;
441 CountRequestFor(kPrefetchPng, &counter);
442 PrerenderTestURL(kPrefetchPng, FINAL_STATUS_APP_TERMINATING, 1);
443 counter.WaitForCount(1);
444 }
445
446 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Jpeg) {
447 RequestCounter counter;
448 CountRequestFor(kPrefetchJpeg, &counter);
449 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_APP_TERMINATING, 1);
450 counter.WaitForCount(1);
451 }
452
453 // We should not prefetch from malware sites.
454 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
455 PrerenderSafeBrowsingTopLevel) {
456 GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage));
457 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
458 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
459 // Prefetch resource are blocked, but the prerender is not killed in any
460 // special way.
461 // TODO(mattcary): do we care about detecting if the main resource is fetched
462 // and preload scanning has started?
463 std::unique_ptr<TestPrerender> prerender =
464 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 0);
465 }
466
467 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698