| 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
|
| index 28c15901f17999f9c20dbbe8e5d83d29765cbaa5..b30fe5c9cf2759ad9f6f16ce12256816b01d3390 100644
|
| --- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
|
| +++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
|
| @@ -6,6 +6,7 @@
|
| #include "base/strings/string16.h"
|
| #include "base/strings/string_split.h"
|
| #include "base/task_scheduler/post_task.h"
|
| +#include "chrome/browser/prerender/prerender_handle.h"
|
| #include "chrome/browser/prerender/prerender_manager.h"
|
| #include "chrome/browser/prerender/prerender_manager_factory.h"
|
| #include "chrome/browser/prerender/prerender_test_utils.h"
|
| @@ -30,13 +31,11 @@ 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 prerender {
|
|
|
| // These URLs used for test resources must be relative with the exception of
|
| -// |PrefetchLoaderPath|, which is only used in |PrerenderTestURLImpl()|.
|
| +// |kPrefetchLoaderPath|.
|
| const char kPrefetchImagePage[] = "prerender/prefetch_image.html";
|
| const char kPrefetchJpeg[] = "prerender/image.jpeg";
|
| const char kPrefetchLoaderPath[] = "/prerender/prefetch_loader.html";
|
| @@ -129,36 +128,31 @@ class NoStatePrefetchBrowserTest
|
|
|
| BrowserTestTime* GetTimeOverride() const { return browser_test_time_; }
|
|
|
| - private:
|
| - std::vector<std::unique_ptr<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);
|
| -
|
| + protected:
|
| + std::unique_ptr<TestPrerender> PrefetchFromURL(
|
| + const GURL& target_url,
|
| + FinalStatus expected_final_status) {
|
| + GURL loader_url = ServeLoaderURL(
|
| + kPrefetchLoaderPath, "REPLACE_WITH_PREFETCH_URL", target_url, "");
|
| + std::vector<FinalStatus> expected_final_status_queue(1,
|
| + expected_final_status);
|
| std::vector<std::unique_ptr<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());
|
| + NavigateWithPrerenders(loader_url, expected_final_status_queue);
|
| + prerenders[0]->WaitForStop();
|
| + return std::move(prerenders[0]);
|
| + }
|
|
|
| - return prerenders;
|
| + std::unique_ptr<TestPrerender> PrefetchFromFile(
|
| + const std::string& html_file,
|
| + FinalStatus expected_final_status) {
|
| + return PrefetchFromURL(src_server()->GetURL(MakeAbsolute(html_file)),
|
| + expected_final_status);
|
| }
|
|
|
| + private:
|
| BrowserTestTime* browser_test_time_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(NoStatePrefetchBrowserTest);
|
| };
|
|
|
| // Checks that a page is correctly prefetched in the case of a
|
| @@ -172,10 +166,13 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimple) {
|
| CountRequestFor(kPrefetchScript2, &script2_counter);
|
|
|
| std::unique_ptr<TestPrerender> test_prerender =
|
| - PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| main_counter.WaitForCount(1);
|
| script_counter.WaitForCount(1);
|
| script2_counter.WaitForCount(0);
|
| +
|
| + // Verify that the page load did not happen.
|
| + test_prerender->WaitForLoads(0);
|
| }
|
|
|
| // Checks the prefetch of an img tag.
|
| @@ -190,7 +187,7 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchImage) {
|
| 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);
|
| + PrefetchFromFile(main_page_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| image_counter.WaitForCount(1);
|
| }
|
|
|
| @@ -203,7 +200,7 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchCrossDomain) {
|
| embedded_test_server()->host_port_pair().port(), kPrefetchPage));
|
| RequestCounter cross_domain_counter;
|
| CountRequestForUrl(cross_domain_url, kPrefetchPage, &cross_domain_counter);
|
| - PrerenderTestURL(cross_domain_url, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromURL(cross_domain_url, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| cross_domain_counter.WaitForCount(1);
|
| }
|
|
|
| @@ -218,12 +215,12 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, ResponseHeaderCSP) {
|
| RequestCounter second_script;
|
| GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2);
|
| CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script);
|
| - PrerenderTestURL(kPrefetchResponseHeaderCSP, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchResponseHeaderCSP,
|
| + FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| // The second script is in the correct domain for CSP, but the first script is
|
| // not.
|
| main_page.WaitForCount(1);
|
| second_script.WaitForCount(1);
|
| - // TODO(pasko): wait for prefetch to be finished before checking the counts.
|
| first_script.WaitForCount(0);
|
| }
|
|
|
| @@ -240,17 +237,18 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, MetaTagCSP) {
|
| RequestCounter second_script;
|
| GURL second_script_url(std::string("http://foo.bar/") + kPrefetchScript2);
|
| CountRequestForUrl(second_script_url, kPrefetchScript2, &second_script);
|
| - PrerenderTestURL(kPrefetchMetaCSP, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchMetaCSP, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| // TODO(mattcary): See test comment above. If the meta CSP tag were parsed,
|
| // |second_script| would be loaded. Instead as the background scanner bails as
|
| // soon as the meta CSP tag is seen, only |main_page| is fetched.
|
| main_page.WaitForCount(1);
|
| - // TODO(pasko): wait for prefetch to be finished before checking the counts.
|
| second_script.WaitForCount(0);
|
| first_script.WaitForCount(0);
|
| }
|
|
|
| -// Checks simultaneous prefetch.
|
| +// Checks that the second prefetch request succeeds. TODO(pasko): This test
|
| +// waits for Prerender Stop before starting the second request, add a test that
|
| +// starts the second request from the UI thread immediately without waiting.
|
| IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
|
| RequestCounter first_main_counter;
|
| CountRequestFor(kPrefetchPage, &first_main_counter);
|
| @@ -264,8 +262,8 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
|
| // The first prerender is marked as canceled. When the second prerender
|
| // starts, it sees that the first has been abandoned (because the earlier
|
| // prerender is detached immediately and so dies quickly).
|
| - PrerenderTestURL(kPrefetchPage, FINAL_STATUS_CANCELLED, 1);
|
| - PrerenderTestURL(kPrefetchPage2, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| + PrefetchFromFile(kPrefetchPage2, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| first_main_counter.WaitForCount(1);
|
| second_main_counter.WaitForCount(1);
|
| first_script_counter.WaitForCount(1);
|
| @@ -273,28 +271,19 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchSimultaneous) {
|
| }
|
|
|
| // 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.
|
| +IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchNonexisting) {
|
| + std::unique_ptr<TestPrerender> test_prerender = PrefetchFromFile(
|
| + "nonexisting-page.html", FINAL_STATUS_UNSUPPORTED_SCHEME);
|
| }
|
|
|
| // Checks that a 301 redirect is followed.
|
| IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) {
|
| RequestCounter script_counter;
|
| CountRequestFor(kPrefetchScript, &script_counter);
|
| - PrerenderTestURL(
|
| + PrefetchFromFile(
|
| "/server-redirect/?" +
|
| net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
|
| - FINAL_STATUS_APP_TERMINATING, 1);
|
| + FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| script_counter.WaitForCount(1);
|
| }
|
|
|
| @@ -302,8 +291,8 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Redirect) {
|
| IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Prefetch301Subresource) {
|
| RequestCounter script_counter;
|
| CountRequestFor(kPrefetchScript, &script_counter);
|
| - PrerenderTestURL(kPrefetchSubresourceRedirectPage,
|
| - FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchSubresourceRedirectPage,
|
| + FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| script_counter.WaitForCount(1);
|
| }
|
|
|
| @@ -316,10 +305,10 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchClientRedirect) {
|
| // were it to happen.
|
| RequestCounter sentinel_counter;
|
| CountRequestFor(kPrefetchScript2, &sentinel_counter);
|
| - PrerenderTestURL(
|
| + PrefetchFromFile(
|
| "/client-redirect/?" +
|
| net::EscapeQueryParamValue(MakeAbsolute(kPrefetchPage), false),
|
| - FINAL_STATUS_APP_TERMINATING, 1);
|
| + FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| ui_test_utils::NavigateToURL(
|
| current_browser(), src_server()->GetURL(MakeAbsolute(kPrefetchPage2)));
|
| sentinel_counter.WaitForCount(1);
|
| @@ -332,7 +321,7 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, PrefetchHttps) {
|
| CountRequestFor(kPrefetchPage, &main_counter);
|
| RequestCounter script_counter;
|
| CountRequestFor(kPrefetchScript, &script_counter);
|
| - PrerenderTestURL(kPrefetchPage, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| main_counter.WaitForCount(1);
|
| script_counter.WaitForCount(1);
|
| }
|
| @@ -344,9 +333,8 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLError) {
|
| 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);
|
| + std::unique_ptr<TestPrerender> prerender = PrefetchFromURL(
|
| + https_server.GetURL(MakeAbsolute(kPrefetchPage)), FINAL_STATUS_SSL_ERROR);
|
| DestructionWaiter waiter(prerender->contents(), FINAL_STATUS_SSL_ERROR);
|
| EXPECT_TRUE(waiter.WaitForDestroy());
|
| }
|
| @@ -373,7 +361,7 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, SSLSubresourceError) {
|
| CountRequestFor(kPrefetchScript, &script_counter);
|
|
|
| std::unique_ptr<TestPrerender> prerender =
|
| - PrerenderTestURL(main_page_path, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(main_page_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| // 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.
|
| @@ -386,64 +374,51 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Loop) {
|
| RequestCounter main_counter;
|
| CountRequestFor(kPrefetchLoopPage, &main_counter);
|
|
|
| - std::unique_ptr<TestPrerender> test_prerender =
|
| - PrerenderTestURL(kPrefetchLoopPage, FINAL_STATUS_APP_TERMINATING, 1);
|
| + std::unique_ptr<TestPrerender> test_prerender = PrefetchFromFile(
|
| + kPrefetchLoopPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| 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();
|
| + // Navigate to about:blank to get the session storage namespace.
|
| + ui_test_utils::NavigateToURL(current_browser(), GURL(url::kAboutBlankURL));
|
| + content::SessionStorageNamespace* storage_namespace =
|
| + GetActiveWebContents()
|
| + ->GetController()
|
| + .GetDefaultSessionStorageNamespace();
|
| +
|
| + // Navigate to about:crash without an intermediate loader because chrome://
|
| + // URLs are ignored in renderers, and the test server has no support for them.
|
| + const gfx::Size kSize(640, 480);
|
| + std::unique_ptr<TestPrerender> test_prerender =
|
| + prerender_contents_factory()->ExpectPrerenderContents(
|
| + FINAL_STATUS_RENDERER_CRASHED);
|
| + std::unique_ptr<PrerenderHandle> prerender_handle(
|
| + GetPrerenderManager()->AddPrerenderFromExternalRequest(
|
| + GURL(content::kChromeUICrashURL), content::Referrer(),
|
| + storage_namespace, gfx::Rect(kSize)));
|
| + ASSERT_EQ(prerender_handle->contents(), test_prerender->contents());
|
| + test_prerender->WaitForStop();
|
| }
|
|
|
| // Checks that the prefetch of png correctly loads the png.
|
| -IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Png) {
|
| +// TODO(pasko): Add support for prefetching non-HTML documents and re-enable the
|
| +// test.
|
| +IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, DISABLED_Png) {
|
| RequestCounter counter;
|
| CountRequestFor(kPrefetchPng, &counter);
|
| - PrerenderTestURL(kPrefetchPng, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchPng, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| counter.WaitForCount(1);
|
| }
|
|
|
| // Checks that the prefetch of png correctly loads the jpeg.
|
| -IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, Jpeg) {
|
| +// TODO(pasko): Add support for prefetching non-HTML documents and re-enable the
|
| +// test.
|
| +IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest, DISABLED_Jpeg) {
|
| RequestCounter counter;
|
| CountRequestFor(kPrefetchJpeg, &counter);
|
| - PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_APP_TERMINATING, 1);
|
| + PrefetchFromFile(kPrefetchJpeg, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
|
| counter.WaitForCount(1);
|
| }
|
|
|
| @@ -463,7 +438,7 @@ IN_PROC_BROWSER_TEST_F(NoStatePrefetchBrowserTest,
|
| // 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);
|
| + PrefetchFromFile(kPrefetchPage, FINAL_STATUS_SAFE_BROWSING);
|
| }
|
|
|
| } // namespace prerender
|
|
|