| // Copyright (c) 2011 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/path_service.h" |
| #include "base/string_util.h" |
| #include "chrome/browser/prerender/prerender_contents.h" |
| #include "chrome/browser/prerender/prerender_manager.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/task_manager/task_manager.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/in_process_browser_test.h" |
| #include "chrome/test/ui_test_utils.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "grit/generated_resources.h" |
| #include "net/url_request/url_request_context.h" |
| #include "net/url_request/url_request_context_getter.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| #include <deque> |
| |
| // Prerender tests work as follows: |
| // |
| // A page with a prefetch link to the test page is loaded. Once prerendered, |
| // its Javascript function DidPrerenderPass() is called, which returns true if |
| // the page behaves as expected when prerendered. |
| // |
| // The prerendered page is then displayed on a tab. The Javascript function |
| // DidDisplayPass() is called, and returns true if the page behaved as it |
| // should while being displayed. |
| |
| namespace prerender { |
| |
| namespace { |
| |
| std::string CreateClientRedirect(const std::string& dest_url) { |
| const char* const kClientRedirectBase = "client-redirect?"; |
| return kClientRedirectBase + dest_url; |
| } |
| |
| std::string CreateServerRedirect(const std::string& dest_url) { |
| const char* const kServerRedirectBase = "server-redirect?"; |
| return kServerRedirectBase + dest_url; |
| } |
| |
| // PrerenderContents that stops the UI message loop on DidStopLoading(). |
| class TestPrerenderContents : public PrerenderContents { |
| public: |
| TestPrerenderContents( |
| PrerenderManager* prerender_manager, Profile* profile, const GURL& url, |
| const std::vector<GURL>& alias_urls, |
| const GURL& referrer, |
| int number_of_loads, |
| FinalStatus expected_final_status) |
| : PrerenderContents(prerender_manager, profile, url, alias_urls, |
| referrer), |
| number_of_loads_(0), |
| expected_number_of_loads_(number_of_loads), |
| expected_final_status_(expected_final_status) { |
| } |
| |
| virtual ~TestPrerenderContents() { |
| EXPECT_EQ(expected_final_status_, final_status()) << |
| " when testing URL " << prerender_url().path(); |
| // In the event we are destroyed, say if the prerender was canceled, quit |
| // the UI message loop. |
| MessageLoopForUI::current()->Quit(); |
| } |
| |
| virtual void DidStopLoading() { |
| PrerenderContents::DidStopLoading(); |
| ++number_of_loads_; |
| if (expected_final_status_ == FINAL_STATUS_USED && |
| number_of_loads_ >= expected_number_of_loads_) { |
| MessageLoopForUI::current()->Quit(); |
| } |
| } |
| |
| private: |
| int number_of_loads_; |
| int expected_number_of_loads_; |
| FinalStatus expected_final_status_; |
| }; |
| |
| // PrerenderManager that uses TestPrerenderContents. |
| class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory { |
| public: |
| WaitForLoadPrerenderContentsFactory( |
| int number_of_loads, |
| const std::deque<FinalStatus>& expected_final_status_queue) |
| : number_of_loads_(number_of_loads) { |
| expected_final_status_queue_.resize(expected_final_status_queue.size()); |
| std::copy(expected_final_status_queue.begin(), |
| expected_final_status_queue.end(), |
| expected_final_status_queue_.begin()); |
| LOG(INFO) << "Factory created with queue length " << |
| expected_final_status_queue_.size(); |
| } |
| |
| virtual PrerenderContents* CreatePrerenderContents( |
| PrerenderManager* prerender_manager, Profile* profile, const GURL& url, |
| const std::vector<GURL>& alias_urls, const GURL& referrer) { |
| CHECK(!expected_final_status_queue_.empty()) << |
| "Creating prerender contents for " << url.path() << |
| " with no expected final status"; |
| FinalStatus expected_final_status = expected_final_status_queue_.front(); |
| expected_final_status_queue_.pop_front(); |
| LOG(INFO) << "Creating prerender contents for " << url.path() << |
| " with expected final status " << expected_final_status; |
| LOG(INFO) << expected_final_status_queue_.size() << " left in the queue."; |
| return new TestPrerenderContents(prerender_manager, profile, url, |
| alias_urls, referrer, |
| number_of_loads_, |
| expected_final_status); |
| } |
| |
| private: |
| int number_of_loads_; |
| std::deque<FinalStatus> expected_final_status_queue_; |
| }; |
| |
| } // namespace |
| |
| class PrerenderBrowserTest : public InProcessBrowserTest { |
| public: |
| PrerenderBrowserTest() |
| : prc_factory_(NULL), |
| use_https_src_server_(false) { |
| EnableDOMAutomation(); |
| } |
| |
| virtual void SetUpCommandLine(CommandLine* command_line) { |
| command_line->AppendSwitchASCII(switches::kPrerender, |
| switches::kPrerenderSwitchValueEnabled); |
| #if defined(OS_MACOSX) |
| // The plugins directory isn't read by default on the Mac, so it needs to be |
| // explicitly registered. |
| FilePath app_dir; |
| PathService::Get(chrome::DIR_APP, &app_dir); |
| command_line->AppendSwitchPath( |
| switches::kExtraPluginDir, |
| app_dir.Append(FILE_PATH_LITERAL("plugins"))); |
| #endif |
| } |
| |
| // Overload for a single expected final status |
| void PrerenderTestURL(const std::string& html_file, |
| FinalStatus expected_final_status, |
| int total_navigations) { |
| std::deque<FinalStatus> expected_final_status_queue(1, |
| expected_final_status); |
| PrerenderTestURLImpl(html_file, |
| expected_final_status_queue, |
| total_navigations); |
| } |
| |
| void PrerenderTestURL( |
| const std::string& html_file, |
| const std::deque<FinalStatus>& expected_final_status_queue, |
| int total_navigations) { |
| PrerenderTestURLImpl(html_file, |
| expected_final_status_queue, |
| total_navigations); |
| } |
| |
| void NavigateToDestURL() const { |
| ui_test_utils::NavigateToURL(browser(), dest_url_); |
| |
| // Make sure the PrerenderContents found earlier was used or removed |
| EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) == NULL); |
| |
| // Check if page behaved as expected when actually displayed. |
| bool display_test_result = false; |
| ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| browser()->GetSelectedTabContents()->render_view_host(), L"", |
| L"window.domAutomationController.send(DidDisplayPass())", |
| &display_test_result)); |
| EXPECT_TRUE(display_test_result); |
| } |
| |
| bool UrlIsInPrerenderManager(const std::string& html_file) { |
| GURL dest_url = test_server()->GetURL(html_file); |
| return (prerender_manager()->FindEntry(dest_url) != NULL); |
| } |
| |
| bool UrlIsInPrerenderManager(const GURL& url) { |
| return (prerender_manager()->FindEntry(url) != NULL); |
| } |
| |
| bool UrlIsPendingInPrerenderManager(const std::string& html_file) { |
| GURL dest_url = test_server()->GetURL(html_file); |
| return (prerender_manager()->FindPendingEntry(dest_url) != NULL); |
| } |
| |
| void set_use_https_src(bool use_https_src_server) { |
| use_https_src_server_ = use_https_src_server; |
| } |
| |
| TaskManagerModel* model() const { |
| return TaskManager::GetInstance()->model(); |
| } |
| |
| void set_dest_url(const GURL& dest_url) { dest_url_ = dest_url; } |
| |
| private: |
| void PrerenderTestURLImpl( |
| const std::string& html_file, |
| const std::deque<FinalStatus>& expected_final_status_queue, |
| int total_navigations) { |
| ASSERT_TRUE(test_server()->Start()); |
| dest_url_ = test_server()->GetURL(html_file); |
| |
| std::vector<net::TestServer::StringPair> replacement_text; |
| replacement_text.push_back( |
| make_pair("REPLACE_WITH_PREFETCH_URL", dest_url_.spec())); |
| std::string replacement_path; |
| ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
| "files/prerender/prerender_loader.html", |
| replacement_text, |
| &replacement_path)); |
| |
| net::TestServer* src_server = test_server(); |
| scoped_ptr<net::TestServer> https_src_server; |
| if (use_https_src_server_) { |
| https_src_server.reset( |
| new net::TestServer(net::TestServer::TYPE_HTTPS, |
| FilePath(FILE_PATH_LITERAL("chrome/test/data")))); |
| ASSERT_TRUE(https_src_server->Start()); |
| src_server = https_src_server.get(); |
| } |
| GURL src_url = src_server->GetURL(replacement_path); |
| |
| // This is needed to exit the event loop once the prerendered page has |
| // stopped loading or was cancelled. |
| ASSERT_TRUE(prerender_manager()); |
| prerender_manager()->rate_limit_enabled_ = false; |
| ASSERT_TRUE(prc_factory_ == NULL); |
| prc_factory_ = |
| new WaitForLoadPrerenderContentsFactory(total_navigations, |
| expected_final_status_queue); |
| prerender_manager()->SetPrerenderContentsFactory(prc_factory_); |
| FinalStatus expected_final_status = expected_final_status_queue.front(); |
| |
| // ui_test_utils::NavigateToURL uses its own observer and message loop. |
| // Since the test needs to wait until the prerendered page has stopped |
| // loading, rathather than the page directly navigated to, need to |
| // handle browser navigation directly. |
| browser()->OpenURL(src_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
| |
| TestPrerenderContents* prerender_contents = NULL; |
| ui_test_utils::RunMessageLoop(); |
| |
| prerender_contents = |
| static_cast<TestPrerenderContents*>( |
| prerender_manager()->FindEntry(dest_url_)); |
| |
| switch (expected_final_status) { |
| case FINAL_STATUS_USED: { |
| ASSERT_TRUE(prerender_contents != NULL); |
| |
| // Check if page behaves as expected while in prerendered state. |
| bool prerender_test_result = false; |
| ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| prerender_contents->render_view_host(), L"", |
| L"window.domAutomationController.send(DidPrerenderPass())", |
| &prerender_test_result)); |
| EXPECT_TRUE(prerender_test_result); |
| break; |
| } |
| default: |
| // In the failure case, we should have removed dest_url_ from the |
| // prerender_manager. |
| EXPECT_TRUE(prerender_contents == NULL); |
| break; |
| } |
| } |
| |
| PrerenderManager* prerender_manager() const { |
| Profile* profile = browser()->GetSelectedTabContents()->profile(); |
| PrerenderManager* prerender_manager = profile->GetPrerenderManager(); |
| return prerender_manager; |
| } |
| |
| WaitForLoadPrerenderContentsFactory* prc_factory_; |
| GURL dest_url_; |
| bool use_https_src_server_; |
| }; |
| |
| // Checks that a page is correctly prerendered in the case of a |
| // <link rel=prefetch> tag and then loaded into a tab in response to a |
| // navigation. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
| PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that the prerendering of a page is canceled correctly when a |
| // Javascript alert is called. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { |
| PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", |
| FINAL_STATUS_JAVASCRIPT_ALERT, |
| 1); |
| } |
| |
| // Checks that the prerendering of a page is canceled correctly when a |
| // Javascript alert is called. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { |
| PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", |
| FINAL_STATUS_JAVASCRIPT_ALERT, |
| 1); |
| } |
| |
| // Checks that plugins are not loaded while a page is being preloaded, but |
| // are loaded when the page is displayed. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDelayLoadPlugin) { |
| PrerenderTestURL("files/prerender/plugin_delay_load.html", |
| FINAL_STATUS_USED, |
| 1); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that plugins in an iframe are not loaded while a page is |
| // being preloaded, but are loaded when the page is displayed. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIframeDelayLoadPlugin) { |
| PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", |
| FINAL_STATUS_USED, |
| 1); |
| NavigateToDestURL(); |
| } |
| |
| // Renders a page that contains a prerender link to a page that contains an |
| // iframe with a source that requires http authentication. This should not |
| // prerender successfully. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { |
| PrerenderTestURL("files/prerender/prerender_http_auth_container.html", |
| FINAL_STATUS_AUTH_NEEDED, |
| 1); |
| } |
| |
| // Checks that client-issued redirects work with prerendering. |
| // This version navigates to the page which issues the redirection, rather |
| // than the final destination page. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| PrerenderClientRedirectNavigateToFirst) { |
| PrerenderTestURL( |
| CreateClientRedirect("files/prerender/prerender_page.html"), |
| FINAL_STATUS_USED, |
| 2); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that client-issued redirects work with prerendering. |
| // This version navigates to the final destination page, rather than the |
| // page which does the redirection. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| PrerenderClientRedirectNavigateToSecond) { |
| PrerenderTestURL( |
| CreateClientRedirect("files/prerender/prerender_page.html"), |
| FINAL_STATUS_USED, |
| 2); |
| set_dest_url(test_server()->GetURL("files/prerender/prerender_page.html")); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that client-issued redirects to an https page will cancel prerenders. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClientRedirectToHttps) { |
| net::TestServer https_server(net::TestServer::TYPE_HTTPS, |
| FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| ASSERT_TRUE(https_server.Start()); |
| GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
| PrerenderTestURL(CreateClientRedirect(https_url.spec()), |
| FINAL_STATUS_HTTPS, |
| 1); |
| } |
| |
| // Checks that client-issued redirects within an iframe in a prerendered |
| // page will not count as an "alias" for the prerendered page. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClientRedirectInIframe) { |
| std::string redirect_path = CreateClientRedirect( |
| "/files/prerender/prerender_embedded_content.html"); |
| std::vector<net::TestServer::StringPair> replacement_text; |
| replacement_text.push_back( |
| std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); |
| std::string replacement_path; |
| ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
| "files/prerender/prerender_with_iframe.html", |
| replacement_text, |
| &replacement_path)); |
| PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); |
| EXPECT_FALSE(UrlIsInPrerenderManager( |
| "files/prerender/prerender_embedded_content.html")); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that client-issued redirects within an iframe in a prerendered |
| // page to an https page will not cancel the prerender, nor will it |
| // count as an "alias" for the prerendered page. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| PrerenderClientRedirectToHttpsInIframe) { |
| net::TestServer https_server(net::TestServer::TYPE_HTTPS, |
| FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| ASSERT_TRUE(https_server.Start()); |
| GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
| std::string redirect_path = CreateClientRedirect(https_url.spec()); |
| std::vector<net::TestServer::StringPair> replacement_text; |
| replacement_text.push_back( |
| std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); |
| std::string replacement_path; |
| ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
| "files/prerender/prerender_with_iframe.html", |
| replacement_text, |
| &replacement_path)); |
| PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); |
| EXPECT_FALSE(UrlIsInPrerenderManager(https_url)); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that server-issued redirects work with prerendering. |
| // This version navigates to the page which issues the redirection, rather |
| // than the final destination page. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| PrerenderServerRedirectNavigateToFirst) { |
| PrerenderTestURL( |
| CreateServerRedirect("files/prerender/prerender_page.html"), |
| FINAL_STATUS_USED, |
| 1); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that server-issued redirects work with prerendering. |
| // This version navigates to the final destination page, rather than the |
| // page which does the redirection. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| PrerenderServerRedirectNavigateToSecond) { |
| std::string redirect_path; |
| PrerenderTestURL( |
| CreateServerRedirect("files/prerender/prerender_page.html"), |
| FINAL_STATUS_USED, |
| 1); |
| set_dest_url(test_server()->GetURL("files/prerender/prerender_page.html")); |
| NavigateToDestURL(); |
| } |
| |
| // TODO(cbentzel): Add server-redirect-to-https test. http://crbug.com/79182 |
| |
| // Checks that server-issued redirects within an iframe in a prerendered |
| // page will not count as an "alias" for the prerendered page. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { |
| std::string redirect_path = CreateServerRedirect( |
| "/files/prerender/prerender_embedded_content.html"); |
| std::vector<net::TestServer::StringPair> replacement_text; |
| replacement_text.push_back( |
| std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); |
| std::string replacement_path; |
| ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
| "files/prerender/prerender_with_iframe.html", |
| replacement_text, |
| &replacement_path)); |
| PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); |
| EXPECT_FALSE(UrlIsInPrerenderManager( |
| "files/prerender/prerender_embedded_content.html")); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that server-issued redirects within an iframe in a prerendered |
| // page to an https page will not cancel the prerender, nor will it |
| // count as an "alias" for the prerendered page. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| PrerenderServerRedirectToHttpsInIframe) { |
| net::TestServer https_server(net::TestServer::TYPE_HTTPS, |
| FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| ASSERT_TRUE(https_server.Start()); |
| GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
| std::string redirect_path = CreateServerRedirect(https_url.spec()); |
| std::vector<net::TestServer::StringPair> replacement_text; |
| replacement_text.push_back( |
| std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); |
| std::string replacement_path; |
| ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
| "files/prerender/prerender_with_iframe.html", |
| replacement_text, |
| &replacement_path)); |
| PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); |
| EXPECT_FALSE(UrlIsInPrerenderManager(https_url)); |
| NavigateToDestURL(); |
| } |
| |
| // Prerenders a page that contains an automatic download triggered through an |
| // iframe. This should not prerender successfully. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIFrame) { |
| PrerenderTestURL("files/prerender/prerender_download_iframe.html", |
| FINAL_STATUS_DOWNLOAD, |
| 1); |
| } |
| |
| // Prerenders a page that contains an automatic download triggered through |
| // Javascript changing the window.location. This should not prerender |
| // successfully. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { |
| PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), |
| FINAL_STATUS_DOWNLOAD, |
| 1); |
| } |
| |
| // Prerenders a page that contains an automatic download triggered through a |
| // client-issued redirect. This should not prerender successfully. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { |
| PrerenderTestURL("files/prerender/prerender_download_refresh.html", |
| FINAL_STATUS_DOWNLOAD, |
| 1); |
| } |
| |
| // Checks that the referrer is set when prerendering. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { |
| PrerenderTestURL("files/prerender/prerender_referrer.html", |
| FINAL_STATUS_USED, |
| 1); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that the referrer is not set when prerendering and the source page is |
| // HTTPS. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoSSLReferrer) { |
| set_use_https_src(true); |
| PrerenderTestURL("files/prerender/prerender_no_referrer.html", |
| FINAL_STATUS_USED, |
| 1); |
| NavigateToDestURL(); |
| } |
| |
| // Checks that popups on a prerendered page cause cancellation. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { |
| PrerenderTestURL("files/prerender/prerender_popup.html", |
| FINAL_STATUS_CREATE_NEW_WINDOW, |
| 1); |
| } |
| |
| |
| |
| // Checks that renderers using excessive memory will be terminated. |
| // Disabled, http://crbug.com/77870. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| DISABLED_PrerenderExcessiveMemory) { |
| PrerenderTestURL("files/prerender/prerender_excessive_memory.html", |
| FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, |
| 1); |
| } |
| |
| // Checks that we don't prerender in an infinite loop. |
| // Disabled, http://crbug.com/77870. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { |
| const char* const kHtmlFileA = "prerender_infinite_a.html"; |
| const char* const kHtmlFileB = "prerender_infinite_b.html"; |
| |
| std::deque<FinalStatus> expected_final_status_queue; |
| expected_final_status_queue.push_back(FINAL_STATUS_USED); |
| expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); |
| |
| PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); |
| |
| // Next url should be in pending list but not an active entry. |
| EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
| EXPECT_TRUE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
| |
| NavigateToDestURL(); |
| |
| // Make sure the PrerenderContents for the next url is now in the manager |
| // and not pending. |
| EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); |
| EXPECT_FALSE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
| } |
| |
| // Checks that we don't prerender in an infinite loop and multiple links are |
| // handled correctly. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| FLAKY_PrerenderInfiniteLoopMultiple) { |
| const char* const kHtmlFileA = |
| "files/prerender/prerender_infinite_a_multiple.html"; |
| const char* const kHtmlFileB = |
| "files/prerender/prerender_infinite_b_multiple.html"; |
| const char* const kHtmlFileC = |
| "files/prerender/prerender_infinite_c_multiple.html"; |
| |
| // We need to set the final status to expect here before starting any |
| // prerenders. We set them on a queue so whichever we see first is expected to |
| // be evicted, and the second should stick around until we exit. |
| std::deque<FinalStatus> expected_final_status_queue; |
| expected_final_status_queue.push_back(FINAL_STATUS_USED); |
| expected_final_status_queue.push_back(FINAL_STATUS_EVICTED); |
| expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); |
| |
| PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); |
| |
| // Next url should be in pending list but not an active entry. |
| EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
| EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); |
| EXPECT_TRUE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
| EXPECT_TRUE(UrlIsPendingInPrerenderManager(kHtmlFileC)); |
| |
| NavigateToDestURL(); |
| |
| // Make sure the PrerenderContents for the next urls are now in the manager |
| // and not pending. One and only one of the URLs (the last seen) should be the |
| // active entry. |
| bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); |
| bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); |
| EXPECT_TRUE((url_b_is_active_prerender || url_c_is_active_prerender) && |
| !(url_b_is_active_prerender && url_c_is_active_prerender)); |
| EXPECT_FALSE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
| EXPECT_FALSE(UrlIsPendingInPrerenderManager(kHtmlFileC)); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, TaskManager) { |
| // Show the task manager. This populates the model. |
| browser()->window()->ShowTaskManager(); |
| |
| // Start with two resources. |
| EXPECT_EQ(2, model()->ResourceCount()); |
| PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| |
| // The prerender makes three. |
| EXPECT_EQ(3, model()->ResourceCount()); |
| |
| // It shouldn't have a TabContents associated with it. |
| ASSERT_TRUE(model()->GetResourceTabContents(1) == NULL); |
| |
| // The prefix should be "Prerender:" |
| string16 prefix = |
| l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, |
| string16()); |
| ASSERT_TRUE(StartsWith(model()->GetResourceTitle(1), prefix, true)); |
| |
| NavigateToDestURL(); |
| |
| // Prerender task should be killed and removed from the Task Manager. |
| EXPECT_EQ(2, model()->ResourceCount()); |
| } |
| |
| // Checks that prerenderers will terminate when an audio tag is encountered. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Audio) { |
| PrerenderTestURL("files/prerender/prerender_html5_audio.html", |
| FINAL_STATUS_HTML5_MEDIA, |
| 1); |
| } |
| |
| // Checks that prerenderers will terminate when a video tag is encountered. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Video) { |
| PrerenderTestURL("files/prerender/prerender_html5_video.html", |
| FINAL_STATUS_HTML5_MEDIA, |
| 1); |
| } |
| |
| // Checks that prerenderers will terminate when a video tag is inserted via |
| // javascript. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoJs) { |
| PrerenderTestURL("files/prerender/prerender_html5_video_script.html", |
| FINAL_STATUS_HTML5_MEDIA, |
| 1); |
| } |
| |
| } // namespace prerender |