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

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

Issue 2304953002: NoState Prefetch: nostate prefetch browser tests. (Closed)
Patch Set: comments 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 {
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
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/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,
83 content::WebContents* web_contents,
84 bool* value) {
85 // In order to detect unknown variables we need a three-valued return.
86 int result;
87 EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
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
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.
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.
212 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
213 PrefetchReusedColdHistograms) {
214 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
215 GetTestPrerenderManager()->AdvanceTime(base::TimeDelta::FromSeconds(600));
216 ui_test_utils::NavigateToURL(
217 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage)));
218 histogram_tester().ExpectTotalCount(
219 "Prerender.websame_NoStatePrefetchTTFCP.Warm.Cacheable", 0);
220 histogram_tester().ExpectTotalCount(
221 "Prerender.websame_NoStatePrefetchTTFCP.Cold.Cacheable", 1);
222 }
223
224 // Test that we prefetch an img tag in body using our particular
225 // prerender_prefetch_image.html setup.
226 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) {
227 RequestCounter image_counter;
228 CountRequestFor(kPrefetchJpeg, &image_counter);
229 base::StringPairs replacement_text;
230 replacement_text.push_back(
231 std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg)));
232 std::string main_page_path;
233 net::test_server::GetFilePathWithReplacements(
234 kPrefetchImagePage, replacement_text, &main_page_path);
235 // Note that we can't CountRequestFor the main page as we use the test server
236 // for handling the image url replacement.
237 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1);
238 image_counter.WaitForCount(1);
239 }
240
241 // Check cross-domain prefetching by looking at histograms.
242 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) {
243 static const std::string secondary_domain = "www.foo.com";
244 host_resolver()->AddRule(secondary_domain, "127.0.0.1");
245 GURL cross_domain_url(base::StringPrintf(
246 "http://%s:%d/%s", secondary_domain.c_str(),
247 embedded_test_server()->host_port_pair().port(), kPrefetchPage));
248 PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1);
249 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1);
250 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
251 histogram_tester().ExpectTotalCount(
252 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
253 }
254
255 // Check that we support simultaneous prefetch.
256 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
257 RequestCounter first_main_counter;
258 CountRequestFor(kPrefetchPage, &first_main_counter);
259 RequestCounter second_main_counter;
260 CountRequestFor(kPrefetchPage2, &second_main_counter);
261 RequestCounter first_script_counter;
262 CountRequestFor(kPrefetchScript, &first_script_counter);
263 RequestCounter second_script_counter;
264 CountRequestFor(kPrefetchScript2, &second_script_counter);
265
266 // The first prerender is marked as canceled as when the second starts, it
267 // sees that the first has been abandoned (presumably because we detach
268 // immediately and so it dies quickly).
269 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_CANCELLED, 1);
270 PrerenderTestURL(kPrefetchPage2, FINAL_STATUS_APP_TERMINATING, 1);
271 first_main_counter.WaitForCount(1);
272 second_main_counter.WaitForCount(1);
273 first_script_counter.WaitForCount(1);
274 second_script_counter.WaitForCount(1);
275 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 2);
276 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 2);
277 }
278
279 // Check that we correctly handle a prefetch to a nonexisting page.
280 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, 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?
286 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLT", 1);
287 }
288
289 // Check that we follow a 301 redirect.
290 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) {
291 RequestCounter script_counter;
292 CountRequestFor(kPrefetchScript, &script_counter);
293 PrerenderTestURL(
294 "/server-redirect/?" +
295 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
296 FINAL_STATUS_APP_TERMINATING, 1);
297 script_counter.WaitForCount(1);
298 histogram_tester().ExpectTotalCount("Prerender.none_MainResourceRedirects",
299 1);
300 }
301
302 // Check that we follow a subresource 301 redirect.
303 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) {
304 RequestCounter script_counter;
305 CountRequestFor(kPrefetchScript, &script_counter);
306 PrerenderTestURL(kPrefetchSubresourceRedirectPage,
307 FINAL_STATUS_APP_TERMINATING, 1);
308 script_counter.WaitForCount(1);
309 histogram_tester().ExpectTotalCount("Prerender.none_MainResourceRedirects",
310 1);
311 }
312
313 // Check that we don't follow a client redirect.
314 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) {
315 RequestCounter script_counter;
316 CountRequestFor(kPrefetchScript, &script_counter);
317 // We use a sentinel via a complete load kPrefetchPage2. Otherwise we end
318 // before script_counter would reliable see the load of kPrefetchScript, were
319 // it to happen.
320 RequestCounter sentinel_counter;
321 CountRequestFor(kPrefetchScript2, &sentinel_counter);
322 PrerenderTestURL(
323 "/client-redirect/?" +
324 net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
325 FINAL_STATUS_APP_TERMINATING, 1);
326 ui_test_utils::NavigateToURL(
327 current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2)));
328 sentinel_counter.WaitForCount(1);
329 script_counter.WaitForCount(0);
330 }
331
332 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) {
333 UseHttpsSrcServer();
334 RequestCounter main_counter;
335 CountRequestFor(kPrefetchPage, &main_counter);
336 RequestCounter script_counter;
337 CountRequestFor(kPrefetchScript, &script_counter);
338 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
339 main_counter.WaitForCount(1);
340 script_counter.WaitForCount(1);
341 }
342
343 // Check that if an SSL error happens we don't fetch.
344 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) {
345 // We only send the loaded page, not the loader, through SSL.
346 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
347 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
348 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
349 ASSERT_TRUE(https_server.Start());
350 std::unique_ptr<TestPrerender> prerender =
351 PrerenderTestURL(https_server.GetURL(MakeAbsolute(kPrefetchPage)),
352 FINAL_STATUS_SSL_ERROR, 0);
353 DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR);
354 EXPECT_TRUE(waiter.WaitForDestroy());
355 }
356
357 // We should not have a problem if a subresource fails SSL.
358 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) {
359 // First confirm that the image loads as expected.
360
361 // Note that we start a separate HTTPS server for the subresource;
362 // src_server() is non-HTTPS.
363 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
364 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
365 https_server.ServeFilesFromSourceDirectory("chrome/test/data");
366 ASSERT_TRUE(https_server.Start());
367 GURL https_url = https_server.GetURL("/prerender/image.jpeg");
368 base::StringPairs replacement_text;
369 replacement_text.push_back(
370 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec()));
371 std::string main_page_path;
372 net::test_server::GetFilePathWithReplacements(
373 kPrefetchImagePage, replacement_text, &main_page_path);
374 RequestCounter script_counter;
375 CountRequestFor(kPrefetchScript, &script_counter);
376
377 std::unique_ptr<TestPrerender> prerender =
378 PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1);
379 // Check that the presumed failure of the image load didn't affect the script
380 // fetch. This assumes waiting for the script load is enough to see any error
381 // from the image load.
382 script_counter.WaitForCount(1);
383 }
384
385 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) {
386 RequestCounter script_counter;
387 CountRequestFor(kPrefetchScript, &script_counter);
388 RequestCounter main_counter;
389 CountRequestFor(kPrefetchLoopPage, &main_counter);
390
391 std::unique_ptr<TestPrerender> test_prerender =
392 PrerenderTestURL(kPrefetchLoopPage, FINAL_STATUS_APP_TERMINATING, 1);
393 main_counter.WaitForCount(1);
394 script_counter.WaitForCount(1);
395 }
396
397 #if defined(ENABLE_TASK_MANAGER)
398
399 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
400 OpenTaskManagerBeforePrefetch) {
401 const base::string16 any_prerender = MatchTaskManagerPrerender("*");
402 const base::string16 any_tab = MatchTaskManagerTab("*");
403 const base::string16 original = MatchTaskManagerTab("Prefetch Loader");
404 // Presumably we don't see the title in the task manager as the page has not
405 // been fully parsed.
406 const base::string16 prerender =
407 MatchTaskManagerPrerender("*prerender_prefetch_page.html*");
408
409 // Show the task manager. This populates the model.
410 chrome::OpenTaskManager(current_browser());
411 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab));
412 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender));
413
414 // Prerender a page in addition to the original tab.
415 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
416
417 // A TaskManager entry should appear like "Prerender: Prerender Page"
418 // alongside the original tab entry. There should be just these two entries.
419 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender));
420 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original));
421 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender));
422 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab));
423 }
424
425 #endif // defined(ENABLE_TASK_MANAGER)
426
427 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) {
428 std::unique_ptr<TestPrerender> prerender =
429 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_RENDERER_CRASHED, 1);
430 prerender->contents()->prerender_contents()->GetController().LoadURL(
431 GURL(content::kChromeUICrashURL), content::Referrer(),
432 ui::PAGE_TRANSITION_TYPED, std::string());
433 prerender->WaitForStop();
434 }
435
436 // For the next two tests, there is nothing for the prefetch scanner to do. But
437 // we make sure we behave as expect.
438 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Png) {
439 RequestCounter counter;
440 CountRequestFor(kPrefetchPng, &counter);
441 PrerenderTestURL(kPrefetchPng, FINAL_STATUS_APP_TERMINATING, 1);
442 counter.WaitForCount(1);
443 }
444
445 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Jpeg) {
446 RequestCounter counter;
447 CountRequestFor(kPrefetchJpeg, &counter);
448 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_APP_TERMINATING, 1);
449 counter.WaitForCount(1);
450 }
451
452 // We should not prefetch from malware sites.
453 IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
454 PrerenderSafeBrowsingTopLevel) {
455 GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage));
456 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl(
457 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
458 // Prefetch resource are blocked, but the prerender is not killed in any
459 // special way.
460 // TODO(mattcary): do we care about detecting if the main resource is fetched
461 // and preload scanning has started?
462 std::unique_ptr<TestPrerender> prerender =
463 PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 0);
464 }
465
466 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698