prerender_browsertest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/files/file_path.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/ref_counted_memory.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_vector.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager_factory.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager_browsertest_util.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/uma_histogram_helper.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/site_instance.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h" 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/escape.h" 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/cert/x509_certificate.h" 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/ssl/client_cert_store.h" 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_job.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsClientHost; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::TestNavigationObserver; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::WebContentsObserver; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerender tests work as follows: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A page with a prefetch link to the test page is loaded. Once prerendered, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its Javascript function DidPrerenderPass() is called, which returns true if 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page behaves as expected when prerendered. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is then displayed on a tab. The Javascript function 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidDisplayPass() is called, and returns true if the page behaved as it 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should while being displayed. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants used in the test HTML files. 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kReadyTitle = "READY"; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kPassTitle = "PASS"; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateClientRedirect(const std::string& dest_url) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kClientRedirectBase = "client-redirect?"; 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateServerRedirect(const std::string& dest_url) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kServerRedirectBase = "server-redirect?"; 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kServerRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears the specified data using BrowsingDataRemover. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearBrowsingData(Browser* browser, int remove_mask) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(browser->profile()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover deletes itself. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns true if the prerender is expected to abort on its own, before 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// attempting to swap it. 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShouldAbortPrerenderBeforeSwap(FinalStatus status) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_USED: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_WINDOW_OPENER: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_APP_TERMINATING: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll crash the renderer after it's loaded. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_RENDERER_CRASHED: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CANCELLED: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_DEVTOOLS_ATTACHED: 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case FINAL_STATUS_PAGE_BEING_CAPTURED: 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case FINAL_STATUS_NAVIGATION_UNCOMMITTED: 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case FINAL_STATUS_WOULD_HAVE_BEEN_USED: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Convenience function to wait for a title. Handles the case when the 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebContents already has the expected title. 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WaitForASCIITitle(WebContents* web_contents, 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* expected_title_ascii) { 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 expected_title = base::ASCIIToUTF16(expected_title_ascii); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_contents->GetTitle() == expected_title) 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for the destruction of a RenderProcessHost's IPC channel. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to make sure the PrerenderLinkManager's OnChannelClosed function has 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been called, before checking its state. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelDestructionWatcher { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ChannelDestructionWatcher() : channel_destroyed_(false) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ChannelDestructionWatcher() { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WatchChannel(content::RenderProcessHost* host) { 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new DestructionMessageFilter(this)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForChannelClose() { 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Run(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(channel_destroyed_); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When destroyed, calls ChannelDestructionWatcher::OnChannelDestroyed. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores all messages. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionMessageFilter : public content::BrowserMessageFilter { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter(0), 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) watcher_(watcher) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionMessageFilter() { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChannelDestructionWatcher::OnChannelDestroyed, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(watcher_))); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* message_was_ok) OVERRIDE { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher* watcher_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionMessageFilter); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnChannelDestroyed() { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(channel_destroyed_); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_destroyed_ = true; 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Quit(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool channel_destroyed_; 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop run_loop_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A navigation observer to wait on either a new load or a swap of a 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebContents. On swap, if the new WebContents is still loading, wait for that 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// load to complete as well. Note that the load must begin after the observer is 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// attached. 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NavigationOrSwapObserver : public WebContentsObserver, 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public TabStripModelObserver { 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for either a new load or a swap of |tab_strip_model|'s active 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WebContents. 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents) 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(web_contents), 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_(false), 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(1) { 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for either |number_of_loads| loads or a swap of |tab_strip_model|'s 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // active WebContents. 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents, 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(web_contents), 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_(false), 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(number_of_loads) { 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~NavigationOrSwapObserver() { 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->RemoveObserver(this); 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Wait() { 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Run(); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WebContentsObserver implementation: 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidStartLoading(RenderViewHost* render_view_host) OVERRIDE { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_ = true; 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!did_start_loading_) 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_--; 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_loads_ == 0) 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Quit(); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TabStripModelObserver implementation: 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* old_contents, 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* new_contents, 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int index) OVERRIDE { 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (old_contents != web_contents()) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Switch to observing the new WebContents. 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Observe(new_contents); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_contents->IsLoading()) { 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the new WebContents is still loading, wait for it to complete. Only 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // one load post-swap is supported. 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_ = true; 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_ = 1; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Quit(); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabStripModel* tab_strip_model_; 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_start_loading_; 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads_; 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop loop_; 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Waits for a new tab to open and a navigation or swap in it. 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NewTabNavigationOrSwapObserver { 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabNavigationOrSwapObserver() 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : new_tab_observer_( 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_TAB_ADDED, 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&NewTabNavigationOrSwapObserver::OnTabAdded, 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Watch for NOTIFICATION_TAB_ADDED. Add a callback so that the 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NavigationOrSwapObserver can be attached synchronously and no events are 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // missed. 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Wait() { 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_tab_observer_.Wait(); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer_->Wait(); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool OnTabAdded(const content::NotificationSource& source, 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationDetails& details) { 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (swap_observer_) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* new_tab = content::Details<WebContents>(details).ptr(); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the TabStripModel. Assume this is attached to a Browser. 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabStripModel* tab_strip_model = 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<Browser*>(new_tab->GetDelegate())->tab_strip_model(); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer_.reset(new NavigationOrSwapObserver(tab_strip_model, 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_tab)); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver new_tab_observer_; 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<NavigationOrSwapObserver> swap_observer_; 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderContents that stops the UI message loop on DidStopLoading(). 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrerenderContents : public PrerenderContents { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus expected_final_status) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PrerenderContents(prerender_manager, profile, url, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, origin, PrerenderManager::kNoExperiment), 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status), 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_(NULL), 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_(false), 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_(false), 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_shown_(expected_final_status == FINAL_STATUS_USED), 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_final_checks_(false) { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestPrerenderContents() { 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (skip_final_checks_) 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_MAX) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MATCH_COMPLETE_REPLACEMENT, match_complete_status()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()) << 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " when testing URL " << prerender_url().path() << 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (Expected: " << NameFromFinalStatus(expected_final_status_) << 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerendering RenderViewHosts should be hidden before the first 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so this should be happen for every PrerenderContents for 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which a RenderViewHost is created, regardless of whether or not it's 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_render_view_host_) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(was_hidden_); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A used PrerenderContents will only be destroyed when we swap out 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents, at the end of a navigation caused by a call to 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigateToURLImpl(). 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_status() == FINAL_STATUS_USED) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_render_view_host_); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_be_shown_, was_shown_); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On quit, it's possible to end up here when render processes are closed 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the PrerenderManager is destroyed. As a result, it's possible to 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on quit. 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's also possible for this to be called after we've been notified of 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app termination, but before we've been deleted, which is why the second 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check is needed. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING && 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status() != expected_final_status_) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderContents::RenderProcessGone(status); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual bool CheckURL(const GURL& url) OVERRIDE { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the PrerenderRendererCrash test. 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.spec() != content::kChromeUICrashURL) 4190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PrerenderContents::CheckURL(url); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tests that open the prerender in a new background tab, the RenderView 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not have been made visible when the PrerenderContents is destroyed 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though it is used. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_be_shown(bool value) { should_be_shown_ = value; } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For tests which do not know whether the prerender will be used. 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_skip_final_checks(bool value) { skip_final_checks_ = value; } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host) OVERRIDE { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to make sure the RenderViewHost is hidden and, if used, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequently shown. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar().Add( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(new_render_view_host)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_ = new_render_view_host; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::OnRenderViewHostCreated(new_render_view_host); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_render_view_host_, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(source).ptr()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = *content::Details<bool>(details).ptr(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_visible) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_ = true; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_visible && was_hidden_) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once hidden, a prerendered RenderViewHost should only be shown after 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being removed from the PrerenderContents for display. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetRenderViewHost()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_ = true; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Observe(type, source, details); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RenderViewHost created for the prerender, if any. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host_; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is hidden. 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_hidden_; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is shown, after having been 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hidden. 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_shown_; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected final value of was_shown_. Defaults to true for 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FINAL_STATUS_USED, and false otherwise. 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_shown_; 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If true, |expected_final_status_| and other shutdown checks are skipped. 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool skip_final_checks_; 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A handle to a TestPrerenderContents whose lifetime is under the caller's 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// control. A PrerenderContents may be destroyed at any point. This allows 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracking the final status, etc. 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestPrerender : public PrerenderContents::Observer, 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public base::SupportsWeakPtr<TestPrerender> { 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerender() 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : contents_(NULL), 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(0), 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_(0) { 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestPrerender() { 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (contents_) 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_->RemoveObserver(this); 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents() const { return contents_; } 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads() const { return number_of_loads_; } 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForCreate() { create_loop_.Run(); } 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForStart() { start_loop_.Run(); } 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForStop() { stop_loop_.Run(); } 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for |number_of_loads()| to be at least |expected_number_of_loads| OR 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for the prerender to stop running (just to avoid a timeout if the prerender 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // dies). Note: this does not assert equality on the number of loads; the 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // caller must do it instead. 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForLoads(int expected_number_of_loads) { 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!load_waiter_); 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!expected_number_of_loads_); 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_loads_ < expected_number_of_loads) { 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_.reset(new base::RunLoop); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_ = expected_number_of_loads; 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Run(); 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_.reset(); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_ = 0; 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LE(expected_number_of_loads, number_of_loads_); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnPrerenderCreated(TestPrerenderContents* contents) { 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!contents_); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_ = contents; 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_->AddObserver(this); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) create_loop_.Quit(); 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PrerenderContents::Observer implementation: 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStart(PrerenderContents* contents) OVERRIDE { 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_loop_.Quit(); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderContents* contents) OVERRIDE { 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_++; 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (load_waiter_ && number_of_loads_ >= expected_number_of_loads_) 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Quit(); 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStop(PrerenderContents* contents) OVERRIDE { 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(contents_); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_ = NULL; 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stop_loop_.Quit(); 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If there is a WaitForLoads call and it has yet to see the expected number 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // of loads, stop the loop so the test fails instead of timing out. 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (load_waiter_) 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Quit(); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE { 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents_; 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads_; 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads_; 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> load_waiter_; 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop create_loop_; 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop start_loop_; 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop stop_loop_; 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestPrerender); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderManager that uses TestPrerenderContents. 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestPrerenderContentsFactory : public PrerenderContents::Factory { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContentsFactory() {} 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestPrerenderContentsFactory() { 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(expected_contents_queue_.empty()); 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerenderContents(FinalStatus final_status) { 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> handle(new TestPrerender()); 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_contents_queue_.push_back( 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents(final_status, handle->AsWeakPtr())); 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return handle.Pass(); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) OVERRIDE { 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents expected; 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!expected_contents_queue_.empty()) { 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected = expected_contents_queue_.front(); 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_contents_queue_.pop_front(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Creating prerender contents for " << url.path() << 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " with expected final status " << expected.final_status; 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << expected_contents_queue_.size() << " left in the queue."; 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents = 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new TestPrerenderContents(prerender_manager, 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile, url, referrer, origin, 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.final_status); 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (expected.handle) 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.handle->OnPrerenderCreated(contents); 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return contents; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct ExpectedContents { 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents() : final_status(FINAL_STATUS_MAX) { } 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents(FinalStatus final_status, 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<TestPrerender>& handle) 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : final_status(final_status), 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handle(handle) { 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus final_status; 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<TestPrerender> handle; 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::deque<ExpectedContents> expected_contents_queue_; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager implementation that returns a fixed result for 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a given URL. 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SafeBrowsingDatabaseManager(service), 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) threat_type_(SB_THREAT_TYPE_SAFE) { } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given url is safe or not. If we 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the url is safe, CheckUrl returns true. 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it returns false, and "client" is called asynchronously with the 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result when it is ready. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true, indicating a SAFE result, unless the URL is the fixed URL 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the user, and the user-specified result is not SAFE 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in which that result will be communicated back via a call into the 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client, and false will be returned). 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides SafeBrowsingService::CheckBrowseUrl. 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gurl != url_ || threat_type_ == SB_THREAT_TYPE_SAFE) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone, 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, gurl, client)); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetThreatTypeForUrl(const GURL& url, SBThreatType threat_type) { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ = url; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingDatabaseManager() {} 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCheckBrowseURLDone(const GURL& gurl, Client* client) { 66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<SBThreatType> expected_threats; 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check( 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL>(1, gurl), 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBFullHash>(), 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) safe_browsing_util::MALWARE, 67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_check.url_results[0] = threat_type_; 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->OnSafeBrowsingResult(sb_check); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService { 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingService() { } 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returned pointer has the same lifespan as the database_manager_ refcounted 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager() { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingService() { } 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE { 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager_; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingServiceFactory() : 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_(NULL) { } 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingServiceFactory() { } 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_ = new FakeSafeBrowsingService(); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service() const { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service_; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDevToolsClientHost : public DevToolsClientHost { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost() {} 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDevToolsClientHost() {} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InspectedContentsClosing() OVERRIDE {} 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DispatchOnInspectorFrontend(const std::string& msg) OVERRIDE {} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReplacedWithAnotherClient() OVERRIDE {} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// URLRequestJob (and associated handler) which hangs. 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HangingURLRequestJob : public net::URLRequestJob { 750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HangingURLRequestJob(net::URLRequest* request, 752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) 753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : net::URLRequestJob(request, network_delegate) { 754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Start() OVERRIDE {} 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~HangingURLRequestJob() {} 760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HangingFirstRequestProtocolHandler 763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HangingFirstRequestProtocolHandler(const base::FilePath& file, 7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback) 7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : file_(file), 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_(callback), 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) first_run_(true) { 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~HangingFirstRequestProtocolHandler() {} 772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequest* request, 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (first_run_) { 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) first_run_ = false; 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::UI, FROM_HERE, callback_); 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new HangingURLRequestJob(request, network_delegate); 7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new content::URLRequestMockHTTPJob(request, network_delegate, file_); 783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_; 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback_; 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mutable bool first_run_; 789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes |url| never respond on the first load, and then with the contents of 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |file| afterwards. When the first load has been scheduled, runs |callback| on 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the UI thread. 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateHangingFirstRequestProtocolHandlerOnIO(const GURL& url, 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file, 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback) { 797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 798868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new HangingFirstRequestProtocolHandler(file, callback)); 800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url, never_respond_handler.Pass()); 802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Wrapper over URLRequestMockHTTPJob that exposes extra callbacks. 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockHTTPJob : public content::URLRequestMockHTTPJob { 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHTTPJob(net::URLRequest* request, 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::NetworkDelegate* delegate, 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file) 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : content::URLRequestMockHTTPJob(request, delegate, file) { 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_start_callback(const base::Closure& start_callback) { 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_callback_ = start_callback; 8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Start() OVERRIDE { 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!start_callback_.is_null()) 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_callback_.Run(); 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::URLRequestMockHTTPJob::Start(); 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MockHTTPJob() {} 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure start_callback_; 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Dummy counter class to live on the UI thread for counting requests. 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RequestCounter : public base::SupportsWeakPtr<RequestCounter> { 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter() : count_(0), expected_count_(-1) {} 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int count() const { return count_; } 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestStarted() { 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) count_++; 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (loop_ && count_ == expected_count_) 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_->Quit(); 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForCount(int expected_count) { 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(!loop_); 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(-1, expected_count_); 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (count_ < expected_count) { 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_count_ = expected_count; 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.reset(new base::RunLoop); 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_->Run(); 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_count_ = -1; 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.reset(); 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_count, count_); 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int count_; 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_count_; 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> loop_; 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Protocol handler which counts the number of requests that start. 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CountingProtocolHandler 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountingProtocolHandler(const base::FilePath& file, 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : file_(file), 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) counter_(counter), 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_(this) { 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~CountingProtocolHandler() {} 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequest* request, 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHTTPJob* job = new MockHTTPJob(request, network_delegate, file_); 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) job->set_start_callback(base::Bind(&CountingProtocolHandler::RequestStarted, 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_.GetWeakPtr())); 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return job; 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestStarted() { 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RequestCounter::RequestStarted, counter_)); 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_; 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<RequestCounter> counter_; 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mutable base::WeakPtrFactory<CountingProtocolHandler> weak_factory_; 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes |url| respond to requests with the contents of |file|, counting the 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// number that start in |counter|. 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateCountingProtocolHandlerOnIO( 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file, 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) { 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> protocol_handler( 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new CountingProtocolHandler(file, counter)); 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, protocol_handler.Pass()); 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Makes |url| respond to requests with the contents of |file|. 9074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CreateMockProtocolHandlerOnIO(const GURL& url, 9084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& file) { 9094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 9104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 9114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) url, content::URLRequestMockHTTPJob::CreateProtocolHandlerForSingleFile( 9124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file)); 9134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 91568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A ContentBrowserClient that cancels all prerenderers on OpenURL. 91668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class TestContentBrowserClient : public chrome::ChromeContentBrowserClient { 91768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 91868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestContentBrowserClient() {} 91968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~TestContentBrowserClient() {} 92068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 92168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 92268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool ShouldAllowOpenURL(content::SiteInstance* site_instance, 92368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& url) OVERRIDE { 92468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderManagerFactory::GetForProfile( 92568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext())) 92668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ->CancelAllPrerenders(); 92768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return chrome::ChromeContentBrowserClient::ShouldAllowOpenURL(site_instance, 92868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) url); 92968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 93068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 93168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 93268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient); 93368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A ContentBrowserClient that forces cross-process navigations. 9364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SwapProcessesContentBrowserClient 9374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public chrome::ChromeContentBrowserClient { 9384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 9394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient() {} 9404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~SwapProcessesContentBrowserClient() {} 9414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 9434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool ShouldSwapProcessesForRedirect( 9444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ResourceContext* resource_context, 9454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& current_url, 9464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& new_url) OVERRIDE { 9474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 9484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 9514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient); 9524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 9534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// An ExternalProtocolHandler that blocks everything and asserts it never is 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// called. 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NeverRunsExternalProtocolHandlerDelegate 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public ExternalProtocolHandler::Delegate { 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ExternalProtocolHandler::Delegate implementation. 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker( 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShellIntegration::DefaultWebClientObserver* observer, 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& protocol) OVERRIDE { 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This will crash, but it shouldn't get this far with BlockState::BLOCK 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // anyway. 9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ExternalProtocolHandler::BlockState GetBlockState( 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& scheme) OVERRIDE { 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Block everything and fail the test. 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ADD_FAILURE(); 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExternalProtocolHandler::BLOCK; 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BlockRequest() OVERRIDE { } 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void RunExternalProtocolDialog(const GURL& url, 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_process_host_id, 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int routing_id) OVERRIDE { 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void LaunchUrlWithoutSecurityCheck(const GURL& url) OVERRIDE { 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void FinishedProcessingCheck() OVERRIDE { 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetTestPath(const std::string& file_name) { 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui_test_utils::GetTestFilePath( 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("prerender")), 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath().AppendASCII(file_name)); 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Many of these tests are flaky. See http://crbug.com/249179 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTest : virtual public InProcessBrowserTest { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest() 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : autostart_test_server_(true), 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents_factory_(NULL), 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_(true), 10064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_(true), 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_("files/prerender/prerender_loader.html"), 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_(NULL) {} 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTest() {} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const { 10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1016ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return web_contents->GetController().GetDefaultSessionStorageNamespace(); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 1026f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 1027f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SafeBrowsingService::RegisterFactory(NULL); 1028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 1029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kPrerenderMode, 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValueEnabled); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugins directory isn't read by default on the Mac, so it needs to be 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly registered. 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_dir; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP, &app_dir); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath( 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kExtraPluginDir, 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_dir.Append(FILE_PATH_LITERAL("plugins"))); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (autostart_test_server_) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChromeResourceDispatcherHostDelegate:: 10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetExternalProtocolHandlerDelegateForTesting( 10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &external_protocol_handler_delegate_); 10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager* prerender_manager = GetPrerenderManager(); 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender_manager); 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager->mutable_config().rate_limit_enabled = false; 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender_contents_factory_ == NULL); 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_factory_ = new TestPrerenderContentsFactory; 10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager->SetPrerenderContentsFactory(prerender_contents_factory_); 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Convenience function to get the currently active WebContents in 10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // current_browser(). 10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* GetActiveWebContents() const { 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_browser()->tab_strip_model()->GetActiveWebContents(); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overload for a single expected final status 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus expected_final_status, 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads) { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PrerenderTestURL(url, 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status, 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURL( 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PrerenderTestURLImpl(url, 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue( 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, expected_final_status); 10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<TestPrerender*> prerenders; 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURLImpl(url, 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads).release(&prerenders); 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(1u, prerenders.size()); 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<TestPrerender>(prerenders[0]); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURL() const { 1106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, true); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the url in a new tab, with no opener. 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURLWithDisposition( 1111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 11138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams( 11148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams(dest_url_, Referrer(), disposition, 11158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expect_swap_to_succeed); 11178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURL(const std::string& dest_html_file) const { 11208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithDisposition(dest_html_file, CURRENT_TAB, true); 11218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLWithDisposition(const std::string& dest_html_file, 11248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WindowOpenDisposition disposition, 11258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expect_swap_to_succeed) const { 11268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL dest_url = test_server()->GetURL(dest_html_file); 11270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateToURLWithDisposition(dest_url, disposition, expect_swap_to_succeed); 11280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 11290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void NavigateToURLWithDisposition(const GURL& dest_url, 11310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) WindowOpenDisposition disposition, 11320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool expect_swap_to_succeed) const { 11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams( 11348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams(dest_url, Referrer(), disposition, 11358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expect_swap_to_succeed); 11378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLWithParams(const content::OpenURLParams& params, 11408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expect_swap_to_succeed) const { 11418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLImpl(params, expect_swap_to_succeed); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClick() const { 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(dest_url_); 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenURLViaClick(const GURL& url) const { 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("Click", url, GURL(), false); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickTarget() const { 11535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ClickTarget", dest_url_, GURL(), true); 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenDestURLViaClickPing(const GURL& ping_url) const { 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ClickPing", dest_url_, ping_url, false); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewWindow() const { 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ShiftClick", dest_url_, GURL(), true); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewForegroundTab() const { 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("MetaShiftClick", dest_url_, GURL(), true); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("CtrlShiftClick", dest_url_, GURL(), true); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewBackgroundTab() const { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("MetaClick", dest_url_, GURL(), true); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("CtrlClick", dest_url_, GURL(), true); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaWindowOpen() const { 11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("WindowOpen", dest_url_, GURL(), true); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveLinkElement(int i) const { 11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetRenderViewHost()->ExecuteJavascriptInWebFrame( 1186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClickToNextPageAfterPrerender() { 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host = 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 1195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("ClickOpenLink()")); 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nav_observer.Wait(); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToNextPageAfterPrerender() const { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html")); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after the prerendered page has been navigated to and then away from. 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates back through the history to the prerendered page. 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPrerender() { 12095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver back_nav_observer(GetActiveWebContents()); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool original_prerender_page = false; 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(IsOriginalPrerenderPage())", 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_prerender_page)); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(original_prerender_page); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Goes back to the page that was active before the prerender was swapped 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. This must be called when the prerendered page is the current page 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the active tab. 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPageBeforePrerender() { 12245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* tab = GetActiveWebContents(); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab->IsLoading()); 12275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver back_nav_observer(tab); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool js_result; 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidBackToOriginalPagePass())", 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &js_result)); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(js_result); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const std::string& html_file) const { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const GURL& url) const { 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderManager()->FindPrerenderData( 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetSessionStorageNamespace()) != NULL; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UseHttpsSrcServer() { 12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (https_src_server_) 12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) https_src_server_.reset( 12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new net::SpawnedTestServer( 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(https_src_server_->Start()); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableJavascriptCalls() { 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_ = false; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void DisableLoadEventCheck() { 12634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_ = false; 12644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerModel* GetModel() const { 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TaskManager::GetInstance()->model(); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* GetPrerenderManager() const { 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile(current_browser()->profile()); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrerenderLinkManager* GetPrerenderLinkManager() const { 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager = 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManagerFactory::GetForProfile( 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStartEventForLinkNumber(int index) const { 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_started; 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderStartEvents[%d]))", index); 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_started)); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_started; 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int GetPrerenderLoadEventCountForLinkNumber(int index) const { 12974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int load_event_count; 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 12994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "window.domAutomationController.send(" 13004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "receivedPrerenderLoadEvents[%d] || 0)", index); 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 13054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &load_event_count)); 13064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return load_event_count; 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { 13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dom_content_loaded_event_count; 13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string expression = base::StringPrintf( 13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(" 13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "receivedPrerenderDomContentLoadedEvents[%d] || 0)", index); 13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expression, 13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &dom_content_loaded_event_count)); 13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return dom_content_loaded_event_count; 13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStopEventForLinkNumber(int index) const { 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_stopped; 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderStopEvents[%d]))", index); 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_stopped)); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_stopped; 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HadPrerenderEventErrors() const { 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool had_prerender_event_errors; 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " hadPrerenderEventErrors))", 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &had_prerender_event_errors)); 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return had_prerender_event_errors; 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asserting on this can result in flaky tests. PrerenderHandles are 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // removed from the PrerenderLinkManager when the prerender is canceled from 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser, when the prerenders are cancelled from the renderer process, 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or the channel for the renderer process is closed on the IO thread. In the 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last case, the code must be careful to wait for the channel to close, as it 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is done asynchronously after swapping out the old process. See 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ChannelDestructionWatcher. 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->IsEmpty(); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetLinkPrerenderCount() const { 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderLinkManager()->prerenders_.size(); 13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetRunningLinkPrerenderCount() const { 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderLinkManager()->CountRunningPrerenders(); 13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns length of |prerender_manager_|'s history, or -1 on failure. 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetHistoryLength() const { 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> prerender_dict( 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<base::DictionaryValue*>( 13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->GetAsValue())); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict.get()) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* history_list; 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict->GetList("history", &history_list)) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(history_list->GetSize()); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return safe_browsing_factory_->most_recent_service()-> 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager(); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data = 1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPrerenderManager()->FindPrerenderData(url, NULL); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TestPrerenderContents*>( 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_data ? prerender_data->contents() : NULL); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetLoaderHostOverride(const std::string& host) { 13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_host_override_ = host; 13935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver()->AddRule(host, "127.0.0.1"); 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_path(const std::string& path) { 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_ = path; 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_query_and_fragment(const std::string& query_and_fragment) { 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_and_fragment_ = query_and_fragment; 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCrossDomainTestUrl(const std::string& path) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string secondary_domain = "www.foo.com"; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str(base::StringPrintf( 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s", 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_domain.c_str(), 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->host_port_pair().port(), 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.c_str())); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url_str); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_browser(Browser* browser) { 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_ = browser; 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() const { 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return explicitly_set_browser_ ? explicitly_set_browser_ : browser(); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& dest_url() const { 14248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return dest_url_; 14258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 14268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreasePrerenderMemory() { 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase the memory allowed in a prerendered page above normal settings. 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug build bots occasionally run against the default limit, and tests 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // were failing because the prerender was canceled due to memory exhaustion. 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/93076 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 1000 * 1024 * 1024; 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DidPrerenderPass(WebContents* web_contents) const { 14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool prerender_test_result = false; 14375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents, 14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(DidPrerenderPass())", 14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &prerender_test_result)) 14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender_test_result; 14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DidDisplayPass(WebContents* web_contents) const { 14465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool display_test_result = false; 14475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents, 14495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &display_test_result)) 14515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return display_test_result; 14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerender(FinalStatus expected_final_status) { 14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender_contents_factory_->ExpectPrerenderContents( 14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status); 14585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddPrerender(const GURL& url, int index) { 14615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string javascript = base::StringPrintf( 14625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "AddPrerender('%s', %d)", url.spec().c_str(), index); 14635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host = 14645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 14655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 14665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16(), base::ASCIIToUTF16(javascript)); 14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool autostart_test_server_; 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Remove this altogether so the tests don't globally assume 14745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only one prerender. 14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* GetPrerenderContents() const { 14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderContentsFor(dest_url_); 14775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURLImpl( 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 14815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 14825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads) { 14835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_url_ = prerender_url; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 14895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(net::SpawnedTestServer::GetFilePathWithReplacements( 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_, 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::SpawnedTestServer* src_server = test_server(); 14955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (https_src_server_) 14965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) src_server = https_src_server_.get(); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL loader_url = src_server->GetURL(replacement_path + 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_and_fragment_); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL::Replacements loader_replacements; 15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!loader_host_override_.empty()) 15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_replacements.SetHostStr(loader_host_override_); 15035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_url = loader_url.ReplaceComponents(loader_replacements); 15045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Running test with queue length " << 15065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.size(); 15075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!expected_final_status_queue.empty()); 15085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders; 15095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < expected_final_status_queue.size(); i++) { 15105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders.push_back( 15115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_factory_->ExpectPrerenderContents( 15125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue[i]).release()); 15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = expected_final_status_queue.front(); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the loader URL and then wait for the first prerender to be 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // created. 15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), loader_url); 15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForCreate(); 15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForLoads(expected_number_of_loads); 15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will abort on its own. Assert it does so correctly. 15255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForStop(); 15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerenders[0]->contents()); 15275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 15285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 15295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, check that it prerendered correctly. 15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 15315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 15345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (call_javascript_) { 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if page behaves as expected while in prerendered state. 15385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender_contents->prerender_contents())); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test that the referring page received the right start and load events. 15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (check_load_events_) { 15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads()); 15465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, 15475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderLoadEventCountForLinkNumber(0)); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 15505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerenders.Pass(); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLImpl(const content::OpenURLParams& params, 1555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure in navigating we have a URL to use in the PrerenderManager. 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetPrerenderContents()->prerender_contents(); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate and wait for either the load to finish normally or for a swap to 15635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // occur. 15645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): The only handles CURRENT_TAB navigations, which is the 15655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only case tested or prerendered right now. 15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(CURRENT_TAB, params.disposition); 15675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 15685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 15698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebContents* target_web_contents = current_browser()->OpenURL(params); 15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 15718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 15728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (web_contents && expect_swap_to_succeed) { 15738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(web_contents, target_web_contents); 15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (call_javascript_) 15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(web_contents)); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Opens the prerendered page using javascript functions in the loader 15805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. |javascript_function_name| should be a 0 argument function which is 15815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // invoked. |new_web_contents| is true if the navigation is expected to 15825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // happen in a new WebContents via OpenURL. 15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenURLWithJSImpl(const std::string& javascript_function_name, 15845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 15855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& ping_url, 15865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool new_web_contents) const { 15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderViewHost* render_view_host = 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Extra arguments in JS are ignored. 15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string javascript = base::StringPrintf( 15925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s('%s', '%s')", javascript_function_name.c_str(), 15935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.spec().c_str(), ping_url.spec().c_str()); 15945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_web_contents) { 15965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabNavigationOrSwapObserver observer; 15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 15985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16(), base::ASCIIToUTF16(javascript)); 15995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer.Wait(); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver observer(current_browser()->tab_strip_model(), 16025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents); 16035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 16045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16(), base::ASCIIToUTF16(javascript)); 16054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer.Wait(); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContentsFactory* prerender_contents_factory_; 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NeverRunsExternalProtocolHandlerDelegate external_protocol_handler_delegate_; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url_; 16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::SpawnedTestServer> https_src_server_; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool call_javascript_; 16174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool check_load_events_; 16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string loader_host_override_; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_path_; 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_query_and_fragment_; 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* explicitly_set_browser_; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a page is correctly prerendered in the case of a 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <link rel=prerender> tag and then loaded into a tab in response to a 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 16285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 16295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 16315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 16325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 16395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 16465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 16475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 16485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 16495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that cross-domain prerenders emit the correct histograms. 16545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 16555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 16585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 1); 16595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PrerenderNotSwappedInPLT", 1); 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1); 16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 16705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that pending prerenders launch and receive proper event treatment. 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_pending.html", 16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 1); 16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the prerender. 16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Abort early if the original prerender didn't swap, so as not to hang. 16835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(prerender->contents()); 16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the new prerender to be ready. 16865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForStart(); 16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForLoads(1); 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL prerender_page_url = 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html"); 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContentsFor(prerender_page_url)); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now navigate to our target page. 16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 16975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), prerender_page_url, CURRENT_TAB, 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders which are canceled before they are launched 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// never get started. 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 1); 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 17135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky, http://crbug.com/167340. 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=1"); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No ChannelDestructionWatcher is needed here, since prerenders in the 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderLinkManager should be deleted by removing the links, rather than 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting down the renderer process. 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky, http://crbug.com/167340. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=2"); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(1); 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageRemovingLinkWithTwoLinksRemovingOne 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest, 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=2"); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 18105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the visibility API works. 18195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_visibility.html", 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly if we try to 1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// swap it in before it commits. 1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { 1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to a page that triggers a prerender for a URL that never commits. 1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 18315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 18325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop prerender_start_loop; 1834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::PostTask( 1835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 18365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 18375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNoCommitUrl, file, prerender_start_loop.QuitClosure())); 18384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 1839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(kNoCommitUrl, 18404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_NAVIGATION_UNCOMMITTED, 1841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 0); 18425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the hanging request to be scheduled. 18435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_start_loop.Run(); 1844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to the URL, but assume the contents won't be swapped in. 1846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Checks that client redirects don't add alias URLs until after they commit. 18500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap2) { 18510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Navigate to a page that then navigates to a URL that never commits. 18520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 18535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop prerender_start_loop; 18560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::PostTask( 18570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 18595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNoCommitUrl, file, prerender_start_loop.QuitClosure())); 18600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DisableJavascriptCalls(); 18610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), 18620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 18635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the hanging request to be scheduled. 18645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_start_loop.Run(); 18650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 18660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Navigating to the second URL should not swap. 18670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateToURLWithDisposition(kNoCommitUrl, CURRENT_TAB, false); 18680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 18690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 18754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded while a page is being preloaded, but 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded when the page is displayed. 1888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 1890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_MACOSX) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 1893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_LINUX) 1898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://crbug.com/306715 1899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin PrerenderDelayLoadPlugin 1902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://crbug.com/306715 1904a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderDelayLoadPlugin) { 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/plugin_delay_load.html", 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded on prerendering pages when click-to-play 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is enabled. 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickToPlay) { 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable click-to-play. 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* content_settings_map = 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetHostContentSettingsMap(); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings_map->SetDefaultContentSetting( 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_click_to_play.html", 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't load a NaCl plugin when NaCl is disabled. 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNaClPluginDisabled) { 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_disabled.html", 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run this check again. When we try to load aa ppapi plugin, the 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "loadstart" event is asynchronously posted to a message loop. 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that earlier call could have been run before the 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the "loadstart" event was posted. 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): While this should reliably fail on regressions, the 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reliability depends on the specifics of ppapi plugin 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading. It would be great if we could avoid that. 19415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins in an iframe are not loaded while a page is 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being preloaded, but are loaded when the page is displayed. 1946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 1954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 1957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin PrerenderIframeDelayLoadPlugin 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderIframeDelayLoadPlugin) { 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a page that contains a prerender link to a page that contains an 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe with a source that requires http authentication. This should not 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender successfully. 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 19754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectNavigateToFirst) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderClientRedirectNavigateToSecond) { 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2000f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 2001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and swap when navigating to the first page. 2002f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2003f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderLocationReplaceNavigateToFirst) { 2004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED, 2006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2); 2007f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDestURL(); 2008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2009f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2010f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 2011f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and swap when navigating to the second. 2012f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2013f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderLocationReplaceNavigateToSecond) { 2014f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2015f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED, 2016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2); 2017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 2018f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that we get the right PPLT histograms for client redirect prerenders 20215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// and navigations when the referring page is Google. 20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderLocationReplaceGWSHistograms) { 20245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 20255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 20265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The loader page should look like Google. 20285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string kGoogleDotCom("www.google.com"); 20295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetLoaderHostOverride(kGoogleDotCom); 20305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_replace_state.html"); 20315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL dest_url = GetCrossDomainTestUrl( 20335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html"); 20345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 20365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 20375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 20385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#prerender"); 20395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL::Replacements replacements; 20405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) replacements.SetHostStr(kGoogleDotCom); 20415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_url = prerender_url.ReplaceComponents(replacements); 20425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 20445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 20455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 20465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 20475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 20485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 20495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, prerender->number_of_loads()); 20505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 20525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 20535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 20545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 20555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Although there is a client redirect, it is dropped from histograms because 20565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // it is a Google URL. The target page itself does not load until after the 20575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // swap. 20585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 20595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL navigate_url = test_server()->GetURL( 20615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 20625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 20635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#navigate"); 20645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_url = navigate_url.ReplaceComponents(replacements); 20655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer( 20675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model(), 20685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 2); 20695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 20705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_url, Referrer(), CURRENT_TAB, 20715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 20725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 20735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 20755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 20775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 20785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLT", 1); 20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLTMatched", 1); 20805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 20815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.gws_PerceivedPLTMatchedComplete", 1); 20825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The client redirect does /not/ count as a miss because it's a Google URL. 20845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.PerceivedPLTFirstAfterMiss", 0); 20855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 20865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectNavigateToSecondViaClick) { 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html")); 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 20965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 2); 20975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(destination_url); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that a page served over HTTPS is correctly prerendered. 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { 2102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 21157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectInIframe) { 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect( 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 2119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToFirst) { 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecond) { 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecondViaClick) { 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html")); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 21645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 21655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(destination_url); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect( 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through an 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe. This should not prerender successfully. 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) { 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_iframe.html", 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 21924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript changing the window.location. This should not prerender 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successfully 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through a 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client-issued redirect. This should not prerender successfully. 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_refresh.html", 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is set when prerendering. 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is not set when prerendering and the source page is 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTPS. 22227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderNoSSLReferrer) { 22245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UseHttpsSrcServer(); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_no_referrer.html", 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer is set when prerendering is cancelled. 223268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrer) { 223368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 223468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 223568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 223668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 223768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 223868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 223968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 224068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 224168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 224268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 224468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 224568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 224668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 224768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that popups on a prerendered page cause cancellation. 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_popup.html", 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CREATE_NEW_WINDOW, 22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that registering a protocol handler causes cancellation. 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRegisterProtocolHandler) { 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_register_protocol_handler.html", 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_REGISTER_PROTOCOL_HANDLER, 22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that renderers using excessive memory will be terminated. 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) { 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderManager()); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 30 * 1024 * 1024; 22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The excessive memory kill may happen before or after the load event as it 22674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // happens asynchronously with IPC calls. Even if the test does not start 22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // allocating until after load, the browser process might notice before the 22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // message gets through. This happens on XP debug bots because they're so 22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // slow. Instead, don't bother checking the load event count. 22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableLoadEventCheck(); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_excessive_memory.html", 22735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 0); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks shutdown code while a prerender is active. 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 22784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 22795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableLoadEventCheck(); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop. 22865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 22965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerenders[0]->contents()); 22975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 22985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 22995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page load one. 23005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure the PrerenderContents for the next url is now in the manager and 23095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not pending. This relies on pending prerenders being resolved in the same 23105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event loop iteration as OnPrerenderStop. 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 23125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetLinkPrerenderCount()); 23135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop and multiple links are 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handled correctly. 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderInfiniteLoopMultiple) { 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_a_multiple.html"; 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_b_multiple.html"; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileC = 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_c_multiple.html"; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is conceptually simplest if concurrency is at two, since we 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 23385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 23395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerenders[0]->contents()); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next url should be in pending list but not an active entry. This relies on 23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the fact that the renderer sends out the AddLinkRelPrerender IPC before 23435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // sending the page load one. 23445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(3U, GetLinkPrerenderCount()); 23455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next urls are now in the manager 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. One and only one of the URLs (the last seen) should be the 23535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // active entry. This relies on pending prerenders being resolved in the same 23545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event loop iteration as OnPrerenderStop. 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 23585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetRunningLinkPrerenderCount()); 23605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that pending prerenders are aborted (and never launched) when launched 23635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by a prerender that itself gets aborted. 23645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAbortPendingOnCancel) { 23655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 23675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, FINAL_STATUS_CANCELLED, 1); 23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 23715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 23725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 23735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page load one. 23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next url should be in pending list but not an active entry. 23785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 23795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cancel the prerender. 23815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 23825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 23835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All prerenders are now gone. 23855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTaskManager) { 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the task manager. This populates the model. 2390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::OpenTaskManager(current_browser()); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the model of task manager to start. 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerBrowserTestUtil::WaitForWebResourceChange(1); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with two resources. 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One of the resources that has a WebContents associated with it should have 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the Prerender prefix. 2399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 prefix = 2400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, 2401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 2402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 prerender_title; 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_prerender_tabs = 0; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TaskManagerModel* model = GetModel(); 240658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The task manager caches values. Force the titles to be fresh. 240758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model->Refresh(); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->ResourceCount(); ++i) { 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetResourceWebContents(i)) { 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_title = model->GetResourceTitle(i); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWith(prerender_title, prefix, true)) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_prerender_tabs; 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_prerender_tabs); 2416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 prerender_page_title = 2417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prerender_title.substr(prefix.length()); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be no tabs with the Prerender prefix. 2422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 tab_prefix = 2423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, base::string16()); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_prerender_tabs = 0; 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_tabs_with_prerender_page_title = 0; 242658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model->Refresh(); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->ResourceCount(); ++i) { 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetResourceWebContents(i)) { 2429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 tab_title = model->GetResourceTitle(i); 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWith(tab_title, prefix, true)) { 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_prerender_tabs; 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWith(tab_title, tab_prefix, true)); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The prerender tab should now be a normal tab but the title should be 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same. Depending on timing, there may be more than one of these. 2437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 tab_page_title = 2438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tab_title.substr(tab_prefix.length()); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_page_title.compare(tab_page_title) == 0) 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_tabs_with_prerender_page_title; 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_prerender_tabs); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may have deleted the prerender tab, but the swapped in tab should be 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active. 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(num_tabs_with_prerender_page_title, 1); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(num_tabs_with_prerender_page_title, 2); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering. 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Times out under AddressSanitizer, see http://crbug.com/108402 24547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderHTML5Audio) { 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio.html", 24565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 24575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 24585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 24595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if autoplay is set. 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Periodically fails on chrome-os. See http://crbug.com/145263 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5AudioAutoplay) { 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_autoplay.html", 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 24715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if js starts playing. 24767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5AudioJsplay) { 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_jsplay.html", 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 24825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video loads are deferred on prerendering. 24867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderHTML5Video) { 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video.html", 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 24915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video tags inserted by javascript are deferred and played 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly on swap in. 24967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5VideoJs) { 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_script.html", 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks for correct network events by using a busy sleep the javascript. 25067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5VideoNetwork) { 25085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 25095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 25105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_network.html", 25115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 25125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 25145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 25155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that scripts can retrieve the correct window size while prerendering. 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): Widget hierarchy split causes this to fail http://crbug.com/82363 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderWindowSize) { 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowSize) { 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_size.html", 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerenderers will terminate when the RenderView crashes. 25335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { 25345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 25355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 25365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_RENDERER_CRASHED, 25375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to about:crash and then wait for the renderer to crash. 25405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()->prerender_contents()); 25425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->contents()->prerender_contents()->GetController(). 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURL( 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(content::kChromeUICrashURL), 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 25485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageWithFragment) { 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html#fragment", 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2567d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageWithRedirectedFragment) { 2568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderTestURL( 2569d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html#fragment"), 2570d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FINAL_STATUS_USED, 2571d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2); 2572d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 2574d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 2575d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 2576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToDestURL(); 2577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 2578d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2579d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 2580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 2581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when navigating from 2583d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the main page to a fragment. 2584d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageNavigateFragment) { 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html", 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2589d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2590d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2594d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to the main page. 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2597d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigatePage) { 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#fragment", 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2603d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to a different fragment on the same page. 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2609d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigateFragment) { 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#other_fragment", 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2614d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2618d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh from a fragment on the same page. 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2621d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectFromFragment) { 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 26234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html#fragment"), 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2627d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2628d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2631d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh to a fragment on the same page. 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectToFragment) { 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html"), 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses JS to set 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the window.location.hash to a fragment on the same page. 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageChangeFragmentLocationHash) { 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a PNG works correctly. 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.png", FINAL_STATUS_USED, 1); 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a JPG works correctly. 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.jpeg", FINAL_STATUS_USED, 1); 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender of a CRX will result in a cancellation due to 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download. 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 26714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr GET requests allow prerenders. 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrGet) { 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_get.html", 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr HEAD requests allow prerenders. 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrHead) { 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_head.html", 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr OPTIONS requests allow prerenders. 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrOptions) { 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_options.html", 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr TRACE requests allow prerenders. 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrTrace) { 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_trace.html", 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr POST requests allow prerenders. 27075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPost) { 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_post.html", 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr PUT cancels prerenders. 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) { 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr DELETE cancels prerenders. 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) { 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_delete.html", 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would trigger an SSL error is canceled. 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) { 2730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 27334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 27344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 27354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_ERROR, 27404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from a subresource does not cancel 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 27504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 27514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 27524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from an iframe does not cancel 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { 2771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 27744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 27754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 27764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we cancel correctly when window.print() is called. 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_print.html", 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_PRINT, 27964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened in a new window by javascript and both the 2800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// pages are in the same domain, the prerendered page is not used, due to 2801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// window.opener. 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerWindowOpen) { 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaWindowOpen(); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened due to click on a href with target="_blank" 2811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and both pages are in the same domain the prerendered page is not used, due 2812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// to window.opener. 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerClickTarget) { 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickTarget(); 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestClientCertStore : public net::ClientCertStore { 28225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 28235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestClientCertStore() {} 28245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestClientCertStore() {} 28255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // net::ClientCertStore: 28275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, 28285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::CertificateList* selected_certs, 28295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Closure& callback) OVERRIDE { 28305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *selected_certs = net::CertificateList( 28315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, scoped_refptr<net::X509Certificate>( 28325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new net::X509Certificate("test", "test", base::Time(), base::Time()))); 28335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(); 28345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 28355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 28365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<net::ClientCertStore> CreateCertStore() { 28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<net::ClientCertStore>(new TestClientCertStore); 28395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2840f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would normally request an SSL client 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate will never be seen since it's an https top-level resource. 2843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderSSLClientCertTopLevel) { 28455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 28465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 28475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 28485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 28514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 28564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 0); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from a 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresource will cancel the prerendered page. 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSSLClientCertSubresource) { 28635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 28645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 28655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 28665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 28694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 28844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from an 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe will cancel the prerendered page. 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertIframe) { 28905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 28964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 29124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages with a safe browsing 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial. 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingTopLevel) { 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 29234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 0); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that server redirects to a malware page will cancel prerenders. 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingServerRedirect) { 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that client redirects to a malware page will cancel prerenders. 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingClientRedirect) { 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware subresource. 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url = test_server()->GetURL("files/prerender/image.jpeg"); 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url, SB_THREAT_TYPE_URL_MALWARE); 2953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware iframe. 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingIframe) { 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL iframe_url = test_server()->GetURL( 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iframe_url, SB_THREAT_TYPE_URL_MALWARE); 2972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", iframe_url.spec())); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage read will not cause prerender to fail. 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageRead) { 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_read.html", 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage write will not cause prerender to fail. 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_write.html", 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the favicon is properly loaded on prerender. 30045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderFavicon) { 30055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_favicon.html", 30075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 30085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!FaviconTabHelper::FromWebContents( 30125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents())->FaviconIsValid()) { 30135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the favicon has not been set yet, wait for it to be. 30145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver favicon_update_watcher( 30155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_FAVICON_UPDATED, 30165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<WebContents>(GetActiveWebContents())); 30175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_update_watcher.Wait(); 30185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 30195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(FaviconTabHelper::FromWebContents( 30205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents())->FaviconIsValid()); 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when a prerendered page is swapped in to a referring page, the 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unload handlers on the referring page are executed. 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails about 50% on CrOS, 5-10% on linux, win, mac. http://crbug.com/128986 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderUnload) { 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 30295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 expected_title = base::ASCIIToUTF16("Unloaded"); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher( 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_title); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the history is cleared, prerendering is cancelled and 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is cleared. 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 30405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 30425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 30435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_HISTORY)); 30495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was cleared. 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetHistoryLength()); 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Disabled due to flakiness: crbug.com/316225 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the cache is cleared, prerenders are cancelled but 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is not cleared. 3058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderClearCache) { 30595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 30615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 30625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_CACHE)); 30675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was not cleared. Not a vital behavior, but 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to compare with PrerenderClearHistory test. 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetHistoryLength()); 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { 30755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 30775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 30785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 30795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 30815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 30825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerender->contents()); 30842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { 30875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 30895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 30925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 30932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 30972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancels the prerender of a page with its own prerender. The second prerender 31002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should never be started. 31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelPrerenderWithPrerender) { 31035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_infinite_a.html", 31055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 31065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 31095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerender->contents()); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerendering and history tests. 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is navigated to in several ways [navigate via 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox, click on link, key-modified click to open in background tab, etc], 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// followed by a navigation to another page from the prerendered page, followed 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a back navigation. 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateNavigateGoBack) { 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickClickGoBack) { 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewWindow(); 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewForegroundTab(); 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewBackgroundTab) { 31715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 31735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 31765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->contents()->set_should_be_shown(false); 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewBackgroundTab(); 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPrerenderedPageWhenDevToolsAttached) { 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 31852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetOrCreateFor( 31862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost())); 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager* manager = DevToolsManager::GetInstance(); 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost client_host; 3189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manager->RegisterDevToolsClientHostFor(agent.get(), &client_host); 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url = "files/prerender/prerender_page.html"; 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); 31928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithDisposition(url, CURRENT_TAB, false); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->ClientHostClosing(&client_host); 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that the sessionStorage namespace remains the same when swapping 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a prerendered page. 31985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorage) { 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPageBeforePrerender(); 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that the control group works. An XHR PUT cannot be detected in the 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control group. 32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroup) { 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 32134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that the control group correctly hits WOULD_HAVE_BEEN_USED 32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// renderer-initiated navigations. (This verifies that the ShouldFork logic 32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// behaves correctly.) 32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroupRendererInitiated) { 32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::SetMode( 32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenDestURLViaClick(); 32305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that the MatchComplete dummy works in the normal case. Once 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a prerender is cancelled because of a script, a dummy must be created to 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account for the MatchComplete case, and it must have a final status of 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FINAL_STATUS_WOULD_HAVE_BEEN_USED. 32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 1); 32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 32475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 32545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 32555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 32565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that a navigation that hits a MatchComplete dummy while another is in 32595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// progress does not also classify the previous navigation as a MatchComplete. 32605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 32615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MatchCompleteDummyCancelNavigation) { 32625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 32635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Arrange for a URL to hang. 32655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 32665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL( 32675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome/test/data/prerender/prerender_page.html")); 32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop hang_loop; 32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 32715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 32725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNoCommitUrl, file, hang_loop.QuitClosure())); 32735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First, fire a prerender that aborts after it completes its load. 32755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 32765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 32775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 32785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 32795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 1); 32805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 32815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 32825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 32835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 32855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open the hanging URL in a new tab. Wait for both the new tab to open and 32875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the hanging request to be scheduled. 32885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 32895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kNoCommitUrl, NEW_FOREGROUND_TAB, 32905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 32915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hang_loop.Run(); 32925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now interrupt that navigation and navigate to the destination URL. This 32945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should forcibly complete the previous navigation and also complete a 32955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WOULD_HAVE_BEEN_PRERENDERED navigation. 32965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 32985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 2); 32995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 33015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 33045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTestWithNaCl() {} 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTestWithNaCl() {} 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableNaCl); 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that NaCl plugins work when enabled, with prerendering. 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl, 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderNaClPluginEnabled) { 3321ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 3322ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 3323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 3324ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 3325ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 3326ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_enabled.html", 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid any chance of a race, we have to let the script send its response 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 33342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 33352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 33372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 33382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "DidDisplayReallyPass()", 33392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &display_test_result)); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(display_test_result); 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering. 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering on HTTPS. 33537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 33545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderSSLReferrerPolicy) { 33555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UseHttpsSrcServer(); 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 336368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer policy is used when prerendering is cancelled. 336468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrerPolicy) { 336568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 336668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 336768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 336868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 336968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 337068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 337168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 337268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 337368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 337468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 337568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 337668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool display_test_result = false; 337768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebContents* web_contents = 337868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 337968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 338068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_contents, 338168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 338268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &display_test_result)); 338368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(display_test_result); 338468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 338568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 338668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 338768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interaction of the webNavigation and tabs API with prerender. 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithExtensions : public PrerenderBrowserTest, 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionApiTest { 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrerenderBrowserTestWithExtensions() { 33931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The individual tests start the test server through ExtensionApiTest, so 33941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // the port number can be passed through to the extension. 33951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autostart_test_server_ = false; 33961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 33971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3398c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 3399c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PrerenderBrowserTest::SetUp(); 3400c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 3401c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpInProcessBrowserTestFixture(); 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::TearDownInProcessBrowserTestFixture(); 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::TearDownInProcessBrowserTestFixture(); 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, WebNavigation) { 34231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 3427ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kAllowLegacyExtensionManifests); 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the extension to set itself up and return control to us. 34305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("webnavigation/prerender")) << message_; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 34372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 34382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 34392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 34402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 34412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 34432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 34442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 344690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails often on Windows dbg bots. http://crbug.com/177163 34471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG) 344890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_TabsApi DISABLED_TabsApi 344990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 345090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_TabsApi TabsApi 34511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif // defined(OS_WIN) && !defined(NDEBUG) 345290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, MAYBE_TabsApi) { 34531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 34542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 34552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the extension to set itself up and return control to us. 34572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(RunExtensionSubtest("tabs/on_replaced", "on_replaced.html")) 34582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << message_; 34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 34632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 34662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the 3475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 34762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 34775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderCancelSubresourceUnsupportedScheme) { 34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); 3479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 34802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 34812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 34822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 34842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 34874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 34882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Ensure that about:blank is permitted for any subresource. 3491a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderAllowAboutBlankSubresource) { 3493a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL image_url = GURL("about:blank"); 3494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3495a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text.push_back( 3496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string replacement_path; 3498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3500a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text, 3501a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &replacement_path)); 3502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3503a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 3504a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the prerender 3507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// on redirect. 35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelSubresourceRedirectUnsupportedScheme) { 35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = test_server()->GetURL( 35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.jpg")); 3512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 35152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 35204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that chrome-extension subresource does not cancel the prerender. 3524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceExtensionScheme) { 3526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = GURL("chrome-extension://abcdefg/test.jpg"); 3527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that redirect to chrome-extension subresource does not cancel the 3540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 3541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceRedirectExtensionScheme) { 3543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = test_server()->GetURL( 3544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateServerRedirect("chrome-extension://abcdefg/test.jpg")); 3545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that non-http/https main page redirects cancel the prerender. 35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelMainFrameRedirectUnsupportedScheme) { 35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL( 35622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.html")); 35634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 35642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that media source video loads are deferred on prerendering. 35677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { 35687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_media_source.html", 35697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FINAL_STATUS_USED, 35707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 35715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 35725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 35737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 35747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3575ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that a prerender that creates an audio stream (via a WebAudioDevice) 3576ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// is cancelled. 3577ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// http://crbug.com/261489 3578ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderWebAudioDevice) { 3579ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_web_audio_device.html", 3580ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_CREATING_AUDIO_STREAM, 1); 3581ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3582ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3583ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that prerenders do not swap in to WebContents being captured. 3584ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCapturedWebContents) { 3585ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 3586ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_PAGE_BEING_CAPTURED, 1); 35875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 35885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents->IncrementCapturerCount(gfx::Size()); 3589ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->DecrementCapturerCount(); 3591ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3592ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 35934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 35944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a server redirect. 35954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 35964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessServerRedirect) { 35974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Force everything to be a process swap. 35984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 35994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ContentBrowserClient* original_browser_client = 36004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 36014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 36034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html"), 36044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 0); 36054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 36074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 36084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that URLRequests for prerenders being aborted on cross-process 36105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// navigation from a server redirect are cleaned up, so they don't keep cache 36115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// entries locked. 36125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See http://crbug.com/341134 36135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderCrossProcessServerRedirectNoHang) { 36155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char kDestPath[] = "files/prerender/prerender_page.html"; 36165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force everything to be a process swap. 36175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 36185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 36195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 36205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect(kDestPath), FINAL_STATUS_OPEN_URL, 0); 36225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL( 36245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser(), 36255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_server()->GetURL(kDestPath)); 36265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 36285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 36295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 36314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a client redirect. 36324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessClientRedirect) { 36344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cross-process navigation logic for renderer-initiated navigations 36354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is partially controlled by the renderer, namely 36364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ChromeContentRendererClient. This test instead relies on the Web 36374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Store triggering such navigations. 36384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string webstore_url = extension_urls::GetWebstoreLaunchURL(); 36394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Mock out requests to the Web Store. 36415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 36424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::PostTask( 36434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 36444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, 36454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(webstore_url), file)); 36464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(CreateClientRedirect(webstore_url), 36484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 1); 36494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 36504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that canceling a MatchComplete dummy doesn't result in two 36524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// stop events. 36534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelMatchCompleteDummy) { 36545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 36554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 36564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_CANCELLED); 36575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 36585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 36595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 0); 36604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cancel the MatchComplete dummy. 36625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 36635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[1]->WaitForStop(); 36644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check the referring page only got one copy of the event. 36664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 36674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 36684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the page is 36705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// visible. Also test the right histogram events are emitted in this case. 36714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { 36725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 36735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 36745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 36765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 36775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 36785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL( 36795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html", 36805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 0); 36815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 36825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 36835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 36845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 36855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 36865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 36875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 36885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 36895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 36905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap. 36925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 36935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 36945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 36955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), dest_url(), CURRENT_TAB, 36965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 36975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 36985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 36995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender never observes the final load. 37005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 37015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now check DidDisplayPass. 37035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 37045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 37065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 37075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 37085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 37095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 37105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 37114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the 37144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page is visible, even after another redirect. 37154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredImageAfterRedirect) { 37175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 37185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 37205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 37215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 37225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL( 37235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html", 37245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 0); 37255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 37265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 37275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 37285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap. 37305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 37315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 37325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 37335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), dest_url(), CURRENT_TAB, 37345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 37355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 37365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender never observes the final load. 37385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 37395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now check DidDisplayPass. 37415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 37424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed. 37454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredMainFrame) { 37464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 37474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 37484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "files/prerender/image-deferred.png", 37494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 37504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 37514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed, even 37544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// with a double-redirect. 37554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredMainFrameAfterRedirect) { 37574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 37584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 37594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/image-deferred.png"), 37604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 37614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 37624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in a synchronous XHR abort the 37654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// prerender. 37664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { 37674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_deferred_sync_xhr.html", 37684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); 37694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 37704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that prerenders are not swapped for navigations with extra headers. 37738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExtraHeadersNoSwap) { 37748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 37758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 37768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 37778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 37788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 37798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.extra_headers = "X-Custom-Header: 42\r\n"; 37808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams(params, false); 37818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 37828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 37838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that prerenders are not swapped for navigations with browser-initiated 37848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// POST data. 37858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderBrowserInitiatedPostNoSwap) { 37878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 37888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 37898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 37908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string post_data = "DATA"; 37918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 37928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 37938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.uses_post = true; 37948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.browser_initiated_post_data = 37958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::RefCountedString::TakeString(&post_data); 37968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams(params, false); 37978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 37988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when the 3800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// prerendered page tries to make a second navigation entry. 3801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNewNavigationEntry) { 3802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_new_entry.html", 3803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_NEW_NAVIGATION_ENTRY, 3804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1); 3805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Attempt a swap-in in a new tab, verifying that session storage namespace 3808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// merging works. 3809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTab) { 38105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock out some URLs and count the number of requests to one of them. Both 38115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender_session_storage.html and init_session_storage.html need to be 38125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mocked so they are same-origin. 38135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kInitURL("http://prerender.test/init_session_storage.html"); 38145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath init_file = GetTestPath("init_session_storage.html"); 38155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 38165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 38175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, kInitURL, init_file)); 38185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 38205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 38215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter counter; 38225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 38235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 38245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 38255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTestURL, test_file, counter.AsWeakPtr())); 38265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 38285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 38305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 38315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kInitURL, NEW_FOREGROUND_TAB, 38325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 38335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. Set expect_swap_to_succeed to false because 38355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the swap does not occur synchronously. 38365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 38375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 38385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // return value assertion and let this go through the usual successful-swap 38395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // codepath. 38405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 38415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass manually since the previous call skipped it. 38435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass( 38445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents())); 38455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only one request to the test URL started. 38475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 38485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Re-enable this check when the races in attaching the 38495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle are resolved. http://crbug.com/335835 38505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EXPECT_EQ(1, counter.count()); 38515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 38525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Attempt a swap-in in a new tab, verifying that session storage namespace 38545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// merging works. Unlike the above test, the swap is for a navigation that would 38555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// normally be cross-process. 38565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTabCrossProcess) { 38575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_data_dir; 38585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); 38595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock out some URLs and count the number of requests to one of them. Both 38615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender_session_storage.html and init_session_storage.html need to be 38625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mocked so they are same-origin. 38635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kInitURL("http://prerender.test/init_session_storage.html"); 38645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath init_file = GetTestPath("init_session_storage.html"); 38655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 38665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 38675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, kInitURL, init_file)); 38685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 38705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 38715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter counter; 38725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 38735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 38745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 38755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTestURL, test_file, counter.AsWeakPtr())); 38765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 38785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 38805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 38815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kInitURL, NEW_FOREGROUND_TAB, 38825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 38835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to about:blank so the next navigation is cross-process. 38855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), 38865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(content::kAboutBlankURL)); 38875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. Set expect_swap_to_succeed to false because 38895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the swap does not occur synchronously. 38905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 38915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 38925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // return value assertion and let this go through the usual successful-swap 38935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // codepath. 38945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 38955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass manually since the previous call skipped it. 38975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 38985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only one request to the test URL started. 39005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Re-enable this check when the races in attaching the 39025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle are resolved. http://crbug.com/335835 39035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EXPECT_EQ(1, counter.count()); 39045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that session storage conflicts don't merge. 39075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorageConflict) { 39085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_session_storage_conflict.html", 39095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 39105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 39125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 39135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), 39145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_server()->GetURL("files/prerender/init_session_storage.html"), 39155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_FOREGROUND_TAB, 39165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 39175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. 39195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 39205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass in the new tab. 39225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 39235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that prerenders honor |should_replace_current_entry|. 39265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) { 39275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 39285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 39305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 39315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.should_replace_current_entry = true; 39325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToURLWithParams(params, false); 39335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NavigationController& controller = 39355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetController(); 39365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First entry is about:blank, second is prerender_page.html. 39375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(controller.GetPendingEntry() == NULL); 39385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2, controller.GetEntryCount()); 39395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GURL(content::kAboutBlankURL), 39405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryAtIndex(0)->GetURL()); 39415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); 39425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks prerender does not hit DCHECKs and behaves properly if two pending 39455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// swaps occur in a row. 39465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { 39475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 39485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 39495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); 39515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender1 = 39525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); 39535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); 39555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 39565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddPrerender(url2, 1); 39575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForStart(); 39585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForLoads(1); 39595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There's no reason the second prerender can't be used, but the swap races 39615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with didStartProvisionalLoad and didFailProvisionalLoad from the previous 39625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigation. The current logic will conservatively fail to swap under such 39635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // races. However, if the renderer is slow enough, it's possible for the 39645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender to still be used, so don't program in either expectation. 39655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender2->contents()); 39665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->contents()->set_skip_final_checks(true); 39675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 39695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 39705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, 39715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 39725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fire off two navigations, without running the event loop between them. 39745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer( 39755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model(), 39765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 2); 39775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 39785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 39795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 39805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 39815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 39825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The WebContents should be on url2. There may be 2 or 3 entries, depending 39845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // on whether the first one managed to complete. 39855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case 39875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // shouldn't be possible because it's throttled by the pending swap that 39885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cannot complete. 39895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NavigationController& controller = 39905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetController(); 39915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(controller.GetPendingEntry() == NULL); 39925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LE(2, controller.GetEntryCount()); 39935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_GE(3, controller.GetEntryCount()); 39945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GURL(content::kAboutBlankURL), 39955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryAtIndex(0)->GetURL()); 39965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(url2, controller.GetEntryAtIndex( 39975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryCount() - 1)->GetURL()); 39985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that pending swaps get aborted on new navigations. 40015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 40025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderPendingSwapNewNavigation) { 40035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::HangSessionStorageMergesForTesting(); 40045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 40065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 40075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 40095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 40105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, 40115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 40125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the URL. Wait for DidStartLoading, just so it's definitely 40145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // progressed somewhere. 40155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver page_load_observer( 40165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NOTIFICATION_LOAD_START, 40175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<NavigationController>( 40185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &GetActiveWebContents()->GetController())); 40195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 40205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_url(), Referrer(), CURRENT_TAB, 40215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 40225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_load_observer.Wait(); 40235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate somewhere else. This should succeed and abort the pending swap. 40255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 40265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 40275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(content::kAboutBlankURL), Referrer(), CURRENT_TAB, 40285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 40295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nav_observer.Wait(); 40305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that <a ping> requests are not dropped in prerender. 40335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { 40345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Count hits to a certain URL. 40355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kPingURL("http://prerender.test/ping"); 40365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 40375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 40385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter ping_counter; 40395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 40405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 40415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 40425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kPingURL, empty_file, ping_counter.AsWeakPtr())); 40435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 40455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenDestURLViaClickPing(kPingURL); 40465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ping_counter.WaitForCount(1); 40485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPPLTNormalNavigation) { 40515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 40525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 40545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), url); 40555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 40565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 40575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 40585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 40595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 40625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 40635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 40645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* normal_profile = current_browser()->profile(); 40655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_browser(ui_test_utils::OpenURLOffTheRecord( 40665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) normal_profile, GURL("about:blank"))); 40675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 40685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 40695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 40705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that prerendering works in incognito mode. 40725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { 40735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 40745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 4075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 4076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 4078