prerender_browsertest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_path.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/pref_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/string_util.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/stringprintf.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_timeouts.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/values.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chrome_notification_types.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h" 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/favicon/favicon_tab_helper.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager_factory.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager_browsertest_util.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_model.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_model.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/mime_types_handler.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/uma_histogram_helper.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_manager.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/navigation_entry.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/site_instance.h" 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/common/url_constants.h" 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/browser_test_utils.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/test/test_utils.h" 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "extensions/common/switches.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/base/escape.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cert/x509_certificate.h" 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ssl/client_cert_store.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_filter.h" 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_job.h" 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "url/gurl.h" 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsClientHost; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using content::NavigationController; 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing content::OpenURLParams; 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using content::Referrer; 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using content::RenderFrameHost; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::TestNavigationObserver; 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing content::WebContents; 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using content::WebContentsObserver; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using task_manager::browsertest_util::WaitForTaskManagerRows; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerender tests work as follows: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A page with a prefetch link to the test page is loaded. Once prerendered, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its Javascript function DidPrerenderPass() is called, which returns true if 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page behaves as expected when prerendered. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is then displayed on a tab. The Javascript function 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidDisplayPass() is called, and returns true if the page behaved as it 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should while being displayed. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants used in the test HTML files. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kReadyTitle = "READY"; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kPassTitle = "PASS"; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateClientRedirect(const std::string& dest_url) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kClientRedirectBase = "client-redirect?"; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateServerRedirect(const std::string& dest_url) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kServerRedirectBase = "server-redirect?"; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kServerRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears the specified data using BrowsingDataRemover. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearBrowsingData(Browser* browser, int remove_mask) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(browser->profile()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemoverCompletionObserver observer(remover); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.BlockUntilCompletion(); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowsingDataRemover deletes itself. 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Returns true if the prerender is expected to abort on its own, before 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// attempting to swap it. 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool ShouldAbortPrerenderBeforeSwap(FinalStatus status) { 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (status) { 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case FINAL_STATUS_USED: 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case FINAL_STATUS_WINDOW_OPENER: 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case FINAL_STATUS_APP_TERMINATING: 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case FINAL_STATUS_PROFILE_DESTROYED: 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // We'll crash the renderer after it's loaded. 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_RENDERER_CRASHED: 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_CANCELLED: 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_DEVTOOLS_ATTACHED: 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_PAGE_BEING_CAPTURED: 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_NAVIGATION_UNCOMMITTED: 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case FINAL_STATUS_WOULD_HAVE_BEEN_USED: 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Convenience function to wait for a title. Handles the case when the 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// WebContents already has the expected title. 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WaitForASCIITitle(WebContents* web_contents, 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const char* expected_title_ascii) { 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::string16 expected_title = base::ASCIIToUTF16(expected_title_ascii); 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (web_contents->GetTitle() == expected_title) 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Waits for the destruction of a RenderProcessHost's IPC channel. 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Used to make sure the PrerenderLinkManager's OnChannelClosed function has 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// been called, before checking its state. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelDestructionWatcher { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher() : channel_destroyed_(false) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ChannelDestructionWatcher() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WatchChannel(content::RenderProcessHost* host) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->AddFilter(new DestructionMessageFilter(this)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForChannelClose() { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(channel_destroyed_); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When destroyed, calls ChannelDestructionWatcher::OnChannelDestroyed. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores all messages. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionMessageFilter : public content::BrowserMessageFilter { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : BrowserMessageFilter(0), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) watcher_(watcher) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionMessageFilter() { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChannelDestructionWatcher::OnChannelDestroyed, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(watcher_))); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* message_was_ok) OVERRIDE { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher* watcher_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionMessageFilter); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnChannelDestroyed() { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(channel_destroyed_); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_destroyed_ = true; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Quit(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool channel_destroyed_; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop run_loop_; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A navigation observer to wait on either a new load or a swap of a 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContents. On swap, if the new WebContents is still loading, wait for that 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// load to complete as well. Note that the load must begin after the observer is 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// attached. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NavigationOrSwapObserver : public WebContentsObserver, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public TabStripModelObserver { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for either a new load or a swap of |tab_strip_model|'s active 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : WebContentsObserver(web_contents), 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_start_loading_(false), 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_(1) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for either |number_of_loads| loads or a swap of |tab_strip_model|'s 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // active WebContents. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_loads) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : WebContentsObserver(web_contents), 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_start_loading_(false), 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_(number_of_loads) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NavigationOrSwapObserver() { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip_model_->RemoveObserver(this); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_did_start_loading() { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_start_loading_ = true; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 289ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait() { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.Run(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContentsObserver implementation: 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStartLoading(RenderViewHost* render_view_host) OVERRIDE { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_start_loading_ = true; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!did_start_loading_) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_--; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (number_of_loads_ == 0) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.Quit(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TabStripModelObserver implementation: 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* old_contents, 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContents* new_contents, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) OVERRIDE { 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (old_contents != web_contents()) 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Switch to observing the new WebContents. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observe(new_contents); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_contents->IsLoading()) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the new WebContents is still loading, wait for it to complete. Only 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one load post-swap is supported. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_start_loading_ = true; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_ = 1; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.Quit(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* tab_strip_model_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_start_loading_; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_loads_; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RunLoop loop_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for a new tab to open and a navigation or swap in it. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NewTabNavigationOrSwapObserver { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NewTabNavigationOrSwapObserver() 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : new_tab_observer_( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_ADDED, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NewTabNavigationOrSwapObserver::OnTabAdded, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Watch for NOTIFICATION_TAB_ADDED. Add a callback so that the 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigationOrSwapObserver can be attached synchronously and no events are 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // missed. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_tab_observer_.Wait(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swap_observer_->Wait(); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool OnTabAdded(const content::NotificationSource& source, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (swap_observer_) 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* new_tab = content::Details<WebContents>(details).ptr(); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the TabStripModel. Assume this is attached to a Browser. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* tab_strip_model = 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<Browser*>(new_tab->GetDelegate())->tab_strip_model(); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) swap_observer_.reset(new NavigationOrSwapObserver(tab_strip_model, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_tab)); 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) swap_observer_->set_did_start_loading(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::WindowedNotificationObserver new_tab_observer_; 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<NavigationOrSwapObserver> swap_observer_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderContents that stops the UI message loop on DidStopLoading(). 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TestPrerenderContents : public PrerenderContents { 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestPrerenderContents( 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrerenderManager* prerender_manager, 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile, 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& url, 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const content::Referrer& referrer, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PrerenderContents(prerender_manager, profile, url, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, origin, PrerenderManager::kNoExperiment), 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status), 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_(NULL), 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_(false), 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_(false), 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_shown_(expected_final_status == FINAL_STATUS_USED), 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skip_final_checks_(false) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestPrerenderContents() { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (skip_final_checks_) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_MAX) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(MATCH_COMPLETE_REPLACEMENT, match_complete_status()); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()) << 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " when testing URL " << prerender_url().path() << 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " (Expected: " << NameFromFinalStatus(expected_final_status_) << 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prerendering RenderViewHosts should be hidden before the first 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // navigation, so this should be happen for every PrerenderContents for 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // which a RenderViewHost is created, regardless of whether or not it's 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_render_view_host_) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(was_hidden_); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A used PrerenderContents will only be destroyed when we swap out 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents, at the end of a navigation caused by a call to 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigateToURLImpl(). 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_status() == FINAL_STATUS_USED) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_render_view_host_); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_be_shown_, was_shown_); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On quit, it's possible to end up here when render processes are closed 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the PrerenderManager is destroyed. As a result, it's possible to 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on quit. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's also possible for this to be called after we've been notified of 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app termination, but before we've been deleted, which is why the second 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check is needed. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING && 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final_status() != expected_final_status_) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::RenderProcessGone(status); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckURL(const GURL& url) OVERRIDE { 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the PrerenderRendererCrash test. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.spec() != content::kChromeUICrashURL) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrerenderContents::CheckURL(url); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // For tests that open the prerender in a new background tab, the RenderView 4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // will not have been made visible when the PrerenderContents is destroyed 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though it is used. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_be_shown(bool value) { should_be_shown_ = value; } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tests which do not know whether the prerender will be used. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_skip_final_checks(bool value) { skip_final_checks_ = value; } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host) OVERRIDE { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to make sure the RenderViewHost is hidden and, if used, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequently shown. 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar().Add( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(new_render_view_host)); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_render_view_host_ = new_render_view_host; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents::OnRenderViewHostCreated(new_render_view_host); 465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void Observe(int type, 468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const content::NotificationSource& source, 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_render_view_host_, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(source).ptr()); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = *content::Details<bool>(details).ptr(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_visible) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_ = true; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_visible && was_hidden_) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once hidden, a prerendered RenderViewHost should only be shown after 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being removed from the PrerenderContents for display. 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetRenderViewHost()); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_ = true; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Observe(type, source, details); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RenderViewHost created for the prerender, if any. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host_; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is hidden. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_hidden_; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is shown, after having been 4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // hidden. 4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool was_shown_; 4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Expected final value of was_shown_. Defaults to true for 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // FINAL_STATUS_USED, and false otherwise. 5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool should_be_shown_; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, |expected_final_status_| and other shutdown checks are skipped. 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool skip_final_checks_; 5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A handle to a TestPrerenderContents whose lifetime is under the caller's 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control. A PrerenderContents may be destroyed at any point. This allows 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tracking the final status, etc. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrerender : public PrerenderContents::Observer, 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public base::SupportsWeakPtr<TestPrerender> { 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerender() 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : contents_(NULL), 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) number_of_loads_(0), 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_number_of_loads_(0) { 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestPrerender() { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_->RemoveObserver(this); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* contents() const { return contents_; } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int number_of_loads() const { return number_of_loads_; } 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForCreate() { create_loop_.Run(); } 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForStart() { start_loop_.Run(); } 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForStop() { stop_loop_.Run(); } 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Waits for |number_of_loads()| to be at least |expected_number_of_loads| OR 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for the prerender to stop running (just to avoid a timeout if the prerender 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dies). Note: this does not assert equality on the number of loads; the 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // caller must do it instead. 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WaitForLoads(int expected_number_of_loads) { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!load_waiter_); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!expected_number_of_loads_); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (number_of_loads_ < expected_number_of_loads) { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_waiter_.reset(new base::RunLoop); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_number_of_loads_ = expected_number_of_loads; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_waiter_->Run(); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_waiter_.reset(); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_number_of_loads_ = 0; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(expected_number_of_loads, number_of_loads_); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnPrerenderCreated(TestPrerenderContents* contents) { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!contents_); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_ = contents; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_->AddObserver(this); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_loop_.Quit(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderContents::Observer implementation: 55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnPrerenderStart(PrerenderContents* contents) OVERRIDE { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_loop_.Quit(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderContents* contents) OVERRIDE { 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) number_of_loads_++; 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (load_waiter_ && number_of_loads_ >= expected_number_of_loads_) 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_waiter_->Quit(); 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPrerenderStop(PrerenderContents* contents) OVERRIDE { 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(contents_); 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch contents_ = NULL; 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch stop_loop_.Quit(); 567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If there is a WaitForLoads call and it has yet to see the expected number 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // of loads, stop the loop so the test fails instead of timing out. 5693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (load_waiter_) 5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) load_waiter_->Quit(); 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE { 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 5783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestPrerenderContents* contents_; 5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int number_of_loads_; 5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int expected_number_of_loads_; 5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<base::RunLoop> load_waiter_; 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop create_loop_; 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop start_loop_; 586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop stop_loop_; 587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(TestPrerender); 589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// PrerenderManager that uses TestPrerenderContents. 592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass TestPrerenderContentsFactory : public PrerenderContents::Factory { 593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestPrerenderContentsFactory() {} 595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~TestPrerenderContentsFactory() { 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(expected_contents_queue_.empty()); 598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestPrerender> ExpectPrerenderContents(FinalStatus final_status) { 601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestPrerender> handle(new TestPrerender()); 602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_contents_queue_.push_back( 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExpectedContents(final_status, handle->AsWeakPtr())); 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return handle.Pass(); 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual PrerenderContents* CreatePrerenderContents( 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderManager* prerender_manager, 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Profile* profile, 610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& url, 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Origin origin, 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint8 experiment_id) OVERRIDE { 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExpectedContents expected; 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!expected_contents_queue_.empty()) { 616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected = expected_contents_queue_.front(); 617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_contents_queue_.pop_front(); 618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VLOG(1) << "Creating prerender contents for " << url.path() << 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " with expected final status " << expected.final_status; 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VLOG(1) << expected_contents_queue_.size() << " left in the queue."; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* contents = 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new TestPrerenderContents(prerender_manager, 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile, url, referrer, origin, 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected.final_status); 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (expected.handle) 6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expected.handle->OnPrerenderCreated(contents); 6283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return contents; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExpectedContents { 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectedContents() : final_status(FINAL_STATUS_MAX) { } 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedContents(FinalStatus final_status, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<TestPrerender>& handle) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : final_status(final_status), 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle(handle) { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus final_status; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<TestPrerender> handle; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<ExpectedContents> expected_contents_queue_; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager implementation that returns a fixed result for 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a given URL. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : SafeBrowsingDatabaseManager(service), 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) threat_type_(SB_THREAT_TYPE_SAFE) { } 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given url is safe or not. If we 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the url is safe, CheckUrl returns true. 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it returns false, and "client" is called asynchronously with the 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result when it is ready. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true, indicating a SAFE result, unless the URL is the fixed URL 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the user, and the user-specified result is not SAFE 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in which that result will be communicated back via a call into the 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client, and false will be returned). 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides SafeBrowsingService::CheckBrowseUrl. 665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gurl != url_ || threat_type_ == SB_THREAT_TYPE_SAFE) 667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return true; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch BrowserThread::PostTask( 670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch BrowserThread::IO, FROM_HERE, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, gurl, client)); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetThreatTypeForUrl(const GURL& url, SBThreatType threat_type) { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ = url; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeSafeBrowsingDatabaseManager() {} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCheckBrowseURLDone(const GURL& gurl, Client* client) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SBThreatType> expected_threats; 686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check( 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL>(1, gurl), 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SBFullHash>(), 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_util::MALWARE, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_threats); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_check.url_results[0] = threat_type_; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->OnSafeBrowsingResult(sb_check); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService { 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService() { } 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returned pointer has the same lifespan as the database_manager_ refcounted 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager() { 710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return fake_database_manager_; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeSafeBrowsingService() { } 715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE { 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager_; 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances. 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingServiceFactory() : 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_(NULL) { } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingServiceFactory() { } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_ = new FakeSafeBrowsingService(); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return most_recent_service_; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FakeSafeBrowsingService* most_recent_service() const { 7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return most_recent_service_; 7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service_; 745ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 746ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FakeDevToolsClientHost : public DevToolsClientHost { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost() {} 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDevToolsClientHost() {} 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InspectedContentsClosing() OVERRIDE {} 753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DispatchOnInspectorFrontend(const std::string& msg) OVERRIDE {} 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ReplacedWithAnotherClient() OVERRIDE {} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequestJob (and associated handler) which hangs. 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HangingURLRequestJob : public net::URLRequestJob { 769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HangingURLRequestJob(net::URLRequest* request, 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : net::URLRequestJob(request, network_delegate) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE {} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HangingURLRequestJob() {} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HangingFirstRequestProtocolHandler 782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public net::URLRequestJobFactory::ProtocolHandler { 783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HangingFirstRequestProtocolHandler(const base::FilePath& file, 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure callback) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : file_(file), 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_(callback), 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_run_(true) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HangingFirstRequestProtocolHandler() {} 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (first_run_) { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_run_ = false; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callback_.is_null()) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, callback_); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new HangingURLRequestJob(request, network_delegate); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new content::URLRequestMockHTTPJob(request, network_delegate, file_); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath file_; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure callback_; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable bool first_run_; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Makes |url| never respond on the first load, and then with the contents of 8137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// |file| afterwards. When the first load has been scheduled, runs |callback| on 8147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// the UI thread. 8157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid CreateHangingFirstRequestProtocolHandlerOnIO(const GURL& url, 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::FilePath& file, 8177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Closure callback) { 8187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 8197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( 8207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new HangingFirstRequestProtocolHandler(file, callback)); 8217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 8227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch url, never_respond_handler.Pass()); 8237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 8247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Wrapper over URLRequestMockHTTPJob that exposes extra callbacks. 8267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass MockHTTPJob : public content::URLRequestMockHTTPJob { 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHTTPJob(net::URLRequest* request, 829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* delegate, 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::FilePath& file) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::URLRequestMockHTTPJob(request, delegate, file) { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 8343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch void set_start_callback(const base::Closure& start_callback) { 8353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch start_callback_ = start_callback; 8363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 8373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 8383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void Start() OVERRIDE { 8393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!start_callback_.is_null()) 8403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch start_callback_.Run(); 8413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch content::URLRequestMockHTTPJob::Start(); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~MockHTTPJob() {} 846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure start_callback_; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dummy counter class to live on the UI thread for counting requests. 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestCounter : public base::SupportsWeakPtr<RequestCounter> { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestCounter() : count_(0), expected_count_(-1) {} 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count() const { return count_; } 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RequestStarted() { 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) count_++; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (loop_ && count_ == expected_count_) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_->Quit(); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForCount(int expected_count) { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(!loop_); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(-1, expected_count_); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count_ < expected_count) { 866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expected_count_ = expected_count; 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loop_.reset(new base::RunLoop); 868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) loop_->Run(); 869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expected_count_ = -1; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.reset(); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_count, count_); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int count_; 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_count_; 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::RunLoop> loop_; 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Protocol handler which counts the number of requests that start. 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CountingProtocolHandler 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CountingProtocolHandler(const base::FilePath& file, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : file_(file), 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter_(counter), 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_(this) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CountingProtocolHandler() {} 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequest* request, 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHTTPJob* job = new MockHTTPJob(request, network_delegate, file_); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job->set_start_callback(base::Bind(&CountingProtocolHandler::RequestStarted, 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestStarted() { 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RequestCounter::RequestStarted, counter_)); 906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath file_; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<RequestCounter> counter_; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable base::WeakPtrFactory<CountingProtocolHandler> weak_factory_; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes |url| respond to requests with the contents of |file|, counting the 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number that start in |counter|. 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateCountingProtocolHandlerOnIO( 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::FilePath& file, 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) { 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> protocol_handler( 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new CountingProtocolHandler(file, counter)); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, protocol_handler.Pass()); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes |url| respond to requests with the contents of |file|. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateMockProtocolHandlerOnIO(const GURL& url, 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file) { 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, content::URLRequestMockHTTPJob::CreateProtocolHandlerForSingleFile( 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file)); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ContentBrowserClient that cancels all prerenderers on OpenURL. 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestContentBrowserClient : public chrome::ChromeContentBrowserClient { 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestContentBrowserClient() {} 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestContentBrowserClient() {} 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldAllowOpenURL(content::SiteInstance* site_instance, 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) OVERRIDE { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile( 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext())) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->CancelAllPrerenders(); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chrome::ChromeContentBrowserClient::ShouldAllowOpenURL(site_instance, 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ContentBrowserClient that forces cross-process navigations. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SwapProcessesContentBrowserClient 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public chrome::ChromeContentBrowserClient { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SwapProcessesContentBrowserClient() {} 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SwapProcessesContentBrowserClient() {} 9623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 9633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // chrome::ChromeContentBrowserClient implementation. 9643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual bool ShouldSwapProcessesForRedirect( 9653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch content::ResourceContext* resource_context, 9663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const GURL& current_url, 9673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const GURL& new_url) OVERRIDE { 9683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return true; 9693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 9703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An ExternalProtocolHandler that blocks everything and asserts it never is 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// called. 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NeverRunsExternalProtocolHandlerDelegate 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ExternalProtocolHandler::Delegate { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExternalProtocolHandler::Delegate implementation. 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker( 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShellIntegration::DefaultWebClientObserver* observer, 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& protocol) OVERRIDE { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will crash, but it shouldn't get this far with BlockState::BLOCK 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anyway. 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ExternalProtocolHandler::BlockState GetBlockState( 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool initiated_by_user_gesture) OVERRIDE { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Block everything and fail the test. 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExternalProtocolHandler::BLOCK; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BlockRequest() OVERRIDE { } 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RunExternalProtocolDialog(const GURL& url, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_host_id, 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id) OVERRIDE { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void LaunchUrlWithoutSecurityCheck(const GURL& url) OVERRIDE { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FinishedProcessingCheck() OVERRIDE { 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestPath(const std::string& file_name) { 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui_test_utils::GetTestFilePath( 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("prerender")), 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath().AppendASCII(file_name)); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Many of these tests are flaky. See http://crbug.com/249179 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTest : virtual public InProcessBrowserTest { 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest() 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : autostart_test_server_(true), 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_(NULL), 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_(true), 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check_load_events_(true), 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_("files/prerender/prerender_loader.html"), 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_(NULL) {} 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~PrerenderBrowserTest() {} 10337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const { 10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 10367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!web_contents) 10377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 10387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return web_contents->GetController().GetDefaultSessionStorageNamespace(); 10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1040eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 10427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); 10447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1045eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 10467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 10487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SafeBrowsingService::RegisterFactory(NULL); 10507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 10523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 10533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 10543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch command_line->AppendSwitchASCII(switches::kPrerenderMode, 10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kPrerenderModeSwitchValueEnabled); 10567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_MACOSX) 10577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The plugins directory isn't read by default on the Mac, so it needs to be 10587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // explicitly registered. 10597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath app_dir; 10607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PathService::Get(chrome::DIR_APP, &app_dir); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath( 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kExtraPluginDir, 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_dir.Append(FILE_PATH_LITERAL("plugins"))); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kPromptForDownload, false); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (autostart_test_server_) 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeResourceDispatcherHostDelegate:: 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExternalProtocolHandlerDelegateForTesting( 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &external_protocol_handler_delegate_); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrerenderManager* prerender_manager = GetPrerenderManager(); 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(prerender_manager); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_manager->mutable_config().rate_limit_enabled = false; 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(prerender_contents_factory_ == NULL); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_ = new TestPrerenderContentsFactory; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->SetPrerenderContentsFactory(prerender_contents_factory_); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Convenience function to get the currently active WebContents in 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current_browser(). 108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebContents* GetActiveWebContents() const { 108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return current_browser()->tab_strip_model()->GetActiveWebContents(); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overload for a single expected final status 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrerenderTestURL(url, 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status, 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURL( 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrerenderTestURLImpl(url, 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue( 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, expected_final_status); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<TestPrerender*> prerenders; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(url, 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads).release(&prerenders); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(1u, prerenders.size()); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<TestPrerender>(prerenders[0]); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURL() const { 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, true); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the url in a new tab, with no opener. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURLWithDisposition( 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_swap_to_succeed) const { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithParams( 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::OpenURLParams(dest_url_, Referrer(), disposition, 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_swap_to_succeed); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURL(const std::string& dest_html_file) const { 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithDisposition(dest_html_file, CURRENT_TAB, true); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURLWithDisposition(const std::string& dest_html_file, 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_swap_to_succeed) const { 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url = test_server()->GetURL(dest_html_file); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithDisposition(dest_url, disposition, expect_swap_to_succeed); 115090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 115190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURLWithDisposition(const GURL& dest_url, 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool expect_swap_to_succeed) const { 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithParams( 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::OpenURLParams(dest_url, Referrer(), disposition, 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expect_swap_to_succeed); 115990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 116090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURLWithParams(const content::OpenURLParams& params, 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool expect_swap_to_succeed) const { 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLImpl(params, expect_swap_to_succeed); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClick() const { 116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OpenURLViaClick(dest_url_); 116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OpenURLViaClick(const GURL& url) const { 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("Click", url, GURL(), false); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickTarget() const { 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("ClickTarget", dest_url_, GURL(), true); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickPing(const GURL& ping_url) const { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("ClickPing", dest_url_, ping_url, false); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewWindow() const { 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("ShiftClick", dest_url_, GURL(), true); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewForegroundTab() const { 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("MetaShiftClick", dest_url_, GURL(), true); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("CtrlShiftClick", dest_url_, GURL(), true); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewBackgroundTab() const { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("MetaClick", dest_url_, GURL(), true); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OpenURLWithJSImpl("CtrlClick", dest_url_, GURL(), true); 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OpenDestURLViaWindowOpen() const { 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLWithJSImpl("WindowOpen", dest_url_, GURL(), true); 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void RemoveLinkElement(int i) const { 12077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetActiveWebContents()->GetMainFrame()->ExecuteJavaScript( 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClickToNextPageAfterPrerender() { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("ClickOpenLink()")); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nav_observer.Wait(); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToNextPageAfterPrerender() const { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html")); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after the prerendered page has been navigated to and then away from. 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates back through the history to the prerendered page. 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPrerender() { 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNavigationObserver back_nav_observer(GetActiveWebContents()); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool original_prerender_page = false; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetActiveWebContents(), 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(IsOriginalPrerenderPage())", 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_prerender_page)); 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(original_prerender_page); 1236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Goes back to the page that was active before the prerender was swapped 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in. This must be called when the prerendered page is the current page 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the active tab. 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GoBackToPageBeforePrerender() { 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = GetActiveWebContents(); 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(tab); 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(tab->IsLoading()); 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNavigationObserver back_nav_observer(tab); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) back_nav_observer.Wait(); 1248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool js_result; 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(DidBackToOriginalPagePass())", 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &js_result)); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(js_result); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const std::string& html_file) const { 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const GURL& url) const { 12617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return GetPrerenderManager()->FindPrerenderData( 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetSessionStorageNamespace()) != NULL; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UseHttpsSrcServer() { 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (https_src_server_) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_src_server_.reset( 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::SpawnedTestServer( 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(https_src_server_->Start()); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableJavascriptCalls() { 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_ = false; 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableLoadEventCheck() { 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check_load_events_ = false; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerModel* GetModel() const { 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TaskManager::GetInstance()->model(); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* GetPrerenderManager() const { 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile(current_browser()->profile()); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrerenderLinkManager* GetPrerenderLinkManager() const { 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager = 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManagerFactory::GetForProfile( 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetPrerenderEventCount(int index, const std::string& type) const { 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_count; 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expression = base::StringPrintf( 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(" 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents(), expression, &event_count)); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event_count; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DidReceivePrerenderStartEventForLinkNumber(int index) const { 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetPrerenderLoadEventCountForLinkNumber(int index) const { 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderload"); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderdomcontentloaded"); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DidReceivePrerenderStopEventForLinkNumber(int index) const { 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderstop") > 0; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForPrerenderEventCount(int index, 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& type, 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count) const { 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dummy; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expression = base::StringPrintf( 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WaitForPrerenderEventCount(%d, '%s', %d," 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " window.domAutomationController.send.bind(" 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " window.domAutomationController, 0))", 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index, type.c_str(), count); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents(), expression, &dummy)); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(0, dummy); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HadPrerenderEventErrors() const { 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool had_prerender_event_errors; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents(), 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(Boolean(" 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " hadPrerenderEventErrors))", 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &had_prerender_event_errors)); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return had_prerender_event_errors; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asserting on this can result in flaky tests. PrerenderHandles are 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // removed from the PrerenderLinkManager when the prerender is canceled from 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the browser, when the prerenders are cancelled from the renderer process, 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or the channel for the renderer process is closed on the IO thread. In the 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // last case, the code must be careful to wait for the channel to close, as it 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is done asynchronously after swapping out the old process. See 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ChannelDestructionWatcher. 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->IsEmpty(); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t GetLinkPrerenderCount() const { 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->prerenders_.size(); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t GetRunningLinkPrerenderCount() const { 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->CountRunningPrerenders(); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns length of |prerender_manager_|'s history, or -1 on failure. 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetHistoryLength() const { 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> prerender_dict( 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<base::DictionaryValue*>( 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->GetAsValue())); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict.get()) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* history_list; 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict->GetList("history", &history_list)) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(history_list->GetSize()); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return safe_browsing_factory_->most_recent_service()-> 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_database_manager(); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data = 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->FindPrerenderData(url, NULL); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TestPrerenderContents*>( 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_data ? prerender_data->contents() : NULL); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLoaderHostOverride(const std::string& host) { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_host_override_ = host; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(host, "127.0.0.1"); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_path(const std::string& path) { 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_ = path; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_query(const std::string& query) { 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_ = query; 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCrossDomainTestUrl(const std::string& path) { 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string secondary_domain = "www.foo.com"; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str(base::StringPrintf( 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s", 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_domain.c_str(), 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->host_port_pair().port(), 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.c_str())); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url_str); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_browser(Browser* browser) { 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_ = browser; 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() const { 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return explicitly_set_browser_ ? explicitly_set_browser_ : browser(); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& dest_url() const { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest_url_; 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreasePrerenderMemory() { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase the memory allowed in a prerendered page above normal settings. 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug build bots occasionally run against the default limit, and tests 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // were failing because the prerender was canceled due to memory exhaustion. 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/93076 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 1000 * 1024 * 1024; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DidPrerenderPass(WebContents* web_contents) const { 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_test_result = false; 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(DidPrerenderPass())", 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &prerender_test_result)) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_test_result; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DidDisplayPass(WebContents* web_contents) const { 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &display_test_result)) 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return display_test_result; 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerender(FinalStatus expected_final_status) { 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_contents_factory_->ExpectPrerenderContents( 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPrerender(const GURL& url, int index) { 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string javascript = base::StringPrintf( 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "AddPrerender('%s', %d)", url.spec().c_str(), index); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a string for pattern-matching TaskManager tab entries. 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::string16 MatchTaskManagerTab(const char* page_title) { 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ASCIIToUTF16(page_title)); 1479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a string for pattern-matching TaskManager prerender entries. 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::string16 MatchTaskManagerPrerender(const char* page_title) { 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, 1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ASCIIToUTF16(page_title)); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autostart_test_server_; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(davidben): Remove this altogether so the tests don't globally assume 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only one prerender. 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* GetPrerenderContents() const { 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderContentsFor(dest_url_); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURLImpl( 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_url_ = prerender_url; 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(net::SpawnedTestServer::GetFilePathWithReplacements( 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_, 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::SpawnedTestServer* src_server = test_server(); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (https_src_server_) 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_server = https_src_server_.get(); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL loader_url = src_server->GetURL( 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_path + "&" + loader_query_); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements loader_replacements; 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!loader_host_override_.empty()) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_replacements.SetHostStr(loader_host_override_); 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loader_url = loader_url.ReplaceComponents(loader_replacements); 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Running test with queue length " << 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue.size(); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!expected_final_status_queue.empty()); 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<TestPrerender> prerenders; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < expected_final_status_queue.size(); i++) { 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerenders.push_back( 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_->ExpectPrerenderContents( 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue[i]).release()); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = expected_final_status_queue.front(); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to the loader URL and then wait for the first prerender to be 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created. 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), loader_url); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerenders[0]->WaitForCreate(); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerenders[0]->WaitForLoads(expected_number_of_loads); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The prerender will abort on its own. Assert it does so correctly. 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerenders[0]->WaitForStop(); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(prerenders[0]->contents()); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, check that it prerendered correctly. 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 1551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 1552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 1553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_javascript_) { 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if page behaves as expected while in prerendered state. 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender_contents->prerender_contents())); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that the referring page received the right start and load events. 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check_load_events_) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads()); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderLoadEventCountForLinkNumber(0)); 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerenders.Pass(); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURLImpl(const content::OpenURLParams& params, 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_swap_to_succeed) const { 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure in navigating we have a URL to use in the PrerenderManager. 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = GetPrerenderContents()->prerender_contents(); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate and wait for either the load to finish normally or for a swap to 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // occur. 15827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(davidben): The only handles CURRENT_TAB navigations, which is the 15837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // only case tested or prerendered right now. 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(CURRENT_TAB, params.disposition); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents()); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* target_web_contents = current_browser()->OpenURL(params); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swap_observer.Wait(); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents && expect_swap_to_succeed) { 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(web_contents, target_web_contents); 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (call_javascript_) 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidDisplayPass(web_contents)); 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Opens the prerendered page using javascript functions in the loader 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. |javascript_function_name| should be a 0 argument function which is 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invoked. |new_web_contents| is true if the navigation is expected to 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happen in a new WebContents via OpenURL. 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenURLWithJSImpl(const std::string& javascript_function_name, 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& ping_url, 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool new_web_contents) const { 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderFrameHost* render_frame_host = web_contents->GetMainFrame(); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extra arguments in JS are ignored. 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string javascript = base::StringPrintf( 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s('%s', '%s')", javascript_function_name.c_str(), 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.spec().c_str(), ping_url.spec().c_str()); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_web_contents) { 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NewTabNavigationOrSwapObserver observer; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationOrSwapObserver observer(current_browser()->tab_strip_model(), 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContentsFactory* prerender_contents_factory_; 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NeverRunsExternalProtocolHandlerDelegate external_protocol_handler_delegate_; 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url_; 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::SpawnedTestServer> https_src_server_; 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool call_javascript_; 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_load_events_; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_host_override_; 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string loader_path_; 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_query_; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* explicitly_set_browser_; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a page is correctly prerendered in the case of a 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <link rel=prerender> tag and then loaded into a tab in response to a 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMAHistogramHelper histograms; 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.Fetch(); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WatchChannel( 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.Fetch(); 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount( 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that cross-domain prerenders emit the correct histograms. 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMAHistogramHelper histograms; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.Fetch(); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PrerenderNotSwappedInPLT", 1); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.Fetch(); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount( 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that pending prerenders launch and receive proper event treatment. 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_pending.html", 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to the prerender. 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Abort early if the original prerender didn't swap, so as not to hang. 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(prerender->contents()); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the new prerender to be ready. 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender2->WaitForStart(); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender2->WaitForLoads(1); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL prerender_page_url = 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html"); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContentsFor(prerender_page_url)); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now navigate to our target page. 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents()); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), prerender_page_url, CURRENT_TAB, 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) swap_observer.Wait(); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that pending prerenders which are canceled before they are launched 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// never get started. 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WatchChannel( 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer events have arrived. 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestPrerender> prerender = 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No ChannelDestructionWatcher is needed here, since prerenders in the 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderLinkManager should be deleted by removing the links, rather than 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting down the renderer process. 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveLinkElement(0); 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender->WaitForStop(); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer events have arrived. 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_loader_query("links_to_insert=2"); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveLinkElement(0); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveLinkElement(1); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender->WaitForStop(); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinksOneLate) { 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestPrerender> prerender = 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 1); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Add a second prerender for the same link. It reuses the prerender, so only 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the start event fires here. 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPrerender(url, 1); 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForPrerenderEventCount(1, "webkitprerenderstart", 1); 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetPrerenderLoadEventCountForLinkNumber(1)); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveLinkElement(0); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveLinkElement(1); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender->WaitForStop(); 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer events have arrived. 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_query("links_to_insert=2"); 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveLinkElement(0); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer events have arrived. 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 1848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) channel_close_watcher.WatchChannel( 1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 1850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateToDestURL(); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the visibility API works. 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_visibility.html", 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 18607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly if we try to 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// swap it in before it commits. 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a page that triggers a prerender for a URL that never commits. 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RunLoop prerender_start_loop; 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNoCommitUrl, file, prerender_start_loop.QuitClosure())); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(kNoCommitUrl, 18783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch FINAL_STATUS_NAVIGATION_UNCOMMITTED, 18793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 0); 18803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Wait for the hanging request to be scheduled. 18813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch prerender_start_loop.Run(); 18823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 18833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Navigate to the URL, but assume the contents won't be swapped in. 18843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch NavigateToDestURLWithDisposition(CURRENT_TAB, false); 18853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 18863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 18873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Checks that client redirects don't add alias URLs until after they commit. 18883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap2) { 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a page that then navigates to a URL that never commits. 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::RunLoop prerender_start_loop; 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserThread::PostTask( 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 1897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kNoCommitUrl, file, prerender_start_loop.QuitClosure())); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the hanging request to be scheduled. 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_start_loop.Run(); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigating to the second URL should not swap. 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithDisposition(kNoCommitUrl, CURRENT_TAB, false); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 1914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 192190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1); 192290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 192390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 192490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Checks that plugins are not loaded while a page is being preloaded, but 192590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// are loaded when the page is displayed. 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 1931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/306715 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin PrerenderDelayLoadPlugin 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/306715 1942a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderDelayLoadPlugin) { 1943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL("files/prerender/plugin_delay_load.html", 1944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FINAL_STATUS_USED, 1945a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1948a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks that plugins are not loaded on prerendering pages when click-to-play 1950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// is enabled. 1951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickToPlay) { 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable click-to-play. 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* content_settings_map = 195458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) current_browser()->profile()->GetHostContentSettingsMap(); 195558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content_settings_map->SetDefaultContentSetting( 195658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 195758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 195858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_click_to_play.html", 195958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FINAL_STATUS_USED, 196058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1); 196158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NavigateToDestURL(); 196258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 196358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 196458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Checks that we don't load a NaCl plugin when NaCl is disabled. 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNaClPluginDisabled) { 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_disabled.html", 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run this check again. When we try to load aa ppapi plugin, the 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "loadstart" event is asynchronously posted to a message loop. 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that earlier call could have been run before the 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the "loadstart" event was posted. 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): While this should reliably fail on regressions, the 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reliability depends on the specifics of ppapi plugin 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading. It would be great if we could avoid that. 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Checks that plugins in an iframe are not loaded while a page is 198390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// being preloaded, but are loaded when the page is displayed. 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 198758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 198858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#elif defined(OS_MACOSX) 198958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// http://crbug.com/100514 199058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 199158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin PrerenderIframeDelayLoadPlugin 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 199990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_PrerenderIframeDelayLoadPlugin) { 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a page that contains a prerender link to a page that contains an 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe with a source that requires http authentication. This should not 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// prerender successfully. 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderClientRedirectNavigateToFirst) { 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 20307dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderClientRedirectNavigateToSecond) { 20327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 20337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FINAL_STATUS_USED, 20347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2); 20357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NavigateToURL("files/prerender/prerender_page.html"); 20367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 20377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 20387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Checks that redirects with location.replace do not cancel a prerender and 20397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// and swap when navigating to the first page. 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLocationReplaceNavigateToFirst) { 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FINAL_STATUS_USED, 204490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and swap when navigating to the second. 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrerenderLocationReplaceNavigateToSecond) { 2052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FINAL_STATUS_USED, 2054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2); 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 2056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we get the right PPLT histograms for client redirect prerenders 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and navigations when the referring page is Google. 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLocationReplaceGWSHistograms) { 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMAHistogramHelper histograms; 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The loader page should look like Google. 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kGoogleDotCom("www.google.com"); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLoaderHostOverride(kGoogleDotCom); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_replace_state.html"); 2069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2070ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GURL dest_url = GetCrossDomainTestUrl( 2071ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "files/prerender/prerender_deferred_image.html"); 2072ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2073ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GURL prerender_url = test_server()->GetURL( 2074ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "files/prerender/prerender_location_replace.html?" + 2075ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch net::EscapeQueryParamValue(dest_url.spec(), false) + 2076ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "#prerender"); 2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL::Replacements replacements; 2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) replacements.SetHostStr(kGoogleDotCom); 2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prerender_url = prerender_url.ReplaceComponents(replacements); 2080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // title change before calling DidPrerenderPass. 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, prerender->number_of_loads()); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.Fetch(); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Although there is a client redirect, it is dropped from histograms because 2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // it is a Google URL. The target page itself does not load until after the 2095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // swap. 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 2097ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL navigate_url = test_server()->GetURL( 2099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 2101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "#navigate"); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) navigate_url = navigate_url.ReplaceComponents(replacements); 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationOrSwapObserver swap_observer( 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model(), 2106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetActiveWebContents(), 2); 2107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigate_url, Referrer(), CURRENT_TAB, 2109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) swap_observer.Wait(); 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.Fetch(); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLT", 1); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLTMatched", 1); 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) histograms.ExpectTotalCount( 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Prerender.gws_PerceivedPLTMatchedComplete", 1); 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The client redirect does /not/ count as a miss because it's a Google URL. 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.PerceivedPLTFirstAfterMiss", 0); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Checks that client-issued redirects work with prerendering. 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This version navigates to the final destination page, rather than the 2127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// page which does the redirection via a mouse click. 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderClientRedirectNavigateToSecondViaClick) { 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL prerender_url = test_server()->GetURL( 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html")); 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL destination_url = test_server()->GetURL( 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_page.html"); 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 2); 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OpenURLViaClick(destination_url); 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that a page served over HTTPS is correctly prerendered. 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::SpawnedTestServer https_server( 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(https_url, 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// page will not count as an "alias" for the prerendered page. 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderClientRedirectInIframe) { 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string redirect_path = CreateClientRedirect( 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 2159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 2167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 2174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToFirst) { 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecond) { 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 2191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 2192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 2195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// page which does the redirection via a mouse click. 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrerenderServerRedirectNavigateToSecondViaClick) { 2198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL prerender_url = test_server()->GetURL( 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html")); 2200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GURL destination_url = test_server()->GetURL( 2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "files/prerender/prerender_page.html"); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLViaClick(destination_url); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect( 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through an 222690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// iframe. This should not prerender successfully. 2227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) { 222890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_iframe.html", 2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FINAL_STATUS_DOWNLOAD, 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0); 223190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 223290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 223390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Prerenders a page that contains an automatic download triggered through 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Javascript changing the window.location. This should not prerender 2235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// successfully 2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { 2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FINAL_STATUS_DOWNLOAD, 223990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1); 224090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through a 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client-issued redirect. This should not prerender successfully. 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_refresh.html", 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is set when prerendering. 22517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { 22527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderTestURL("files/prerender/prerender_referrer.html", 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NavigateToDestURL(); 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Checks that the referrer is not set when prerendering and the source page is 2259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// HTTPS. 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderNoSSLReferrer) { 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UseHttpsSrcServer(); 2263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_no_referrer.html", 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that the referrer is set when prerendering is cancelled. 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrer) { 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestContentBrowserClient); 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ContentBrowserClient* original_browser_client = 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 2275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that popups on a prerendered page cause cancellation. 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_popup.html", 2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FINAL_STATUS_CREATE_NEW_WINDOW, 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0); 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that registering a protocol handler causes cancellation. 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRegisterProtocolHandler) { 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_register_protocol_handler.html", 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_REGISTER_PROTOCOL_HANDLER, 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that renderers using excessive memory will be terminated. 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) { 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderManager()); 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 30 * 1024 * 1024; 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The excessive memory kill may happen before or after the load event as it 230558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // happens asynchronously with IPC calls. Even if the test does not start 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allocating until after load, the browser process might notice before the 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message gets through. This happens on XP debug bots because they're so 2308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // slow. Instead, don't bother checking the load event count. 2309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisableLoadEventCheck(); 2310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL("files/prerender/prerender_excessive_memory.html", 2311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 0); 2312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Checks shutdown code while a prerender is active. 2315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 2316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisableJavascriptCalls(); 2317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisableLoadEventCheck(); 2318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 2319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_APP_TERMINATING, 2320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0); 2321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Checks that we don't prerender in an infinite loop. 2324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { 2325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 2326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 2327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<FinalStatus> expected_final_status_queue; 2329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_final_status_queue.push_back(FINAL_STATUS_USED); 2330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 2331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedVector<TestPrerender> prerenders = 2333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 2334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(prerenders[0]->contents()); 2335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Assert that the pending prerender is in there already. This relies on the 2336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 2337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the page load one. 2338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2U, GetLinkPrerenderCount()); 2339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 2340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Next url should be in pending list but not an active entry. 2342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 2343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NavigateToDestURL(); 2345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make sure the PrerenderContents for the next url is now in the manager and 2347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // not pending. This relies on pending prerenders being resolved in the same 2348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // event loop iteration as OnPrerenderStop. 2349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 2350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1U, GetLinkPrerenderCount()); 2351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 2352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Checks that we don't prerender in an infinite loop and multiple links are 2355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// handled correctly. 2356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderInfiniteLoopMultiple) { 2358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* const kHtmlFileA = 2359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "files/prerender/prerender_infinite_a_multiple.html"; 2360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* const kHtmlFileB = 2361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "files/prerender/prerender_infinite_b_multiple.html"; 2362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* const kHtmlFileC = 2363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "files/prerender/prerender_infinite_c_multiple.html"; 2364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This test is conceptually simplest if concurrency is at two, since we 2366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 2367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 2368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 2369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<FinalStatus> expected_final_status_queue; 2371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_final_status_queue.push_back(FINAL_STATUS_USED); 2372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 2373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 2374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedVector<TestPrerender> prerenders = 2376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 2377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(prerenders[0]->contents()); 2378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Next url should be in pending list but not an active entry. This relies on 2380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the fact that the renderer sends out the AddLinkRelPrerender IPC before 2381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // sending the page load one. 2382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(3U, GetLinkPrerenderCount()); 2383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 2384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 2385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 2386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 23873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NavigateToDestURL(); 2388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make sure the PrerenderContents for the next urls are now in the manager 2390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and not pending. One and only one of the URLs (the last seen) should be the 2391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // active entry. This relies on pending prerenders being resolved in the same 2392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // event loop iteration as OnPrerenderStop. 2393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, GetRunningLinkPrerenderCount()); 2398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that pending prerenders are aborted (and never launched) when launched 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a prerender that itself gets aborted. 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAbortPendingOnCancel) { 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, FINAL_STATUS_CANCELLED, 1); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the page load one. 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cancel the prerender. 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender->WaitForStop(); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All prerenders are now gone. 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerBeforePrerender) { 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 original = MatchTaskManagerTab("Preloader"); 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 prerender = MatchTaskManagerPrerender("Prerender Page"); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the task manager. This populates the model. 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerender a page in addition to the original tab. 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A TaskManager entry should appear like "Prerender: Prerender Page" 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // alongside the original tab entry. There should be just these two entries. 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, final)); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap in the prerendered content. 2450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 2451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The "Prerender: " TaskManager entry should disappear, being replaced by a 2453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // "Tab: Prerender Page" entry, and nothing else. 2454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, prerender)); 2455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, original)); 2456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerAfterPrerender) { 24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::string16 original = MatchTaskManagerTab("Preloader"); 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::string16 prerender = MatchTaskManagerPrerender("Prerender Page"); 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with two resources. 24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Show the task manager. This populates the model. Importantly, we're doing 24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this after the prerender WebContents already exists - the task manager 24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needs to find it, it can't just listen for creation. 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A TaskManager entry should appear like "Prerender: Prerender Page" 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, final)); 24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2483a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Swap in the tab. 2484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 2485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The "Prerender: Prerender Page" TaskManager row should disappear, being 2487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // replaced by "Tab: Prerender Page" 2488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, prerender)); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, original)); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerAfterSwapIn) { 24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 24982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerender, and swap it in. 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 2503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Show the task manager. This populates the model. Importantly, we're doing 2505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // this after the prerender has been swapped in. 2506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 2507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // We should not see a prerender resource in the task manager, just a normal 2509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // page. 2510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks that audio loads are deferred on prerendering. 2516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Audio) { 2517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio.html", 2518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_USED, 2519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1); 2520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NavigateToDestURL(); 2521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2524a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 2525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the prerender is swapped in if autoplay is set. 2526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioAutoplay) { 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_autoplay.html", 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the prerender is swapped in if js starts playing. 2536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioJsplay) { 2537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_jsplay.html", 2538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FINAL_STATUS_USED, 2539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1); 2540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that video loads are deferred on prerendering. 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Video) { 2546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL("files/prerender/prerender_html5_video.html", 2547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_USED, 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NavigateToDestURL(); 2550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 2551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Checks that video tags inserted by javascript are deferred and played 2554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// correctly on swap in. 2555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoJs) { 2556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL("files/prerender/prerender_html5_video_script.html", 2557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_USED, 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 2560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 2561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Checks for correct network events by using a busy sleep the javascript. 2564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoNetwork) { 2565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DisableJavascriptCalls(); 2566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TestPrerender> prerender = 2567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL("files/prerender/prerender_html5_video_network.html", 2568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_USED, 2569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1); 2570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 2571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 2572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NavigateToDestURL(); 2573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 2574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that scripts can retrieve the correct window size while prerendering. 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowSize) { 25782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_size.html", 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 2582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jam): http://crbug.com/350550 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !(defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)) 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerenderers will terminate when the RenderView crashes. 2588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestPrerender> prerender = 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_RENDERER_CRASHED, 259290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1); 259390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 259490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Navigate to about:crash and then wait for the renderer to crash. 259590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(prerender->contents()); 259690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(prerender->contents()->prerender_contents()); 259790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prerender->contents()->prerender_contents()->GetController(). 259890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadURL( 259990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL(content::kChromeUICrashURL), 260090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::Referrer(), 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender->WaitForStop(); 2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderPageWithFragment) { 26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html#fragment", 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 26122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 26142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 26182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 26203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderPageWithRedirectedFragment) { 26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL( 26253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch CreateClientRedirect("files/prerender/prerender_page.html#fragment"), 26263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch FINAL_STATUS_USED, 26273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 2); 26283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 26293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ChannelDestructionWatcher channel_close_watcher; 26303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 26313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetActiveWebContents()->GetRenderProcessHost()); 26323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch NavigateToDestURL(); 26333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch channel_close_watcher.WaitForChannelClose(); 26342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 2636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Checks that we do not use a prerendered page when navigating from 2639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the main page to a fragment. 2640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageNavigateFragment) { 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html", 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 2645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NavigateToURLWithDisposition( 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, false); 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to the main page. 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderFragmentNavigatePage) { 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#fragment", 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2657a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToURLWithDisposition( 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/no_prerender_page.html", 2659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CURRENT_TAB, false); 2660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 2663a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// but navigate to a different fragment on the same page. 2664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderFragmentNavigateFragment) { 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#other_fragment", 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToURLWithDisposition( 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, false); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// redirect to refresh from a fragment on the same page. 26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderClientRedirectFromFragment) { 26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL( 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html#fragment"), 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithDisposition( 2683ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "files/prerender/no_prerender_page.html", 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, false); 26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh to a fragment on the same page. 2689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderClientRedirectToFragment) { 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html"), 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURLWithDisposition( 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CURRENT_TAB, false); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses JS to set 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the window.location.hash to a fragment on the same page. 27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageChangeFragmentLocationHash) { 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a PNG works correctly. 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.png", FINAL_STATUS_USED, 1); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a JPG works correctly. 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.jpeg", FINAL_STATUS_USED, 1); 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 27222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender of a CRX will result in a cancellation due to 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download. 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr GET requests allow prerenders. 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrGet) { 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_get.html", 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr HEAD requests allow prerenders. 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrHead) { 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_head.html", 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr OPTIONS requests allow prerenders. 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrOptions) { 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_options.html", 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 2750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr TRACE requests allow prerenders. 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrTrace) { 27562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_trace.html", 27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr POST requests allow prerenders. 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPost) { 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_post.html", 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr PUT cancels prerenders. 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) { 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr DELETE cancels prerenders. 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) { 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_delete.html", 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would trigger an SSL error is canceled. 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) { 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer https_server( 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 27947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderTestURL(https_url, 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_ERROR, 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from a subresource does not cancel 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer https_server( 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 282290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from an iframe does not cancel 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer https_server( 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2840ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 28427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) replacement_text, 28437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &replacement_path)); 28447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 28457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NavigateToDestURL(); 28467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 28477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 28487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that we cancel correctly when window.print() is called. 28497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { 28507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableLoadEventCheck(); 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_print.html", 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_PRINT, 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened in a new window by javascript and both the 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pages are in the same domain, the prerendered page is not used, due to 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window.opener. 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerWindowOpen) { 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaWindowOpen(); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that if a page is opened due to click on a href with target="_blank" 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and both pages are in the same domain the prerendered page is not used, due 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to window.opener. 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerClickTarget) { 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickTarget(); 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestClientCertStore : public net::ClientCertStore { 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestClientCertStore() {} 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestClientCertStore() {} 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::ClientCertStore: 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CertificateList* selected_certs, 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback) OVERRIDE { 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *selected_certs = net::CertificateList( 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, scoped_refptr<net::X509Certificate>( 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::X509Certificate("test", "test", base::Time(), base::Time()))); 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(); 28912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<net::ClientCertStore> CreateCertStore() { 289590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return scoped_ptr<net::ClientCertStore>(new TestClientCertStore); 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would normally request an SSL client 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate will never be seen since it's an https top-level resource. 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSSLClientCertTopLevel) { 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData::FromResourceContext( 29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_client_cert_store_factory_for_testing( 29052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CreateCertStore)); 29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ssl_options.request_client_certificate = true; 29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::SpawnedTestServer https_server( 29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 0); 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from a 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresource will cancel the prerendered page. 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderSSLClientCertSubresource) { 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData::FromResourceContext( 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_client_cert_store_factory_for_testing( 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CreateCertStore)); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer https_server( 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from an 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe will cancel the prerendered page. 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertIframe) { 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileIOData::FromResourceContext( 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_client_cert_store_factory_for_testing( 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CreateCertStore)); 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer https_server( 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 2965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) replacement_text, 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 2969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 0); 2970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(FULL_SAFE_BROWSING) 2973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Ensures that we do not prerender pages with a safe browsing 2974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// interstitial. 2975a3f7b4e666c476898878fa745f637129375cd889Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingTopLevel) { 2976a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 2977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 2978a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch url, SB_THREAT_TYPE_URL_MALWARE); 2979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 2980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_SAFE_BROWSING, 0); 2981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that server redirects to a malware page will cancel prerenders. 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingServerRedirect) { 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that client redirects to a malware page will cancel prerenders. 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingClientRedirect) { 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures that we do not prerender pages which have a malware subresource. 30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 30072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = test_server()->GetURL("files/prerender/image.jpeg"); 30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url, SB_THREAT_TYPE_URL_MALWARE); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(replacement_path, 30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 30212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Ensures that we do not prerender pages which have a malware iframe. 30242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingIframe) { 30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL iframe_url = test_server()->GetURL( 30262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 30272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iframe_url, SB_THREAT_TYPE_URL_MALWARE); 30292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_URL", iframe_url.spec())); 30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 30332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_iframe.html", 30352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(replacement_path, 30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0); 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that a local storage read will not cause prerender to fail. 30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageRead) { 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_read.html", 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 30492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 30502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that a local storage write will not cause prerender to fail. 30532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { 30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_write.html", 30552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 30587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that the favicon is properly loaded on prerender. 30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderFavicon) { 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_favicon.html", 3064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FINAL_STATUS_USED, 3065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1); 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!FaviconTabHelper::FromWebContents( 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents())->FaviconIsValid()) { 30702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the favicon has not been set yet, wait for it to be. 30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WindowedNotificationObserver favicon_update_watcher( 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_FAVICON_UPDATED, 3073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::Source<WebContents>(GetActiveWebContents())); 3074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch favicon_update_watcher.Wait(); 3075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(FaviconTabHelper::FromWebContents( 3077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetActiveWebContents())->FaviconIsValid()); 3078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that when a prerendered page is swapped in to a referring page, the 30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// unload handlers on the referring page are executed. 3082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { 30832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Matches URL in prerender_loader_with_unload.html. 3084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL unload_url("http://unload-url.test"); 3085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath empty_file = ui_test_utils::GetTestFilePath( 30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 3087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RequestCounter unload_counter; 30882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 30892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 30912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unload_url, empty_file, unload_counter.AsWeakPtr())); 30922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 30942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 30952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 30962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unload_counter.WaitForCount(1); 30972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that a hanging unload on the referring page of a prerender swap does 31002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not crash the browser on exit. 31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { 31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Matches URL in prerender_loader_with_unload.html. 31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL hang_url("http://unload-url.test"); 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 31083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 31093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) hang_url, empty_file, 31103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Closure())); 31113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 31123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 31133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that when the history is cleared, prerendering is cancelled and 3119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// prerendering history is cleared. 3120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 3121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 3124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1); 31252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ClearBrowsingData(current_browser(), BrowsingDataRemover::REMOVE_HISTORY); 3127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) prerender->WaitForStop(); 31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure prerender history was cleared. 31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, GetHistoryLength()); 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Checks that when the cache is cleared, prerenders are cancelled but 3134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// prerendering history is not cleared. 3135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearCache) { 31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearBrowsingData(current_browser(), BrowsingDataRemover::REMOVE_CACHE); 31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender->WaitForStop(); 31432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure prerender history was not cleared. Not a vital behavior, but 31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // used to compare with PrerenderClearHistory test. 31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetHistoryLength()); 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { 31502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CANCELLED, 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 3154 3155 GetPrerenderManager()->CancelAllPrerenders(); 3156 prerender->WaitForStop(); 3157 3158 EXPECT_FALSE(prerender->contents()); 3159} 3160 3161IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { 3162 scoped_ptr<TestPrerender> prerender = 3163 PrerenderTestURL("files/prerender/prerender_page.html", 3164 FINAL_STATUS_CANCELLED, 1); 3165 3166 GetPrerenderManager()->CancelAllPrerenders(); 3167 prerender->WaitForStop(); 3168 3169 EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 3170 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 3171 EXPECT_FALSE(HadPrerenderEventErrors()); 3172} 3173 3174// Cancels the prerender of a page with its own prerender. The second prerender 3175// should never be started. 3176IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3177 PrerenderCancelPrerenderWithPrerender) { 3178 scoped_ptr<TestPrerender> prerender = 3179 PrerenderTestURL("files/prerender/prerender_infinite_a.html", 3180 FINAL_STATUS_CANCELLED, 3181 1); 3182 3183 GetPrerenderManager()->CancelAllPrerenders(); 3184 prerender->WaitForStop(); 3185 3186 EXPECT_FALSE(prerender->contents()); 3187} 3188 3189// Prerendering and history tests. 3190// The prerendered page is navigated to in several ways [navigate via 3191// omnibox, click on link, key-modified click to open in background tab, etc], 3192// followed by a navigation to another page from the prerendered page, followed 3193// by a back navigation. 3194 3195IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { 3196 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3197 FINAL_STATUS_USED, 3198 1); 3199 NavigateToDestURL(); 3200 ClickToNextPageAfterPrerender(); 3201 GoBackToPrerender(); 3202} 3203 3204IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateNavigateGoBack) { 3205 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3206 FINAL_STATUS_USED, 3207 1); 3208 NavigateToDestURL(); 3209 NavigateToNextPageAfterPrerender(); 3210 GoBackToPrerender(); 3211} 3212 3213IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickClickGoBack) { 3214 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3215 FINAL_STATUS_USED, 3216 1); 3217 OpenDestURLViaClick(); 3218 ClickToNextPageAfterPrerender(); 3219 GoBackToPrerender(); 3220} 3221 3222IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { 3223 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3224 FINAL_STATUS_USED, 3225 1); 3226 OpenDestURLViaClick(); 3227 NavigateToNextPageAfterPrerender(); 3228 GoBackToPrerender(); 3229} 3230 3231IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { 3232 // Prerender currently doesn't interpose on this navigation. 3233 // http://crbug.com/345474. 3234 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3235 FINAL_STATUS_APP_TERMINATING, 3236 1); 3237 OpenDestURLViaClickNewWindow(); 3238} 3239 3240IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { 3241 // Prerender currently doesn't interpose on this navigation. 3242 // http://crbug.com/345474. 3243 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3244 FINAL_STATUS_APP_TERMINATING, 3245 1); 3246 OpenDestURLViaClickNewForegroundTab(); 3247} 3248 3249IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewBackgroundTab) { 3250 // Prerender currently doesn't interpose on this navigation. 3251 // http://crbug.com/345474. 3252 scoped_ptr<TestPrerender> prerender = 3253 PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3254 FINAL_STATUS_APP_TERMINATING, 3255 1); 3256 ASSERT_TRUE(prerender->contents()); 3257 prerender->contents()->set_should_be_shown(false); 3258 OpenDestURLViaClickNewBackgroundTab(); 3259} 3260 3261IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3262 NavigateToPrerenderedPageWhenDevToolsAttached) { 3263 DisableJavascriptCalls(); 3264 WebContents* web_contents = 3265 current_browser()->tab_strip_model()->GetActiveWebContents(); 3266 scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetOrCreateFor( 3267 web_contents->GetRenderViewHost())); 3268 DevToolsManager* manager = DevToolsManager::GetInstance(); 3269 FakeDevToolsClientHost client_host; 3270 manager->RegisterDevToolsClientHostFor(agent.get(), &client_host); 3271 const char* url = "files/prerender/prerender_page.html"; 3272 PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); 3273 NavigateToURLWithDisposition(url, CURRENT_TAB, false); 3274 manager->ClientHostClosing(&client_host); 3275} 3276 3277// Validate that the sessionStorage namespace remains the same when swapping 3278// in a prerendered page. 3279IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorage) { 3280 set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); 3281 PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 3282 FINAL_STATUS_USED, 3283 1); 3284 NavigateToDestURL(); 3285 GoBackToPageBeforePrerender(); 3286} 3287 3288// Checks that the control group works. An XHR PUT cannot be detected in the 3289// control group. 3290IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroup) { 3291 RestorePrerenderMode restore_prerender_mode; 3292 PrerenderManager::SetMode( 3293 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 3294 DisableJavascriptCalls(); 3295 PrerenderTestURL("files/prerender/prerender_xhr_put.html", 3296 FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 3297 NavigateToDestURL(); 3298} 3299 3300// Checks that the control group correctly hits WOULD_HAVE_BEEN_USED 3301// renderer-initiated navigations. (This verifies that the ShouldFork logic 3302// behaves correctly.) 3303IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroupRendererInitiated) { 3304 RestorePrerenderMode restore_prerender_mode; 3305 PrerenderManager::SetMode( 3306 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 3307 DisableJavascriptCalls(); 3308 PrerenderTestURL("files/prerender/prerender_xhr_put.html", 3309 FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 3310 OpenDestURLViaClick(); 3311} 3312 3313// Make sure that the MatchComplete dummy works in the normal case. Once 3314// a prerender is cancelled because of a script, a dummy must be created to 3315// account for the MatchComplete case, and it must have a final status of 3316// FINAL_STATUS_WOULD_HAVE_BEEN_USED. 3317IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { 3318 UMAHistogramHelper histograms; 3319 3320 std::vector<FinalStatus> expected_final_status_queue; 3321 expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 3322 expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 3323 PrerenderTestURL("files/prerender/prerender_xhr_put.html", 3324 expected_final_status_queue, 1); 3325 histograms.Fetch(); 3326 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 3327 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 3328 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 3329 histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 3330 3331 NavigateToDestURL(); 3332 histograms.Fetch(); 3333 histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 3334 histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 3335 histograms.ExpectTotalCount( 3336 "Prerender.websame_PerceivedPLTMatchedComplete", 1); 3337} 3338 3339// Verify that a navigation that hits a MatchComplete dummy while another is in 3340// progress does not also classify the previous navigation as a MatchComplete. 3341IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3342 MatchCompleteDummyCancelNavigation) { 3343 UMAHistogramHelper histograms; 3344 3345 // Arrange for a URL to hang. 3346 const GURL kNoCommitUrl("http://never-respond.example.com"); 3347 base::FilePath file(FILE_PATH_LITERAL( 3348 "chrome/test/data/prerender/prerender_page.html")); 3349 base::RunLoop hang_loop; 3350 BrowserThread::PostTask( 3351 BrowserThread::IO, FROM_HERE, 3352 base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 3353 kNoCommitUrl, file, hang_loop.QuitClosure())); 3354 3355 // First, fire a prerender that aborts after it completes its load. 3356 std::vector<FinalStatus> expected_final_status_queue; 3357 expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 3358 expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 3359 PrerenderTestURL("files/prerender/prerender_xhr_put.html", 3360 expected_final_status_queue, 1); 3361 histograms.Fetch(); 3362 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 3363 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 3364 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 3365 histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 3366 3367 // Open the hanging URL in a new tab. Wait for both the new tab to open and 3368 // the hanging request to be scheduled. 3369 ui_test_utils::NavigateToURLWithDisposition( 3370 current_browser(), kNoCommitUrl, NEW_FOREGROUND_TAB, 3371 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 3372 hang_loop.Run(); 3373 3374 // Now interrupt that navigation and navigate to the destination URL. This 3375 // should forcibly complete the previous navigation and also complete a 3376 // WOULD_HAVE_BEEN_PRERENDERED navigation. 3377 NavigateToDestURL(); 3378 histograms.Fetch(); 3379 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 2); 3380 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 3381 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 3382 histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 3383 histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 3384 histograms.ExpectTotalCount( 3385 "Prerender.websame_PerceivedPLTMatchedComplete", 1); 3386} 3387 3388class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { 3389 public: 3390 PrerenderBrowserTestWithNaCl() {} 3391 virtual ~PrerenderBrowserTestWithNaCl() {} 3392 3393 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 3394 PrerenderBrowserTest::SetUpCommandLine(command_line); 3395 command_line->AppendSwitch(switches::kEnableNaCl); 3396 } 3397}; 3398 3399// Check that NaCl plugins work when enabled, with prerendering. 3400IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl, 3401 PrerenderNaClPluginEnabled) { 3402#if defined(OS_WIN) && defined(USE_ASH) 3403 // Disable this test in Metro+Ash for now (http://crbug.com/262796). 3404 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 3405 return; 3406#endif 3407 3408 PrerenderTestURL("files/prerender/prerender_plugin_nacl_enabled.html", 3409 FINAL_STATUS_USED, 3410 1); 3411 NavigateToDestURL(); 3412 3413 // To avoid any chance of a race, we have to let the script send its response 3414 // asynchronously. 3415 WebContents* web_contents = 3416 browser()->tab_strip_model()->GetActiveWebContents(); 3417 bool display_test_result = false; 3418 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3419 "DidDisplayReallyPass()", 3420 &display_test_result)); 3421 ASSERT_TRUE(display_test_result); 3422} 3423 3424// Checks that the referrer policy is used when prerendering. 3425IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { 3426 set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 3427 PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 3428 FINAL_STATUS_USED, 3429 1); 3430 NavigateToDestURL(); 3431} 3432 3433// Checks that the referrer policy is used when prerendering on HTTPS. 3434IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3435 PrerenderSSLReferrerPolicy) { 3436 UseHttpsSrcServer(); 3437 set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 3438 PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 3439 FINAL_STATUS_USED, 3440 1); 3441 NavigateToDestURL(); 3442} 3443 3444// Checks that the referrer policy is used when prerendering is cancelled. 3445IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrerPolicy) { 3446 scoped_ptr<TestContentBrowserClient> test_content_browser_client( 3447 new TestContentBrowserClient); 3448 content::ContentBrowserClient* original_browser_client = 3449 content::SetBrowserClientForTesting(test_content_browser_client.get()); 3450 3451 set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 3452 PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 3453 FINAL_STATUS_CANCELLED, 3454 1); 3455 OpenDestURLViaClick(); 3456 3457 bool display_test_result = false; 3458 WebContents* web_contents = 3459 browser()->tab_strip_model()->GetActiveWebContents(); 3460 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 3461 web_contents, 3462 "window.domAutomationController.send(DidDisplayPass())", 3463 &display_test_result)); 3464 EXPECT_TRUE(display_test_result); 3465 3466 content::SetBrowserClientForTesting(original_browser_client); 3467} 3468 3469// Test interaction of the webNavigation and tabs API with prerender. 3470class PrerenderBrowserTestWithExtensions : public PrerenderBrowserTest, 3471 public ExtensionApiTest { 3472 public: 3473 PrerenderBrowserTestWithExtensions() { 3474 // The individual tests start the test server through ExtensionApiTest, so 3475 // the port number can be passed through to the extension. 3476 autostart_test_server_ = false; 3477 } 3478 3479 virtual void SetUp() OVERRIDE { 3480 PrerenderBrowserTest::SetUp(); 3481 } 3482 3483 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 3484 PrerenderBrowserTest::SetUpCommandLine(command_line); 3485 ExtensionApiTest::SetUpCommandLine(command_line); 3486 } 3487 3488 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 3489 PrerenderBrowserTest::SetUpInProcessBrowserTestFixture(); 3490 ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 3491 } 3492 3493 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 3494 PrerenderBrowserTest::TearDownInProcessBrowserTestFixture(); 3495 ExtensionApiTest::TearDownInProcessBrowserTestFixture(); 3496 } 3497 3498 virtual void SetUpOnMainThread() OVERRIDE { 3499 PrerenderBrowserTest::SetUpOnMainThread(); 3500 } 3501}; 3502 3503IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, WebNavigation) { 3504 ASSERT_TRUE(StartSpawnedTestServer()); 3505 extensions::FrameNavigationState::set_allow_extension_scheme(true); 3506 3507 // Wait for the extension to set itself up and return control to us. 3508 ASSERT_TRUE(RunExtensionTest("webnavigation/prerender")) << message_; 3509 3510 ResultCatcher catcher; 3511 3512 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3513 3514 ChannelDestructionWatcher channel_close_watcher; 3515 channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 3516 GetActiveWebContents()->GetRenderProcessHost()); 3517 NavigateToDestURL(); 3518 channel_close_watcher.WaitForChannelClose(); 3519 3520 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 3521 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 3522} 3523 3524IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, TabsApi) { 3525 ASSERT_TRUE(StartSpawnedTestServer()); 3526 extensions::FrameNavigationState::set_allow_extension_scheme(true); 3527 3528 // Wait for the extension to set itself up and return control to us. 3529 ASSERT_TRUE(RunExtensionTest("tabs/on_replaced")) << message_; 3530 3531 ResultCatcher catcher; 3532 3533 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3534 3535 ChannelDestructionWatcher channel_close_watcher; 3536 channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 3537 GetActiveWebContents()->GetRenderProcessHost()); 3538 NavigateToDestURL(); 3539 channel_close_watcher.WaitForChannelClose(); 3540 3541 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 3542 ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 3543} 3544 3545// Test that prerenders abort when navigating to a stream. 3546// See chrome/browser/extensions/api/streams_private/streams_private_apitest.cc 3547IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, StreamsTest) { 3548 ASSERT_TRUE(StartSpawnedTestServer()); 3549 3550 const extensions::Extension* extension = LoadExtension( 3551 test_data_dir_.AppendASCII("streams_private/handle_mime_type")); 3552 ASSERT_TRUE(extension); 3553 EXPECT_EQ(std::string(extension_misc::kStreamsPrivateTestExtensionId), 3554 extension->id()); 3555 MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); 3556 ASSERT_TRUE(handler); 3557 EXPECT_TRUE(handler->CanHandleMIMEType("application/msword")); 3558 3559 PrerenderTestURL("files/prerender/document.doc", FINAL_STATUS_DOWNLOAD, 0); 3560 3561 // Sanity-check that the extension would have picked up the stream in a normal 3562 // navigation had prerender not intercepted it. 3563 // streams_private/handle_mime_type reports success if it has handled the 3564 // application/msword type. 3565 ResultCatcher catcher; 3566 NavigateToDestURL(); 3567 EXPECT_TRUE(catcher.GetNextResult()); 3568} 3569 3570// Checks that non-http/https/chrome-extension subresource cancels the 3571// prerender. 3572IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3573 PrerenderCancelSubresourceUnsupportedScheme) { 3574 GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); 3575 std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3576 replacement_text.push_back( 3577 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3578 std::string replacement_path; 3579 ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3580 "files/prerender/prerender_with_image.html", 3581 replacement_text, 3582 &replacement_path)); 3583 PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 3584} 3585 3586// Ensure that about:blank is permitted for any subresource. 3587IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3588 PrerenderAllowAboutBlankSubresource) { 3589 GURL image_url = GURL("about:blank"); 3590 std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3591 replacement_text.push_back( 3592 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3593 std::string replacement_path; 3594 ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3595 "files/prerender/prerender_with_image.html", 3596 replacement_text, 3597 &replacement_path)); 3598 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3599 NavigateToDestURL(); 3600} 3601 3602// Checks that non-http/https/chrome-extension subresource cancels the prerender 3603// on redirect. 3604IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3605 PrerenderCancelSubresourceRedirectUnsupportedScheme) { 3606 GURL image_url = test_server()->GetURL( 3607 CreateServerRedirect("invalidscheme://www.google.com/test.jpg")); 3608 std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3609 replacement_text.push_back( 3610 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3611 std::string replacement_path; 3612 ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3613 "files/prerender/prerender_with_image.html", 3614 replacement_text, 3615 &replacement_path)); 3616 PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 3617} 3618 3619// Checks that chrome-extension subresource does not cancel the prerender. 3620IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3621 PrerenderKeepSubresourceExtensionScheme) { 3622 GURL image_url = GURL("chrome-extension://abcdefg/test.jpg"); 3623 std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3624 replacement_text.push_back( 3625 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3626 std::string replacement_path; 3627 ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3628 "files/prerender/prerender_with_image.html", 3629 replacement_text, 3630 &replacement_path)); 3631 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3632 NavigateToDestURL(); 3633} 3634 3635// Checks that redirect to chrome-extension subresource does not cancel the 3636// prerender. 3637IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3638 PrerenderKeepSubresourceRedirectExtensionScheme) { 3639 GURL image_url = test_server()->GetURL( 3640 CreateServerRedirect("chrome-extension://abcdefg/test.jpg")); 3641 std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3642 replacement_text.push_back( 3643 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3644 std::string replacement_path; 3645 ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3646 "files/prerender/prerender_with_image.html", 3647 replacement_text, 3648 &replacement_path)); 3649 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3650 NavigateToDestURL(); 3651} 3652 3653// Checks that non-http/https main page redirects cancel the prerender. 3654IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3655 PrerenderCancelMainFrameRedirectUnsupportedScheme) { 3656 GURL url = test_server()->GetURL( 3657 CreateServerRedirect("invalidscheme://www.google.com/test.html")); 3658 PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 3659} 3660 3661// Checks that media source video loads are deferred on prerendering. 3662IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { 3663 PrerenderTestURL("files/prerender/prerender_html5_video_media_source.html", 3664 FINAL_STATUS_USED, 3665 1); 3666 NavigateToDestURL(); 3667 WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 3668} 3669 3670// Checks that a prerender that creates an audio stream (via a WebAudioDevice) 3671// is cancelled. 3672IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWebAudioDevice) { 3673 DisableLoadEventCheck(); 3674 PrerenderTestURL("files/prerender/prerender_web_audio_device.html", 3675 FINAL_STATUS_CREATING_AUDIO_STREAM, 0); 3676} 3677 3678// Checks that prerenders do not swap in to WebContents being captured. 3679IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCapturedWebContents) { 3680 PrerenderTestURL("files/prerender/prerender_page.html", 3681 FINAL_STATUS_PAGE_BEING_CAPTURED, 1); 3682 WebContents* web_contents = GetActiveWebContents(); 3683 web_contents->IncrementCapturerCount(gfx::Size()); 3684 NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3685 web_contents->DecrementCapturerCount(); 3686} 3687 3688// Checks that prerenders are aborted on cross-process navigation from 3689// a server redirect. 3690IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3691 PrerenderCrossProcessServerRedirect) { 3692 // Force everything to be a process swap. 3693 SwapProcessesContentBrowserClient test_browser_client; 3694 content::ContentBrowserClient* original_browser_client = 3695 content::SetBrowserClientForTesting(&test_browser_client); 3696 3697 PrerenderTestURL( 3698 CreateServerRedirect("files/prerender/prerender_page.html"), 3699 FINAL_STATUS_OPEN_URL, 0); 3700 3701 content::SetBrowserClientForTesting(original_browser_client); 3702} 3703 3704// Checks that URLRequests for prerenders being aborted on cross-process 3705// navigation from a server redirect are cleaned up, so they don't keep cache 3706// entries locked. 3707// See http://crbug.com/341134 3708IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3709 PrerenderCrossProcessServerRedirectNoHang) { 3710 const char kDestPath[] = "files/prerender/prerender_page.html"; 3711 // Force everything to be a process swap. 3712 SwapProcessesContentBrowserClient test_browser_client; 3713 content::ContentBrowserClient* original_browser_client = 3714 content::SetBrowserClientForTesting(&test_browser_client); 3715 3716 PrerenderTestURL(CreateServerRedirect(kDestPath), FINAL_STATUS_OPEN_URL, 0); 3717 3718 ui_test_utils::NavigateToURL( 3719 browser(), 3720 test_server()->GetURL(kDestPath)); 3721 3722 content::SetBrowserClientForTesting(original_browser_client); 3723} 3724 3725// Checks that prerenders are aborted on cross-process navigation from 3726// a client redirect. 3727IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3728 PrerenderCrossProcessClientRedirect) { 3729 // Cross-process navigation logic for renderer-initiated navigations 3730 // is partially controlled by the renderer, namely 3731 // ChromeContentRendererClient. This test instead relies on the Web 3732 // Store triggering such navigations. 3733 std::string webstore_url = extension_urls::GetWebstoreLaunchURL(); 3734 3735 // Mock out requests to the Web Store. 3736 base::FilePath file(GetTestPath("prerender_page.html")); 3737 BrowserThread::PostTask( 3738 BrowserThread::IO, FROM_HERE, 3739 base::Bind(&CreateMockProtocolHandlerOnIO, 3740 GURL(webstore_url), file)); 3741 3742 PrerenderTestURL(CreateClientRedirect(webstore_url), 3743 FINAL_STATUS_OPEN_URL, 1); 3744} 3745 3746// Checks that canceling a MatchComplete dummy doesn't result in two 3747// stop events. 3748IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelMatchCompleteDummy) { 3749 std::vector<FinalStatus> expected_final_status_queue; 3750 expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 3751 expected_final_status_queue.push_back(FINAL_STATUS_CANCELLED); 3752 ScopedVector<TestPrerender> prerenders = 3753 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 3754 expected_final_status_queue, 0); 3755 3756 // Cancel the MatchComplete dummy. 3757 GetPrerenderManager()->CancelAllPrerenders(); 3758 prerenders[1]->WaitForStop(); 3759 3760 // Check the referring page only got one copy of the event. 3761 EXPECT_FALSE(HadPrerenderEventErrors()); 3762} 3763 3764// Checks that a deferred redirect to an image is not loaded until the page is 3765// visible. Also test the right histogram events are emitted in this case. 3766IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { 3767 DisableJavascriptCalls(); 3768 UMAHistogramHelper histograms; 3769 3770 // The prerender will not completely load until after the swap, so wait for a 3771 // title change before calling DidPrerenderPass. 3772 scoped_ptr<TestPrerender> prerender = 3773 PrerenderTestURL( 3774 "files/prerender/prerender_deferred_image.html", 3775 FINAL_STATUS_USED, 0); 3776 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 3777 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 3778 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 3779 EXPECT_EQ(0, prerender->number_of_loads()); 3780 histograms.Fetch(); 3781 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 3782 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 3783 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 3784 histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 3785 3786 // Swap. 3787 NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 3788 GetActiveWebContents()); 3789 ui_test_utils::NavigateToURLWithDisposition( 3790 current_browser(), dest_url(), CURRENT_TAB, 3791 ui_test_utils::BROWSER_TEST_NONE); 3792 swap_observer.Wait(); 3793 3794 // The prerender never observes the final load. 3795 EXPECT_EQ(0, prerender->number_of_loads()); 3796 3797 // Now check DidDisplayPass. 3798 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 3799 3800 histograms.Fetch(); 3801 histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 3802 histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 3803 histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 3804 histograms.ExpectTotalCount( 3805 "Prerender.websame_PerceivedPLTMatchedComplete", 1); 3806} 3807 3808// Checks that a deferred redirect to an image is not loaded until the 3809// page is visible, even after another redirect. 3810IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3811 PrerenderDeferredImageAfterRedirect) { 3812 DisableJavascriptCalls(); 3813 3814 // The prerender will not completely load until after the swap, so wait for a 3815 // title change before calling DidPrerenderPass. 3816 scoped_ptr<TestPrerender> prerender = 3817 PrerenderTestURL( 3818 "files/prerender/prerender_deferred_image.html", 3819 FINAL_STATUS_USED, 0); 3820 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 3821 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 3822 EXPECT_EQ(0, prerender->number_of_loads()); 3823 3824 // Swap. 3825 NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 3826 GetActiveWebContents()); 3827 ui_test_utils::NavigateToURLWithDisposition( 3828 current_browser(), dest_url(), CURRENT_TAB, 3829 ui_test_utils::BROWSER_TEST_NONE); 3830 swap_observer.Wait(); 3831 3832 // The prerender never observes the final load. 3833 EXPECT_EQ(0, prerender->number_of_loads()); 3834 3835 // Now check DidDisplayPass. 3836 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 3837} 3838 3839// Checks that deferred redirects in the main frame are followed. 3840IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredMainFrame) { 3841 DisableJavascriptCalls(); 3842 PrerenderTestURL( 3843 "files/prerender/image-deferred.png", 3844 FINAL_STATUS_USED, 1); 3845 NavigateToDestURL(); 3846} 3847 3848// Checks that deferred redirects in the main frame are followed, even 3849// with a double-redirect. 3850IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3851 PrerenderDeferredMainFrameAfterRedirect) { 3852 DisableJavascriptCalls(); 3853 PrerenderTestURL( 3854 CreateServerRedirect("files/prerender/image-deferred.png"), 3855 FINAL_STATUS_USED, 1); 3856 NavigateToDestURL(); 3857} 3858 3859// Checks that deferred redirects in a synchronous XHR abort the 3860// prerender. 3861IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { 3862 PrerenderTestURL("files/prerender/prerender_deferred_sync_xhr.html", 3863 FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); 3864 NavigateToDestURL(); 3865} 3866 3867// Checks that prerenders are not swapped for navigations with extra headers. 3868IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExtraHeadersNoSwap) { 3869 PrerenderTestURL("files/prerender/prerender_page.html", 3870 FINAL_STATUS_APP_TERMINATING, 1); 3871 3872 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 3873 content::PAGE_TRANSITION_TYPED, false); 3874 params.extra_headers = "X-Custom-Header: 42\r\n"; 3875 NavigateToURLWithParams(params, false); 3876} 3877 3878// Checks that prerenders are not swapped for navigations with browser-initiated 3879// POST data. 3880IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3881 PrerenderBrowserInitiatedPostNoSwap) { 3882 PrerenderTestURL("files/prerender/prerender_page.html", 3883 FINAL_STATUS_APP_TERMINATING, 1); 3884 3885 std::string post_data = "DATA"; 3886 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 3887 content::PAGE_TRANSITION_TYPED, false); 3888 params.uses_post = true; 3889 params.browser_initiated_post_data = 3890 base::RefCountedString::TakeString(&post_data); 3891 NavigateToURLWithParams(params, false); 3892} 3893 3894// Checks that the prerendering of a page is canceled correctly when the 3895// prerendered page tries to make a second navigation entry. 3896IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNewNavigationEntry) { 3897 PrerenderTestURL("files/prerender/prerender_new_entry.html", 3898 FINAL_STATUS_NEW_NAVIGATION_ENTRY, 3899 1); 3900} 3901 3902// Attempt a swap-in in a new tab, verifying that session storage namespace 3903// merging works. 3904IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTab) { 3905 // Mock out some URLs and count the number of requests to one of them. Both 3906 // prerender_session_storage.html and init_session_storage.html need to be 3907 // mocked so they are same-origin. 3908 const GURL kInitURL("http://prerender.test/init_session_storage.html"); 3909 base::FilePath init_file = GetTestPath("init_session_storage.html"); 3910 BrowserThread::PostTask( 3911 BrowserThread::IO, FROM_HERE, 3912 base::Bind(&CreateMockProtocolHandlerOnIO, kInitURL, init_file)); 3913 3914 const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 3915 base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 3916 RequestCounter counter; 3917 BrowserThread::PostTask( 3918 BrowserThread::IO, FROM_HERE, 3919 base::Bind(&CreateCountingProtocolHandlerOnIO, 3920 kTestURL, test_file, counter.AsWeakPtr())); 3921 3922 PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 3923 3924 // Open a new tab to navigate in. 3925 ui_test_utils::NavigateToURLWithDisposition( 3926 current_browser(), kInitURL, NEW_FOREGROUND_TAB, 3927 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 3928 3929 // Now navigate in the new tab. Set expect_swap_to_succeed to false because 3930 // the swap does not occur synchronously. 3931 // 3932 // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 3933 // return value assertion and let this go through the usual successful-swap 3934 // codepath. 3935 NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3936 3937 // Verify DidDisplayPass manually since the previous call skipped it. 3938 EXPECT_TRUE(DidDisplayPass( 3939 current_browser()->tab_strip_model()->GetActiveWebContents())); 3940 3941 // Only one request to the test URL started. 3942 // 3943 // TODO(davidben): Re-enable this check when the races in attaching the 3944 // throttle are resolved. http://crbug.com/335835 3945 // EXPECT_EQ(1, counter.count()); 3946} 3947 3948// Attempt a swap-in in a new tab, verifying that session storage namespace 3949// merging works. Unlike the above test, the swap is for a navigation that would 3950// normally be cross-process. 3951IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTabCrossProcess) { 3952 base::FilePath test_data_dir; 3953 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); 3954 3955 // Mock out some URLs and count the number of requests to one of them. Both 3956 // prerender_session_storage.html and init_session_storage.html need to be 3957 // mocked so they are same-origin. 3958 const GURL kInitURL("http://prerender.test/init_session_storage.html"); 3959 base::FilePath init_file = GetTestPath("init_session_storage.html"); 3960 BrowserThread::PostTask( 3961 BrowserThread::IO, FROM_HERE, 3962 base::Bind(&CreateMockProtocolHandlerOnIO, kInitURL, init_file)); 3963 3964 const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 3965 base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 3966 RequestCounter counter; 3967 BrowserThread::PostTask( 3968 BrowserThread::IO, FROM_HERE, 3969 base::Bind(&CreateCountingProtocolHandlerOnIO, 3970 kTestURL, test_file, counter.AsWeakPtr())); 3971 3972 PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 3973 3974 // Open a new tab to navigate in. 3975 ui_test_utils::NavigateToURLWithDisposition( 3976 current_browser(), kInitURL, NEW_FOREGROUND_TAB, 3977 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 3978 3979 // Navigate to about:blank so the next navigation is cross-process. 3980 ui_test_utils::NavigateToURL(current_browser(), 3981 GURL(content::kAboutBlankURL)); 3982 3983 // Now navigate in the new tab. Set expect_swap_to_succeed to false because 3984 // the swap does not occur synchronously. 3985 // 3986 // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 3987 // return value assertion and let this go through the usual successful-swap 3988 // codepath. 3989 NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3990 3991 // Verify DidDisplayPass manually since the previous call skipped it. 3992 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 3993 3994 // Only one request to the test URL started. 3995 // 3996 // TODO(davidben): Re-enable this check when the races in attaching the 3997 // throttle are resolved. http://crbug.com/335835 3998 // EXPECT_EQ(1, counter.count()); 3999} 4000 4001// Verify that session storage conflicts don't merge. 4002IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorageConflict) { 4003 PrerenderTestURL("files/prerender/prerender_session_storage_conflict.html", 4004 FINAL_STATUS_APP_TERMINATING, 1); 4005 4006 // Open a new tab to navigate in. 4007 ui_test_utils::NavigateToURLWithDisposition( 4008 current_browser(), 4009 test_server()->GetURL("files/prerender/init_session_storage.html"), 4010 NEW_FOREGROUND_TAB, 4011 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4012 4013 // Now navigate in the new tab. 4014 NavigateToDestURLWithDisposition(CURRENT_TAB, false); 4015 4016 // Verify DidDisplayPass in the new tab. 4017 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 4018} 4019 4020// Checks that prerenders honor |should_replace_current_entry|. 4021IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) { 4022 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 4023 4024 content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 4025 content::PAGE_TRANSITION_TYPED, false); 4026 params.should_replace_current_entry = true; 4027 NavigateToURLWithParams(params, false); 4028 4029 const NavigationController& controller = 4030 GetActiveWebContents()->GetController(); 4031 // First entry is about:blank, second is prerender_page.html. 4032 EXPECT_TRUE(controller.GetPendingEntry() == NULL); 4033 EXPECT_EQ(2, controller.GetEntryCount()); 4034 EXPECT_EQ(GURL(content::kAboutBlankURL), 4035 controller.GetEntryAtIndex(0)->GetURL()); 4036 EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); 4037} 4038 4039// Checks prerender does not hit DCHECKs and behaves properly if two pending 4040// swaps occur in a row. 4041IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { 4042 GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 4043 GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 4044 4045 GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); 4046 scoped_ptr<TestPrerender> prerender1 = 4047 PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); 4048 4049 GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); 4050 scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 4051 AddPrerender(url2, 1); 4052 prerender2->WaitForStart(); 4053 prerender2->WaitForLoads(1); 4054 4055 // There's no reason the second prerender can't be used, but the swap races 4056 // with didStartProvisionalLoad and didFailProvisionalLoad from the previous 4057 // navigation. The current logic will conservatively fail to swap under such 4058 // races. However, if the renderer is slow enough, it's possible for the 4059 // prerender to still be used, so don't program in either expectation. 4060 ASSERT_TRUE(prerender2->contents()); 4061 prerender2->contents()->set_skip_final_checks(true); 4062 4063 // Open a new tab to navigate in. 4064 ui_test_utils::NavigateToURLWithDisposition( 4065 current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, 4066 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4067 4068 // Fire off two navigations, without running the event loop between them. 4069 NavigationOrSwapObserver swap_observer( 4070 current_browser()->tab_strip_model(), 4071 GetActiveWebContents(), 2); 4072 current_browser()->OpenURL(OpenURLParams( 4073 url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 4074 current_browser()->OpenURL(OpenURLParams( 4075 url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 4076 swap_observer.Wait(); 4077 4078 // The WebContents should be on url2. There may be 2 or 3 entries, depending 4079 // on whether the first one managed to complete. 4080 // 4081 // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case 4082 // shouldn't be possible because it's throttled by the pending swap that 4083 // cannot complete. 4084 const NavigationController& controller = 4085 GetActiveWebContents()->GetController(); 4086 EXPECT_TRUE(controller.GetPendingEntry() == NULL); 4087 EXPECT_LE(2, controller.GetEntryCount()); 4088 EXPECT_GE(3, controller.GetEntryCount()); 4089 EXPECT_EQ(GURL(content::kAboutBlankURL), 4090 controller.GetEntryAtIndex(0)->GetURL()); 4091 EXPECT_EQ(url2, controller.GetEntryAtIndex( 4092 controller.GetEntryCount() - 1)->GetURL()); 4093} 4094 4095// Verify that pending swaps get aborted on new navigations. 4096IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 4097 PrerenderPendingSwapNewNavigation) { 4098 PrerenderManager::HangSessionStorageMergesForTesting(); 4099 4100 PrerenderTestURL("files/prerender/prerender_page.html", 4101 FINAL_STATUS_APP_TERMINATING, 1); 4102 4103 // Open a new tab to navigate in. 4104 ui_test_utils::NavigateToURLWithDisposition( 4105 current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, 4106 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4107 4108 // Navigate to the URL. Wait for DidStartLoading, just so it's definitely 4109 // progressed somewhere. 4110 content::WindowedNotificationObserver page_load_observer( 4111 content::NOTIFICATION_LOAD_START, 4112 content::Source<NavigationController>( 4113 &GetActiveWebContents()->GetController())); 4114 current_browser()->OpenURL(OpenURLParams( 4115 dest_url(), Referrer(), CURRENT_TAB, 4116 content::PAGE_TRANSITION_TYPED, false)); 4117 page_load_observer.Wait(); 4118 4119 // Navigate somewhere else. This should succeed and abort the pending swap. 4120 TestNavigationObserver nav_observer(GetActiveWebContents()); 4121 current_browser()->OpenURL(OpenURLParams( 4122 GURL(content::kAboutBlankURL), Referrer(), CURRENT_TAB, 4123 content::PAGE_TRANSITION_TYPED, false)); 4124 nav_observer.Wait(); 4125} 4126 4127// Checks that <a ping> requests are not dropped in prerender. 4128IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { 4129 // Count hits to a certain URL. 4130 const GURL kPingURL("http://prerender.test/ping"); 4131 base::FilePath empty_file = ui_test_utils::GetTestFilePath( 4132 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 4133 RequestCounter ping_counter; 4134 BrowserThread::PostTask( 4135 BrowserThread::IO, FROM_HERE, 4136 base::Bind(&CreateCountingProtocolHandlerOnIO, 4137 kPingURL, empty_file, ping_counter.AsWeakPtr())); 4138 4139 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 4140 OpenDestURLViaClickPing(kPingURL); 4141 4142 ping_counter.WaitForCount(1); 4143} 4144 4145IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPPLTNormalNavigation) { 4146 UMAHistogramHelper histograms; 4147 4148 GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 4149 ui_test_utils::NavigateToURL(current_browser(), url); 4150 histograms.Fetch(); 4151 histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 4152 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 4153 histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 4154} 4155 4156// Checks that a prerender which calls window.close() on itself is aborted. 4157IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { 4158 DisableLoadEventCheck(); 4159 PrerenderTestURL("files/prerender/prerender_window_close.html", 4160 FINAL_STATUS_CLOSED, 0); 4161} 4162 4163class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 4164 public: 4165 virtual void SetUpOnMainThread() OVERRIDE { 4166 Profile* normal_profile = current_browser()->profile(); 4167 set_browser(ui_test_utils::OpenURLOffTheRecord( 4168 normal_profile, GURL("about:blank"))); 4169 PrerenderBrowserTest::SetUpOnMainThread(); 4170 } 4171}; 4172 4173// Checks that prerendering works in incognito mode. 4174IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { 4175 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 4176 NavigateToDestURL(); 4177} 4178 4179// Checks that prerenders are aborted when an incognito profile is closed. 4180IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, 4181 PrerenderIncognitoClosed) { 4182 scoped_ptr<TestPrerender> prerender = 4183 PrerenderTestURL("files/prerender/prerender_page.html", 4184 FINAL_STATUS_PROFILE_DESTROYED, 1); 4185 current_browser()->window()->Close(); 4186 prerender->WaitForStop(); 4187} 4188 4189class PrerenderOmniboxBrowserTest : public PrerenderBrowserTest { 4190 public: 4191 LocationBar* GetLocationBar() { 4192 return current_browser()->window()->GetLocationBar(); 4193 } 4194 4195 OmniboxView* GetOmniboxView() { 4196 return GetLocationBar()->GetOmniboxView(); 4197 } 4198 4199 void WaitForAutocompleteDone(OmniboxView* omnibox_view) { 4200 AutocompleteController* controller = 4201 omnibox_view->model()->popup_model()->autocomplete_controller(); 4202 while (!controller->done()) { 4203 content::WindowedNotificationObserver ready_observer( 4204 chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY, 4205 content::Source<AutocompleteController>(controller)); 4206 ready_observer.Wait(); 4207 } 4208 } 4209 4210 predictors::AutocompleteActionPredictor* GetAutocompleteActionPredictor() { 4211 Profile* profile = current_browser()->profile(); 4212 return predictors::AutocompleteActionPredictorFactory::GetForProfile( 4213 profile); 4214 } 4215 4216 scoped_ptr<TestPrerender> StartOmniboxPrerender( 4217 const GURL& url, 4218 FinalStatus expected_final_status) { 4219 scoped_ptr<TestPrerender> prerender = 4220 ExpectPrerender(expected_final_status); 4221 WebContents* web_contents = GetActiveWebContents(); 4222 GetAutocompleteActionPredictor()->StartPrerendering( 4223 url, 4224 web_contents->GetController().GetSessionStorageNamespaceMap(), 4225 gfx::Size(50, 50)); 4226 prerender->WaitForStart(); 4227 return prerender.Pass(); 4228 } 4229}; 4230 4231// Checks that closing the omnibox popup cancels an omnibox prerender. 4232IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxCancel) { 4233 // Fake an omnibox prerender. 4234 scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( 4235 test_server()->GetURL("files/empty.html"), 4236 FINAL_STATUS_CANCELLED); 4237 4238 // Revert the location bar. This should cancel the prerender. 4239 GetLocationBar()->Revert(); 4240 prerender->WaitForStop(); 4241} 4242 4243// Checks that closing the omnibox popup cancels an omnibox prerender. 4244IN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxAbandon) { 4245 // Set the abandon timeout to something high so it does not introduce 4246 // flakiness if the prerender times out before the test completes. 4247 GetPrerenderManager()->mutable_config().abandon_time_to_live = 4248 base::TimeDelta::FromDays(999); 4249 4250 // Enter a URL into the Omnibox. 4251 OmniboxView* omnibox_view = GetOmniboxView(); 4252 omnibox_view->OnBeforePossibleChange(); 4253 omnibox_view->SetUserText( 4254 base::UTF8ToUTF16(test_server()->GetURL("files/empty.html?1").spec())); 4255 omnibox_view->OnAfterPossibleChange(); 4256 WaitForAutocompleteDone(omnibox_view); 4257 4258 // Fake an omnibox prerender for a different URL. 4259 scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( 4260 test_server()->GetURL("files/empty.html?2"), 4261 FINAL_STATUS_APP_TERMINATING); 4262 4263 // Navigate to the URL entered. 4264 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); 4265 4266 // Prerender should be running, but abandoned. 4267 EXPECT_TRUE( 4268 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); 4269} 4270 4271} // namespace prerender 4272