Index: chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc |
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a5234a3b2ff45afde5c213cdc7b43c6586acaf78 |
--- /dev/null |
+++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc |
@@ -0,0 +1,496 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/command_line.h" |
+#include "base/strings/string16.h" |
+#include "base/strings/string_split.h" |
+#include "base/task_scheduler/post_task.h" |
+#include "base/threading/platform_thread.h" // For |Sleep()|. |
+#include "chrome/browser/prerender/prerender_manager.h" |
+#include "chrome/browser/prerender/prerender_manager_factory.h" |
+#include "chrome/browser/prerender/prerender_test_utils.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/task_manager/task_manager_browsertest_util.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/browser_commands.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "content/public/common/content_switches.h" |
+#include "content/public/common/url_constants.h" |
+#include "content/public/test/browser_test_utils.h" |
+#include "net/base/escape.h" |
+#include "net/dns/mock_host_resolver.h" |
+#include "net/test/embedded_test_server/request_handler_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+using prerender::test_utils::CreateCountingInterceptorOnIO; |
+using prerender::test_utils::DestructionWaiter; |
+using prerender::test_utils::RequestCounter; |
+using prerender::test_utils::TestPrerender; |
+using prerender::test_utils::TestPrerenderContents; |
+using task_manager::browsertest_util::WaitForTaskManagerRows; |
+ |
+namespace { |
+// Fetches a boolean value from javascript. Returns whether the fetch |
+// succeeded; the value of the variable is returned in value. If |
+// javascript_variable does not exist, this returns false and value is |
+// unchanged. The function checks that script execution works. |
+bool GetJavascriptBoolean(const std::string& javascript_variable, |
+ content::WebContents* web_contents, |
+ bool* value) { |
+ // In order to detect unknown variables a three-valued return is needed. |
+ int result; |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractInt( |
+ web_contents, |
+ "try { if (" + javascript_variable + ") { " + |
+ "window.domAutomationController.send(1) } else { " + |
+ "window.domAutomationController.send(0); } } catch(err) {" + |
+ "window.domAutomationController.send(2) }", |
+ &result)); |
+ if (result == 2) { |
+ // This means an exception was caught, usually because of a missing |
+ // variable. |
+ return false; |
+ } |
+ *value = (result == 1); |
+ return true; |
+} |
+ |
+// As above, but just checks for a missing variable. |
+bool JavascriptVariableMissing(const std::string& javascript_variable, |
+ content::WebContents* web_contents) { |
+ bool unused; |
+ return !GetJavascriptBoolean(javascript_variable, web_contents, &unused); |
+} |
+ |
+} // namespace |
+ |
+namespace prerender { |
+ |
+// These URLs used for test resources must be relative with the exception of |
+// |PrefetchLoaderPath|, which is only used in |PrerenderTestURLImpl()|. |
+const char kPrefetchImagePage[] = "prerender/prefetch_image.html"; |
+const char kPrefetchJpeg[] = "prerender/image.jpeg"; |
+const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html"; |
+const char kPrefetchLoopPage[] = "prerender/prefetch_loop.html"; |
+const char kPrefetchPage[] = "prerender/prefetch_page.html"; |
+const char kPrefetchPage2[] = "prerender/prefetch_page2.html"; |
+const char kPrefetchPng[] = "prerender/image.png"; |
+const char kPrefetchScript[] = "prerender/prefetch.js"; |
+const char kPrefetchScript2[] = "prerender/prefetch2.js"; |
+const char kPrefetchSubresourceRedirectPage[] = |
+ "prerender/prefetch_subresource_redirect.html"; |
+ |
+const char kPageBool[] = "pageBool"; |
+const char kScriptBool[] = "scriptBool"; |
+ |
+class NoStatePrefetchBrowserTest |
+ : public test_utils::PrerenderInProcessBrowserTest { |
+ public: |
+ class BrowserTestTime : public PrerenderManager::TimeOverride { |
+ public: |
+ BrowserTestTime() {} |
+ |
+ base::Time GetCurrentTime() const override { |
+ if (delta_.is_zero()) { |
+ return base::Time::Now(); |
+ } |
+ return time_ + delta_; |
+ } |
+ |
+ base::TimeTicks GetCurrentTimeTicks() const override { |
+ if (delta_.is_zero()) { |
+ return base::TimeTicks::Now(); |
+ } |
+ return time_ticks_ + delta_; |
+ } |
+ |
+ void AdvanceTime(base::TimeDelta delta) { |
+ if (delta_.is_zero()) { |
+ time_ = base::Time::Now(); |
+ time_ticks_ = base::TimeTicks::Now(); |
+ delta_ = delta; |
+ } else { |
+ delta_ += delta; |
+ } |
+ } |
+ |
+ private: |
+ base::Time time_; |
+ base::TimeTicks time_ticks_; |
+ base::TimeDelta delta_; |
+ }; |
+ |
+ NoStatePrefetchBrowserTest() {} |
+ |
+ void SetUpCommandLine(base::CommandLine* command_line) override { |
+ PrerenderInProcessBrowserTest::SetUpCommandLine(command_line); |
+ command_line->AppendSwitchASCII( |
+ switches::kPrerenderMode, switches::kPrerenderModeSwitchValuePrefetch); |
+ } |
+ |
+ void SetUpOnMainThread() override { |
+ PrerenderInProcessBrowserTest::SetUpOnMainThread(); |
+ std::unique_ptr<BrowserTestTime> test_time = |
+ base::MakeUnique<BrowserTestTime>(); |
+ browser_test_time_ = test_time.get(); |
+ GetPrerenderManager()->SetTimeOverride(std::move(test_time)); |
+ } |
+ |
+ // Set up a request counter for |path|, which is also the location of the data |
+ // served by the request. |
+ void CountRequestFor(const std::string& path_str, RequestCounter* counter) { |
+ url::StringPieceReplacements<base::FilePath::StringType> replacement; |
+ base::FilePath file_path = base::FilePath::FromUTF8Unsafe(path_str); |
+ replacement.SetPathStr(file_path.value()); |
+ const GURL url = src_server()->base_url().ReplaceComponents(replacement); |
+ CountRequestFor(url, path_str, counter); |
+ } |
+ |
+ // As above, but specify the data path and URL separately. |
+ void CountRequestFor(const GURL& url, |
+ const std::string& path_str, |
+ RequestCounter* counter) { |
+ base::FilePath url_file = ui_test_utils::GetTestFilePath( |
+ base::FilePath(), base::FilePath::FromUTF8Unsafe(path_str)); |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, FROM_HERE, |
+ base::Bind(&CreateCountingInterceptorOnIO, url, url_file, |
+ counter->AsWeakPtr())); |
+ } |
+ |
+ BrowserTestTime* GetTimeOverride() const { return browser_test_time_; } |
+ |
+ private: |
+ ScopedVector<TestPrerender> PrerenderTestURLImpl( |
+ const GURL& prerender_url, |
+ const std::vector<FinalStatus>& expected_final_status_queue, |
+ int expected_number_of_loads) override { |
+ base::StringPairs replacement_text; |
+ replacement_text.push_back( |
+ make_pair("REPLACE_WITH_PREFETCH_URL", prerender_url.spec())); |
+ std::string replacement_path; |
+ net::test_server::GetFilePathWithReplacements( |
+ kPrefetchLoaderPath, replacement_text, &replacement_path); |
+ GURL loader_url = src_server()->GetURL(replacement_path); |
+ |
+ ScopedVector<TestPrerender> prerenders = NavigateWithPrerenders( |
+ loader_url, expected_final_status_queue, expected_number_of_loads); |
+ |
+ TestPrerenderContents* prerender_contents = prerenders[0]->contents(); |
+ if (expected_number_of_loads > 0) { |
+ CHECK(prerender_contents); |
+ // Checks that the prerender contents final status is unchanged from its |
+ // default value, meaning that the contents has not been destroyed. |
+ EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); |
+ } |
+ EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads()); |
+ |
+ return prerenders; |
+ } |
+ |
+ BrowserTestTime* browser_test_time_; |
+}; |
+ |
+// Performs a full load of the target page and check that javascript values are |
+// set as expected. This confirms that our test system is working correctly, so |
+// that when the target page is prefetched it can be confirmed that javascript |
+// is not executed. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, CheckJavascript) { |
+ ui_test_utils::NavigateToURL( |
+ current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage))); |
+ content::WebContents* web_contents = |
+ current_browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ // Confirms that true and false values can appear. |
+ bool value = false; |
+ EXPECT_TRUE(GetJavascriptBoolean(kPageBool, web_contents, &value)); |
+ EXPECT_TRUE(value); |
+ value = true; |
+ EXPECT_TRUE(GetJavascriptBoolean("pageAntiBool", web_contents, &value)); |
+ EXPECT_FALSE(value); |
+ |
+ // Confirm a value from the script is plumbed through. |
+ value = false; |
+ EXPECT_TRUE(GetJavascriptBoolean(kScriptBool, web_contents, &value)); |
+ EXPECT_TRUE(value); |
+ |
+ // Confirm that the expected happens when a value doesn't exist. |
+ EXPECT_TRUE(JavascriptVariableMissing("iDontExist", web_contents)); |
+} |
+ |
+// Checks that a page is correctly prefetched in the case of a |
+// <link rel=prerender> tag and then loaded into a tab in response to a |
+// navigation, when NoState Prefetch is enabled, but that the page is not loaded |
+// (which confirmed by checking that javascript is not executed). |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) { |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ RequestCounter main_counter; |
+ CountRequestFor(kPrefetchPage, &main_counter); |
+ |
+ std::unique_ptr<TestPrerender> test_prerender = |
+ PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); |
+ main_counter.WaitForCount(1); |
+ script_counter.WaitForCount(1); |
+ |
+ content::WebContents* contents = |
+ test_prerender->contents()->prerender_contents(); |
+ content::WebContents* active_contents = |
+ current_browser()->tab_strip_model()->GetActiveWebContents(); |
+ EXPECT_TRUE(JavascriptVariableMissing(kPageBool, contents)); |
+ EXPECT_TRUE(JavascriptVariableMissing(kScriptBool, contents)); |
+ EXPECT_TRUE(JavascriptVariableMissing(kPageBool, active_contents)); |
+ EXPECT_TRUE(JavascriptVariableMissing(kScriptBool, active_contents)); |
+} |
+ |
+// Checks the prefetch of an img tag. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) { |
+ RequestCounter image_counter; |
+ CountRequestFor(kPrefetchJpeg, &image_counter); |
+ base::StringPairs replacement_text; |
+ replacement_text.push_back( |
+ std::make_pair("REPLACE_WITH_IMAGE_URL", MakeAbsolute(kPrefetchJpeg))); |
+ std::string main_page_path; |
+ net::test_server::GetFilePathWithReplacements( |
+ kPrefetchImagePage, replacement_text, &main_page_path); |
+ // Note CountRequestFor cannot be used on the main page as the test server |
+ // must handling the image url replacement. |
+ PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1); |
+ image_counter.WaitForCount(1); |
+} |
+ |
+// Checks that a cross-domain prefetching works correctly. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) { |
+ static const std::string secondary_domain = "www.foo.com"; |
+ host_resolver()->AddRule(secondary_domain, "127.0.0.1"); |
+ GURL cross_domain_url(base::StringPrintf( |
+ "http://%s:%d/%s", secondary_domain.c_str(), |
+ embedded_test_server()->host_port_pair().port(), kPrefetchPage)); |
+ RequestCounter cross_domain_counter; |
+ CountRequestFor(cross_domain_url, kPrefetchPage, &cross_domain_counter); |
+ PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1); |
+ cross_domain_counter.WaitForCount(1); |
+} |
+ |
+// Checks simultaneous prefetch. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) { |
+ RequestCounter first_main_counter; |
+ CountRequestFor(kPrefetchPage, &first_main_counter); |
+ RequestCounter second_main_counter; |
+ CountRequestFor(kPrefetchPage2, &second_main_counter); |
+ RequestCounter first_script_counter; |
+ CountRequestFor(kPrefetchScript, &first_script_counter); |
+ RequestCounter second_script_counter; |
+ CountRequestFor(kPrefetchScript2, &second_script_counter); |
+ |
+ // The first prerender is marked as canceled as when the second starts, it |
+ // sees that the first has been abandoned (presumably because it is detached |
+ // immediately and so dies quickly). |
+ PrerenderTestURL(kPrefetchPage, FINAL_STATUS_CANCELLED, 1); |
+ PrerenderTestURL(kPrefetchPage2, FINAL_STATUS_APP_TERMINATING, 1); |
+ first_main_counter.WaitForCount(1); |
+ second_main_counter.WaitForCount(1); |
+ first_script_counter.WaitForCount(1); |
+ second_script_counter.WaitForCount(1); |
+} |
+ |
+// Checks a prefetch to a nonexisting page. |
+// TODO(mattcary): disabled as prefetch process teardown is racey with prerender |
+// contents destruction, can fix when prefetch prerenderers are destroyed |
+// deterministically. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, |
+ DISABLED_PrefetchNonexisting) { |
+ PrerenderTestURL("nonexisting-page.html", FINAL_STATUS_APP_TERMINATING, 0); |
+ // TODO(mattcary): we fire up a prerenderer before we discover that the main |
+ // page doesn't exist, we still count this as a prerender. Also we don't fail |
+ // the renderer (presumably because we've detached the resource, etc). Is this |
+ // what we want? At any rate, we can't positively check any of that now due to |
+ // histogram race conditions, and only test that we don't crash on a |
+ // nonexisting page. |
+} |
+ |
+// Checks that a 301 redirect is followed. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) { |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ PrerenderTestURL( |
+ "/server-redirect/?" + |
+ net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), |
+ FINAL_STATUS_APP_TERMINATING, 1); |
+ script_counter.WaitForCount(1); |
+} |
+ |
+// Checks that a subresource 301 redirect is followed. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) { |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ PrerenderTestURL(kPrefetchSubresourceRedirectPage, |
+ FINAL_STATUS_APP_TERMINATING, 1); |
+ script_counter.WaitForCount(1); |
+} |
+ |
+// Checks a client redirect is not followed. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) { |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ // A complete load of kPrefetchPage2 is used as a sentinal. Otherwise the test |
+ // ends before script_counter would reliably see the load of kPrefetchScript, |
+ // were it to happen. |
+ RequestCounter sentinel_counter; |
+ CountRequestFor(kPrefetchScript2, &sentinel_counter); |
+ PrerenderTestURL( |
+ "/client-redirect/?" + |
+ net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false), |
+ FINAL_STATUS_APP_TERMINATING, 1); |
+ ui_test_utils::NavigateToURL( |
+ current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2))); |
+ sentinel_counter.WaitForCount(1); |
+ script_counter.WaitForCount(0); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) { |
+ UseHttpsSrcServer(); |
+ RequestCounter main_counter; |
+ CountRequestFor(kPrefetchPage, &main_counter); |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); |
+ main_counter.WaitForCount(1); |
+ script_counter.WaitForCount(1); |
+} |
+ |
+// Checks that an SSL error prevents prefetch. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) { |
+ // Only send the loaded page, not the loader, through SSL. |
+ net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
+ https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
+ https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
+ ASSERT_TRUE(https_server.Start()); |
+ std::unique_ptr<TestPrerender> prerender = |
+ PrerenderTestURL(https_server.GetURL(MakeAbsolute(kPrefetchPage)), |
+ FINAL_STATUS_SSL_ERROR, 0); |
+ DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR); |
+ EXPECT_TRUE(waiter.WaitForDestroy()); |
+} |
+ |
+// Checks that a subresource failing SSL does not prevent prefetch on the rest |
+// of the page. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) { |
+ // First confirm that the image loads as expected. |
+ |
+ // A separate HTTPS server is started for the subresource; src_server() is |
+ // non-HTTPS. |
+ net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
+ https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
+ https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
+ ASSERT_TRUE(https_server.Start()); |
+ GURL https_url = https_server.GetURL("/prerender/image.jpeg"); |
+ base::StringPairs replacement_text; |
+ replacement_text.push_back( |
+ std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); |
+ std::string main_page_path; |
+ net::test_server::GetFilePathWithReplacements( |
+ kPrefetchImagePage, replacement_text, &main_page_path); |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ |
+ std::unique_ptr<TestPrerender> prerender = |
+ PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1); |
+ // Checks that the presumed failure of the image load didn't affect the script |
+ // fetch. This assumes waiting for the script load is enough to see any error |
+ // from the image load. |
+ script_counter.WaitForCount(1); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) { |
+ RequestCounter script_counter; |
+ CountRequestFor(kPrefetchScript, &script_counter); |
+ RequestCounter main_counter; |
+ CountRequestFor(kPrefetchLoopPage, &main_counter); |
+ |
+ std::unique_ptr<TestPrerender> test_prerender = |
+ PrerenderTestURL(kPrefetchLoopPage, FINAL_STATUS_APP_TERMINATING, 1); |
+ main_counter.WaitForCount(1); |
+ script_counter.WaitForCount(1); |
+} |
+ |
+#if defined(ENABLE_TASK_MANAGER) |
+ |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, |
+ OpenTaskManagerBeforePrefetch) { |
+ const base::string16 any_prerender = MatchTaskManagerPrerender("*"); |
+ const base::string16 any_tab = MatchTaskManagerTab("*"); |
+ const base::string16 original = MatchTaskManagerTab("Prefetch Loader"); |
+ // The page title is not visible in the task manager, presumably because the |
+ // page has not been fully parsed. |
+ const base::string16 prerender = |
+ MatchTaskManagerPrerender("*prefetch_page.html*"); |
+ |
+ // Show the task manager. This populates the model. |
+ chrome::OpenTaskManager(current_browser()); |
+ ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); |
+ ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); |
+ |
+ // Prerender a page in addition to the original tab. |
+ PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1); |
+ |
+ // A TaskManager entry should appear like "Prerender: Prerender Page" |
+ // alongside the original tab entry. There should be just these two entries. |
+ ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); |
+ ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); |
+ ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); |
+ ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); |
+} |
+ |
+#endif // defined(ENABLE_TASK_MANAGER) |
+ |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, RendererCrash) { |
+ std::unique_ptr<TestPrerender> prerender = |
+ PrerenderTestURL(kPrefetchPage, FINAL_STATUS_RENDERER_CRASHED, 1); |
+ prerender->contents()->prerender_contents()->GetController().LoadURL( |
+ GURL(content::kChromeUICrashURL), content::Referrer(), |
+ ui::PAGE_TRANSITION_TYPED, std::string()); |
+ prerender->WaitForStop(); |
+} |
+ |
+// Checks that the prefetch of png correctly loads the png. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Png) { |
+ RequestCounter counter; |
+ CountRequestFor(kPrefetchPng, &counter); |
+ PrerenderTestURL(kPrefetchPng, FINAL_STATUS_APP_TERMINATING, 1); |
+ counter.WaitForCount(1); |
+} |
+ |
+// Checks that the prefetch of png correctly loads the jpeg. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Jpeg) { |
+ RequestCounter counter; |
+ CountRequestFor(kPrefetchJpeg, &counter); |
+ PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_APP_TERMINATING, 1); |
+ counter.WaitForCount(1); |
+} |
+ |
+// Checks that nothing is prefetched from malware sites. |
+// TODO(mattcary): disabled as prefetch process teardown is racey with prerender |
+// contents destruction, can fix when prefetch prerenderers are destroyed |
+// deterministically. |
+IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, |
+ DISABLED_PrerenderSafeBrowsingTopLevel) { |
+ GURL url = src_server()->GetURL(MakeAbsolute(kPrefetchPage)); |
+ GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( |
+ url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
+ // Prefetch resources are blocked, but the prerender is not killed in any |
+ // special way. |
+ // TODO(mattcary): since the prerender will count itself as loaded even if the |
+ // fetch of the main resource fails, the test doesn't actually confirm what we |
+ // want it to confirm. This may be fixed by planned changes to the prerender |
+ // lifecycle. |
+ std::unique_ptr<TestPrerender> prerender = |
+ PrerenderTestURL(kPrefetchPage, FINAL_STATUS_SAFE_BROWSING, 1); |
+} |
+ |
+} // namespace prerender |