prerender_browsertest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/files/file_path.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/ref_counted_memory.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_vector.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben 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" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/predictors/autocomplete_action_predictor.h" 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (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" 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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" 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h" 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/omnibox/omnibox_edit_model.h" 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/omnibox/omnibox_popup_model.h" 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/omnibox/omnibox_view.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (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" 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/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" 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/uma_histogram_helper.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (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" 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/site_instance.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h" 86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/escape.h" 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/cert/x509_certificate.h" 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/ssl/client_cert_store.h" 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/url_request_interceptor.h" 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_job.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsClientHost; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using content::RenderFrameHost; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost; 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::TestNavigationObserver; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::WebContentsObserver; 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using task_manager::browsertest_util::WaitForTaskManagerRows; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerender tests work as follows: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A page with a prefetch link to the test page is loaded. Once prerendered, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its Javascript function DidPrerenderPass() is called, which returns true if 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page behaves as expected when prerendered. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is then displayed on a tab. The Javascript function 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidDisplayPass() is called, and returns true if the page behaved as it 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should while being displayed. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants used in the test HTML files. 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kReadyTitle = "READY"; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kPassTitle = "PASS"; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateClientRedirect(const std::string& dest_url) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kClientRedirectBase = "client-redirect?"; 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateServerRedirect(const std::string& dest_url) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kServerRedirectBase = "server-redirect?"; 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kServerRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears the specified data using BrowsingDataRemover. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearBrowsingData(Browser* browser, int remove_mask) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(browser->profile()); 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu BrowsingDataRemoverCompletionObserver observer(remover); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu observer.BlockUntilCompletion(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover deletes itself. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns true if the prerender is expected to abort on its own, before 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// attempting to swap it. 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShouldAbortPrerenderBeforeSwap(FinalStatus status) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_USED: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_WINDOW_OPENER: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_APP_TERMINATING: 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case FINAL_STATUS_PROFILE_DESTROYED: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll crash the renderer after it's loaded. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_RENDERER_CRASHED: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CANCELLED: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_DEVTOOLS_ATTACHED: 167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case FINAL_STATUS_PAGE_BEING_CAPTURED: 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case FINAL_STATUS_NAVIGATION_UNCOMMITTED: 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case FINAL_STATUS_WOULD_HAVE_BEEN_USED: 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Convenience function to wait for a title. Handles the case when the 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebContents already has the expected title. 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WaitForASCIITitle(WebContents* web_contents, 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* expected_title_ascii) { 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 expected_title = base::ASCIIToUTF16(expected_title_ascii); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_contents->GetTitle() == expected_title) 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for the destruction of a RenderProcessHost's IPC channel. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to make sure the PrerenderLinkManager's OnChannelClosed function has 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been called, before checking its state. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelDestructionWatcher { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ChannelDestructionWatcher() : channel_destroyed_(false) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ChannelDestructionWatcher() { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WatchChannel(content::RenderProcessHost* host) { 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new DestructionMessageFilter(this)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForChannelClose() { 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Run(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(channel_destroyed_); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When destroyed, calls ChannelDestructionWatcher::OnChannelDestroyed. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores all messages. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionMessageFilter : public content::BrowserMessageFilter { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter(0), 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) watcher_(watcher) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionMessageFilter() { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChannelDestructionWatcher::OnChannelDestroyed, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(watcher_))); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher* watcher_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionMessageFilter); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnChannelDestroyed() { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(channel_destroyed_); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_destroyed_ = true; 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Quit(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool channel_destroyed_; 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop run_loop_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A navigation observer to wait on either a new load or a swap of a 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebContents. On swap, if the new WebContents is still loading, wait for that 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// load to complete as well. Note that the load must begin after the observer is 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// attached. 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NavigationOrSwapObserver : public WebContentsObserver, 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public TabStripModelObserver { 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for either a new load or a swap of |tab_strip_model|'s active 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WebContents. 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents) 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(web_contents), 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_(false), 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(1) { 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for either |number_of_loads| loads or a swap of |tab_strip_model|'s 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // active WebContents. 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents, 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads) 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(web_contents), 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_(false), 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(number_of_loads) { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~NavigationOrSwapObserver() { 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->RemoveObserver(this); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void set_did_start_loading() { 2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch did_start_loading_ = true; 2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Wait() { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Run(); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WebContentsObserver implementation: 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidStartLoading(RenderViewHost* render_view_host) OVERRIDE { 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_ = true; 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!did_start_loading_) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_--; 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_loads_ == 0) 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Quit(); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TabStripModelObserver implementation: 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* old_contents, 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* new_contents, 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int index) OVERRIDE { 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (old_contents != web_contents()) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Switch to observing the new WebContents. 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Observe(new_contents); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_contents->IsLoading()) { 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the new WebContents is still loading, wait for it to complete. Only 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // one load post-swap is supported. 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_ = true; 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_ = 1; 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Quit(); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabStripModel* tab_strip_model_; 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_start_loading_; 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads_; 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop loop_; 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Waits for a new tab to open and a navigation or swap in it. 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NewTabNavigationOrSwapObserver { 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabNavigationOrSwapObserver() 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : new_tab_observer_( 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_TAB_ADDED, 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&NewTabNavigationOrSwapObserver::OnTabAdded, 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))) { 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Watch for NOTIFICATION_TAB_ADDED. Add a callback so that the 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NavigationOrSwapObserver can be attached synchronously and no events are 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // missed. 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Wait() { 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_tab_observer_.Wait(); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer_->Wait(); 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool OnTabAdded(const content::NotificationSource& source, 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationDetails& details) { 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (swap_observer_) 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* new_tab = content::Details<WebContents>(details).ptr(); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the TabStripModel. Assume this is attached to a Browser. 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabStripModel* tab_strip_model = 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<Browser*>(new_tab->GetDelegate())->tab_strip_model(); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer_.reset(new NavigationOrSwapObserver(tab_strip_model, 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_tab)); 3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch swap_observer_->set_did_start_loading(); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver new_tab_observer_; 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<NavigationOrSwapObserver> swap_observer_; 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderContents that stops the UI message loop on DidStopLoading(). 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrerenderContents : public PrerenderContents { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents( 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus expected_final_status) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PrerenderContents(prerender_manager, profile, url, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, origin, PrerenderManager::kNoExperiment), 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status), 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_(NULL), 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_(false), 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_(false), 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_shown_(expected_final_status == FINAL_STATUS_USED), 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_final_checks_(false) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestPrerenderContents() { 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (skip_final_checks_) 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_MAX) { 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MATCH_COMPLETE_REPLACEMENT, match_complete_status()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()) << 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " when testing URL " << prerender_url().path() << 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (Expected: " << NameFromFinalStatus(expected_final_status_) << 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerendering RenderViewHosts should be hidden before the first 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so this should be happen for every PrerenderContents for 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which a RenderViewHost is created, regardless of whether or not it's 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_render_view_host_) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(was_hidden_); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A used PrerenderContents will only be destroyed when we swap out 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents, at the end of a navigation caused by a call to 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigateToURLImpl(). 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_status() == FINAL_STATUS_USED) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_render_view_host_); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_be_shown_, was_shown_); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On quit, it's possible to end up here when render processes are closed 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the PrerenderManager is destroyed. As a result, it's possible to 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on quit. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's also possible for this to be called after we've been notified of 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app termination, but before we've been deleted, which is why the second 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check is needed. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING && 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status() != expected_final_status_) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderContents::RenderProcessGone(status); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual bool CheckURL(const GURL& url) OVERRIDE { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the PrerenderRendererCrash test. 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.spec() != content::kChromeUICrashURL) 4390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PrerenderContents::CheckURL(url); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tests that open the prerender in a new background tab, the RenderView 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not have been made visible when the PrerenderContents is destroyed 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though it is used. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_be_shown(bool value) { should_be_shown_ = value; } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For tests which do not know whether the prerender will be used. 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_skip_final_checks(bool value) { skip_final_checks_ = value; } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host) OVERRIDE { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to make sure the RenderViewHost is hidden and, if used, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequently shown. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar().Add( 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(new_render_view_host)); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_ = new_render_view_host; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::OnRenderViewHostCreated(new_render_view_host); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_render_view_host_, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(source).ptr()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = *content::Details<bool>(details).ptr(); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_visible) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_ = true; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_visible && was_hidden_) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once hidden, a prerendered RenderViewHost should only be shown after 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being removed from the PrerenderContents for display. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetRenderViewHost()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_ = true; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Observe(type, source, details); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RenderViewHost created for the prerender, if any. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host_; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is hidden. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_hidden_; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is shown, after having been 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hidden. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_shown_; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected final value of was_shown_. Defaults to true for 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FINAL_STATUS_USED, and false otherwise. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_shown_; 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If true, |expected_final_status_| and other shutdown checks are skipped. 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool skip_final_checks_; 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A handle to a TestPrerenderContents whose lifetime is under the caller's 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// control. A PrerenderContents may be destroyed at any point. This allows 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracking the final status, etc. 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestPrerender : public PrerenderContents::Observer, 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public base::SupportsWeakPtr<TestPrerender> { 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerender() 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : contents_(NULL), 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(0), 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_(0) { 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestPrerender() { 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (contents_) 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_->RemoveObserver(this); 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents() const { return contents_; } 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads() const { return number_of_loads_; } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForCreate() { create_loop_.Run(); } 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForStart() { start_loop_.Run(); } 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForStop() { stop_loop_.Run(); } 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for |number_of_loads()| to be at least |expected_number_of_loads| OR 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for the prerender to stop running (just to avoid a timeout if the prerender 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // dies). Note: this does not assert equality on the number of loads; the 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // caller must do it instead. 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForLoads(int expected_number_of_loads) { 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!load_waiter_); 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!expected_number_of_loads_); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_loads_ < expected_number_of_loads) { 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_.reset(new base::RunLoop); 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_ = expected_number_of_loads; 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Run(); 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_.reset(); 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_ = 0; 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LE(expected_number_of_loads, number_of_loads_); 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnPrerenderCreated(TestPrerenderContents* contents) { 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!contents_); 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_ = contents; 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_->AddObserver(this); 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) create_loop_.Quit(); 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PrerenderContents::Observer implementation: 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStart(PrerenderContents* contents) OVERRIDE { 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_loop_.Quit(); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderContents* contents) OVERRIDE { 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_++; 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (load_waiter_ && number_of_loads_ >= expected_number_of_loads_) 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Quit(); 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStop(PrerenderContents* contents) OVERRIDE { 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(contents_); 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_ = NULL; 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stop_loop_.Quit(); 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If there is a WaitForLoads call and it has yet to see the expected number 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // of loads, stop the loop so the test fails instead of timing out. 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (load_waiter_) 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Quit(); 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE { 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents_; 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads_; 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads_; 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> load_waiter_; 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop create_loop_; 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop start_loop_; 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop stop_loop_; 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestPrerender); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderManager that uses TestPrerenderContents. 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestPrerenderContentsFactory : public PrerenderContents::Factory { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContentsFactory() {} 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestPrerenderContentsFactory() { 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(expected_contents_queue_.empty()); 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerenderContents(FinalStatus final_status) { 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> handle(new TestPrerender()); 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_contents_queue_.push_back( 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents(final_status, handle->AsWeakPtr())); 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return handle.Pass(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) OVERRIDE { 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents expected; 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!expected_contents_queue_.empty()) { 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected = expected_contents_queue_.front(); 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_contents_queue_.pop_front(); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Creating prerender contents for " << url.path() << 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " with expected final status " << expected.final_status; 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << expected_contents_queue_.size() << " left in the queue."; 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents = 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new TestPrerenderContents(prerender_manager, 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile, url, referrer, origin, 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.final_status); 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (expected.handle) 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.handle->OnPrerenderCreated(contents); 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return contents; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct ExpectedContents { 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents() : final_status(FINAL_STATUS_MAX) { } 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents(FinalStatus final_status, 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<TestPrerender>& handle) 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : final_status(final_status), 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handle(handle) { 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus final_status; 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<TestPrerender> handle; 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::deque<ExpectedContents> expected_contents_queue_; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager implementation that returns a fixed result for 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a given URL. 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SafeBrowsingDatabaseManager(service), 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) threat_type_(SB_THREAT_TYPE_SAFE) { } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given url is safe or not. If we 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the url is safe, CheckUrl returns true. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it returns false, and "client" is called asynchronously with the 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result when it is ready. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true, indicating a SAFE result, unless the URL is the fixed URL 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the user, and the user-specified result is not SAFE 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in which that result will be communicated back via a call into the 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client, and false will be returned). 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides SafeBrowsingService::CheckBrowseUrl. 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gurl != url_ || threat_type_ == SB_THREAT_TYPE_SAFE) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone, 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, gurl, client)); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetThreatTypeForUrl(const GURL& url, SBThreatType threat_type) { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ = url; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingDatabaseManager() {} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCheckBrowseURLDone(const GURL& gurl, Client* client) { 68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<SBThreatType> expected_threats; 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check( 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL>(1, gurl), 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBFullHash>(), 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 69358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) safe_browsing_util::MALWARE, 69458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_check.url_results[0] = threat_type_; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->OnSafeBrowsingResult(sb_check); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService { 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingService() { } 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returned pointer has the same lifespan as the database_manager_ refcounted 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager() { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingService() { } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE { 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager_; 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingServiceFactory() : 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_(NULL) { } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingServiceFactory() { } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_ = new FakeSafeBrowsingService(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service() const { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service_; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDevToolsClientHost : public DevToolsClientHost { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost() {} 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDevToolsClientHost() {} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InspectedContentsClosing() OVERRIDE {} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DispatchOnInspectorFrontend(const std::string& msg) OVERRIDE {} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReplacedWithAnotherClient() OVERRIDE {} 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// URLRequestJob (and associated handler) which hangs. 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HangingURLRequestJob : public net::URLRequestJob { 770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HangingURLRequestJob(net::URLRequest* request, 772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : net::URLRequestJob(request, network_delegate) { 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Start() OVERRIDE {} 777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~HangingURLRequestJob() {} 780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 78246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class HangingFirstRequestInterceptor : public net::URLRequestInterceptor { 783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 78446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) HangingFirstRequestInterceptor(const base::FilePath& file, 78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Closure callback) 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : file_(file), 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_(callback), 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) first_run_(true) { 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 79046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~HangingFirstRequestInterceptor() {} 791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 79246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual net::URLRequestJob* MaybeInterceptRequest( 793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequest* request, 794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (first_run_) { 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) first_run_ = false; 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!callback_.is_null()) { 798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::UI, FROM_HERE, callback_); 800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new HangingURLRequestJob(request, network_delegate); 8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new content::URLRequestMockHTTPJob(request, network_delegate, file_); 804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_; 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback_; 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mutable bool first_run_; 810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 811868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes |url| never respond on the first load, and then with the contents of 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |file| afterwards. When the first load has been scheduled, runs |callback| on 8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the UI thread. 81546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CreateHangingFirstRequestInterceptorOnIO( 81646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GURL& url, const base::FilePath& file, base::Closure callback) { 817868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 81846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::URLRequestInterceptor> never_respond_handler( 81946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new HangingFirstRequestInterceptor(file, callback)); 82046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlInterceptor( 821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url, never_respond_handler.Pass()); 822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Wrapper over URLRequestMockHTTPJob that exposes extra callbacks. 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockHTTPJob : public content::URLRequestMockHTTPJob { 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHTTPJob(net::URLRequest* request, 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::NetworkDelegate* delegate, 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file) 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : content::URLRequestMockHTTPJob(request, delegate, file) { 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_start_callback(const base::Closure& start_callback) { 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_callback_ = start_callback; 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Start() OVERRIDE { 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!start_callback_.is_null()) 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_callback_.Run(); 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::URLRequestMockHTTPJob::Start(); 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MockHTTPJob() {} 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure start_callback_; 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Dummy counter class to live on the UI thread for counting requests. 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RequestCounter : public base::SupportsWeakPtr<RequestCounter> { 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter() : count_(0), expected_count_(-1) {} 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int count() const { return count_; } 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestStarted() { 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) count_++; 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (loop_ && count_ == expected_count_) 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_->Quit(); 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForCount(int expected_count) { 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(!loop_); 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(-1, expected_count_); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (count_ < expected_count) { 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_count_ = expected_count; 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.reset(new base::RunLoop); 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_->Run(); 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_count_ = -1; 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.reset(); 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_count, count_); 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int count_; 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_count_; 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> loop_; 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Protocol handler which counts the number of requests that start. 88146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class CountingInterceptor : public net::URLRequestInterceptor { 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 88346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CountingInterceptor(const base::FilePath& file, 88446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : file_(file), 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) counter_(counter), 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_(this) { 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 88946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~CountingInterceptor() {} 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 89146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual net::URLRequestJob* MaybeInterceptRequest( 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequest* request, 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHTTPJob* job = new MockHTTPJob(request, network_delegate, file_); 89546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) job->set_start_callback(base::Bind(&CountingInterceptor::RequestStarted, 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_.GetWeakPtr())); 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return job; 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestStarted() { 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RequestCounter::RequestStarted, counter_)); 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_; 9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<RequestCounter> counter_; 90946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) mutable base::WeakPtrFactory<CountingInterceptor> weak_factory_; 9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes |url| respond to requests with the contents of |file|, counting the 9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// number that start in |counter|. 91446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CreateCountingInterceptorOnIO( 9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file, 9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) { 9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 91946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::URLRequestInterceptor> request_interceptor( 92046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new CountingInterceptor(file, counter)); 92146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlInterceptor( 92246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url, request_interceptor.Pass()); 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Makes |url| respond to requests with the contents of |file|. 92646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CreateMockInterceptorOnIO(const GURL& url, const base::FilePath& file) { 9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 92846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlInterceptor( 92946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url, 93046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::URLRequestMockHTTPJob::CreateInterceptorForSingleFile(file)); 9314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 93368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A ContentBrowserClient that cancels all prerenderers on OpenURL. 93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class TestContentBrowserClient : public chrome::ChromeContentBrowserClient { 93568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 93668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestContentBrowserClient() {} 93768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~TestContentBrowserClient() {} 93868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 93968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 94068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool ShouldAllowOpenURL(content::SiteInstance* site_instance, 94168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& url) OVERRIDE { 94268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderManagerFactory::GetForProfile( 94368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext())) 94468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ->CancelAllPrerenders(); 94568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return chrome::ChromeContentBrowserClient::ShouldAllowOpenURL(site_instance, 94668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) url); 94768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 94868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 94968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 95068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient); 95168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 95268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A ContentBrowserClient that forces cross-process navigations. 9544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SwapProcessesContentBrowserClient 9554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public chrome::ChromeContentBrowserClient { 9564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 9574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient() {} 9584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~SwapProcessesContentBrowserClient() {} 9594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 9614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool ShouldSwapProcessesForRedirect( 9624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ResourceContext* resource_context, 9634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& current_url, 9644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& new_url) OVERRIDE { 9654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 9664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 9694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient); 9704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 9714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// An ExternalProtocolHandler that blocks everything and asserts it never is 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// called. 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NeverRunsExternalProtocolHandlerDelegate 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public ExternalProtocolHandler::Delegate { 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ExternalProtocolHandler::Delegate implementation. 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker( 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShellIntegration::DefaultWebClientObserver* observer, 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& protocol) OVERRIDE { 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This will crash, but it shouldn't get this far with BlockState::BLOCK 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // anyway. 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ExternalProtocolHandler::BlockState GetBlockState( 987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& scheme, 988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool initiated_by_user_gesture) OVERRIDE { 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Block everything and fail the test. 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ADD_FAILURE(); 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExternalProtocolHandler::BLOCK; 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BlockRequest() OVERRIDE { } 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void RunExternalProtocolDialog(const GURL& url, 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_process_host_id, 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int routing_id) OVERRIDE { 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void LaunchUrlWithoutSecurityCheck(const GURL& url) OVERRIDE { 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void FinishedProcessingCheck() OVERRIDE { 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetTestPath(const std::string& file_name) { 10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui_test_utils::GetTestFilePath( 10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("prerender")), 10105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath().AppendASCII(file_name)); 10115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Many of these tests are flaky. See http://crbug.com/249179 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTest : virtual public InProcessBrowserTest { 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest() 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : autostart_test_server_(true), 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents_factory_(NULL), 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_(true), 10254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_(true), 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_("files/prerender/prerender_loader.html"), 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_(NULL) {} 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTest() {} 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const { 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1035ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return web_contents->GetController().GetDefaultSessionStorageNamespace(); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 1045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 1046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SafeBrowsingService::RegisterFactory(NULL); 1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 1048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kPrerenderMode, 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValueEnabled); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugins directory isn't read by default on the Mac, so it needs to be 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly registered. 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_dir; 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP, &app_dir); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath( 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kExtraPluginDir, 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_dir.Append(FILE_PATH_LITERAL("plugins"))); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (autostart_test_server_) 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChromeResourceDispatcherHostDelegate:: 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetExternalProtocolHandlerDelegateForTesting( 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &external_protocol_handler_delegate_); 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager* prerender_manager = GetPrerenderManager(); 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender_manager); 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager->mutable_config().rate_limit_enabled = false; 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender_contents_factory_ == NULL); 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_factory_ = new TestPrerenderContentsFactory; 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager->SetPrerenderContentsFactory(prerender_contents_factory_); 10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Convenience function to get the currently active WebContents in 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // current_browser(). 10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* GetActiveWebContents() const { 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_browser()->tab_strip_model()->GetActiveWebContents(); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overload for a single expected final status 10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus expected_final_status, 10935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads) { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PrerenderTestURL(url, 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status, 10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURL( 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PrerenderTestURLImpl(url, 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue( 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, expected_final_status); 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<TestPrerender*> prerenders; 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURLImpl(url, 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads).release(&prerenders); 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(1u, prerenders.size()); 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<TestPrerender>(prerenders[0]); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Navigates to a URL, unrelated to prerendering 1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void NavigateStraightToURL(const std::string dest_html_file) { 1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), 1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_server()->GetURL(dest_html_file)); 1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURL() const { 1131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, true); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the url in a new tab, with no opener. 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURLWithDisposition( 1136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 11388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams( 11398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams(dest_url_, Referrer(), disposition, 11408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expect_swap_to_succeed); 11428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURL(const std::string& dest_html_file) const { 11458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithDisposition(dest_html_file, CURRENT_TAB, true); 11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLWithDisposition(const std::string& dest_html_file, 11498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WindowOpenDisposition disposition, 11508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expect_swap_to_succeed) const { 11518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL dest_url = test_server()->GetURL(dest_html_file); 11520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateToURLWithDisposition(dest_url, disposition, expect_swap_to_succeed); 11530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 11540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void NavigateToURLWithDisposition(const GURL& dest_url, 11560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) WindowOpenDisposition disposition, 11570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool expect_swap_to_succeed) const { 11588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams( 11598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams(dest_url, Referrer(), disposition, 11608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expect_swap_to_succeed); 11628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLWithParams(const content::OpenURLParams& params, 11658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expect_swap_to_succeed) const { 11668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLImpl(params, expect_swap_to_succeed); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClick() const { 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(dest_url_); 11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenURLViaClick(const GURL& url) const { 11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("Click", url, GURL(), false); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickTarget() const { 11785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ClickTarget", dest_url_, GURL(), true); 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenDestURLViaClickPing(const GURL& ping_url) const { 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ClickPing", dest_url_, ping_url, false); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewWindow() const { 11865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ShiftClick", dest_url_, GURL(), true); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewForegroundTab() const { 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("MetaShiftClick", dest_url_, GURL(), true); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("CtrlShiftClick", dest_url_, GURL(), true); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewBackgroundTab() const { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("MetaClick", dest_url_, GURL(), true); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 12015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("CtrlClick", dest_url_, GURL(), true); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaWindowOpen() const { 1206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OpenURLViaWindowOpen(dest_url_); 1207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OpenURLViaWindowOpen(const GURL& url) const { 1210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OpenURLWithJSImpl("WindowOpen", url, GURL(), true); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveLinkElement(int i) const { 1214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetActiveWebContents()->GetMainFrame()->ExecuteJavaScript( 1215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClickToNextPageAfterPrerender() { 12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 1220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 1221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("ClickOpenLink()")); 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nav_observer.Wait(); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToNextPageAfterPrerender() const { 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html")); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after the prerendered page has been navigated to and then away from. 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates back through the history to the prerendered page. 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPrerender() { 12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver back_nav_observer(GetActiveWebContents()); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool original_prerender_page = false; 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(IsOriginalPrerenderPage())", 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_prerender_page)); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(original_prerender_page); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Goes back to the page that was active before the prerender was swapped 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. This must be called when the prerendered page is the current page 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the active tab. 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPageBeforePrerender() { 12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* tab = GetActiveWebContents(); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab->IsLoading()); 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver back_nav_observer(tab); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool js_result; 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidBackToOriginalPagePass())", 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &js_result)); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(js_result); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const std::string& html_file) const { 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const GURL& url) const { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderManager()->FindPrerenderData( 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetSessionStorageNamespace()) != NULL; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UseHttpsSrcServer() { 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (https_src_server_) 12745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) https_src_server_.reset( 12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new net::SpawnedTestServer( 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(https_src_server_->Start()); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableJavascriptCalls() { 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_ = false; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void DisableLoadEventCheck() { 12884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_ = false; 12894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerModel* GetModel() const { 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TaskManager::GetInstance()->model(); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* GetPrerenderManager() const { 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile(current_browser()->profile()); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrerenderLinkManager* GetPrerenderLinkManager() const { 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager = 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManagerFactory::GetForProfile( 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetPrerenderEventCount(int index, const std::string& type) const { 1309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int event_count; 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 1311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "window.domAutomationController.send(" 1312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 1315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetActiveWebContents(), expression, &event_count)); 1316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return event_count; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool DidReceivePrerenderStartEventForLinkNumber(int index) const { 1320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; 1321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetPrerenderLoadEventCountForLinkNumber(int index) const { 1324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderload"); 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { 1328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderdomcontentloaded"); 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStopEventForLinkNumber(int index) const { 1332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderstop") > 0; 1333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void WaitForPrerenderEventCount(int index, 1336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& type, 1337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int count) const { 1338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int dummy; 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 1340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "WaitForPrerenderEventCount(%d, '%s', %d," 1341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " window.domAutomationController.send.bind(" 1342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " window.domAutomationController, 0))", 1343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) index, type.c_str(), count); 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 1346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetActiveWebContents(), expression, &dummy)); 1347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK_EQ(0, dummy); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HadPrerenderEventErrors() const { 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool had_prerender_event_errors; 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " hadPrerenderEventErrors))", 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &had_prerender_event_errors)); 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return had_prerender_event_errors; 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asserting on this can result in flaky tests. PrerenderHandles are 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // removed from the PrerenderLinkManager when the prerender is canceled from 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser, when the prerenders are cancelled from the renderer process, 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or the channel for the renderer process is closed on the IO thread. In the 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last case, the code must be careful to wait for the channel to close, as it 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is done asynchronously after swapping out the old process. See 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ChannelDestructionWatcher. 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->IsEmpty(); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetLinkPrerenderCount() const { 13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderLinkManager()->prerenders_.size(); 13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetRunningLinkPrerenderCount() const { 13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderLinkManager()->CountRunningPrerenders(); 13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns length of |prerender_manager_|'s history, or -1 on failure. 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetHistoryLength() const { 13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> prerender_dict( 13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<base::DictionaryValue*>( 13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->GetAsValue())); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict.get()) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* history_list; 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict->GetList("history", &history_list)) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(history_list->GetSize()); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return safe_browsing_factory_->most_recent_service()-> 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager(); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data = 1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPrerenderManager()->FindPrerenderData(url, NULL); 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TestPrerenderContents*>( 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_data ? prerender_data->contents() : NULL); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetLoaderHostOverride(const std::string& host) { 14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_host_override_ = host; 14085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver()->AddRule(host, "127.0.0.1"); 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_path(const std::string& path) { 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_ = path; 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_loader_query(const std::string& query) { 1416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loader_query_ = query; 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCrossDomainTestUrl(const std::string& path) { 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string secondary_domain = "www.foo.com"; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str(base::StringPrintf( 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s", 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_domain.c_str(), 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->host_port_pair().port(), 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.c_str())); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url_str); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_browser(Browser* browser) { 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_ = browser; 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() const { 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return explicitly_set_browser_ ? explicitly_set_browser_ : browser(); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& dest_url() const { 14398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return dest_url_; 14408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 14418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreasePrerenderMemory() { 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase the memory allowed in a prerendered page above normal settings. 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug build bots occasionally run against the default limit, and tests 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // were failing because the prerender was canceled due to memory exhaustion. 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/93076 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 1000 * 1024 * 1024; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DidPrerenderPass(WebContents* web_contents) const { 14515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool prerender_test_result = false; 14525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents, 14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(DidPrerenderPass())", 14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &prerender_test_result)) 14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender_test_result; 14585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DidDisplayPass(WebContents* web_contents) const { 14615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool display_test_result = false; 14625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents, 14645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 14655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &display_test_result)) 14665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return display_test_result; 14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerender(FinalStatus expected_final_status) { 14715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender_contents_factory_->ExpectPrerenderContents( 14725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status); 14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddPrerender(const GURL& url, int index) { 14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string javascript = base::StringPrintf( 14775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "AddPrerender('%s', %d)", url.spec().c_str(), index); 1478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 1479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 1480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns a string for pattern-matching TaskManager tab entries. 1483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 MatchTaskManagerTab(const char* page_title) { 1484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, 1485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(page_title)); 1486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns a string for pattern-matching TaskManager prerender entries. 1489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 MatchTaskManagerPrerender(const char* page_title) { 1490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, 1491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(page_title)); 14925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void RunJSReturningString(const char* js, std::string* result) { 1495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE( 1496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::ExecuteScriptAndExtractString( 1497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetActiveWebContents(), 1498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::StringPrintf("window.domAutomationController.send(%s)", 1499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) js).c_str(), 1500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result)); 1501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void RunJS(const char* js) { 1504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScript( 1505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetActiveWebContents(), 1506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::StringPrintf("window.domAutomationController.send(%s)", 1507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) js).c_str())); 1508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool autostart_test_server_; 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 15145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Remove this altogether so the tests don't globally assume 15155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only one prerender. 15165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* GetPrerenderContents() const { 15175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderContentsFor(dest_url_); 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURLImpl( 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads) { 15245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_url_ = prerender_url; 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(net::SpawnedTestServer::GetFilePathWithReplacements( 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_, 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::SpawnedTestServer* src_server = test_server(); 15365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (https_src_server_) 15375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) src_server = https_src_server_.get(); 1538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL loader_url = src_server->GetURL( 1539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) replacement_path + "&" + loader_query_); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL::Replacements loader_replacements; 15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!loader_host_override_.empty()) 15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_replacements.SetHostStr(loader_host_override_); 15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_url = loader_url.ReplaceComponents(loader_replacements); 15455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Running test with queue length " << 15475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.size(); 15485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!expected_final_status_queue.empty()); 15495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders; 15505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < expected_final_status_queue.size(); i++) { 15515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders.push_back( 15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_factory_->ExpectPrerenderContents( 15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue[i]).release()); 15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = expected_final_status_queue.front(); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the loader URL and then wait for the first prerender to be 15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // created. 15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), loader_url); 15615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForCreate(); 15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForLoads(expected_number_of_loads); 15635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 15655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will abort on its own. Assert it does so correctly. 15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForStop(); 15675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerenders[0]->contents()); 15685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, check that it prerendered correctly. 15715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (call_javascript_) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if page behaves as expected while in prerendered state. 15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender_contents->prerender_contents())); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test that the referring page received the right start and load events. 15845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 15855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (check_load_events_) { 15865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads()); 15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, 15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderLoadEventCountForLinkNumber(0)); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerenders.Pass(); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLImpl(const content::OpenURLParams& params, 1596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure in navigating we have a URL to use in the PrerenderManager. 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetPrerenderContents()->prerender_contents(); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate and wait for either the load to finish normally or for a swap to 16045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // occur. 16055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): The only handles CURRENT_TAB navigations, which is the 16065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only case tested or prerendered right now. 16075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(CURRENT_TAB, params.disposition); 16085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 16095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 16108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebContents* target_web_contents = current_browser()->OpenURL(params); 16115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 16128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (web_contents && expect_swap_to_succeed) { 16148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(web_contents, target_web_contents); 16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (call_javascript_) 16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(web_contents)); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Opens the prerendered page using javascript functions in the loader 16215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. |javascript_function_name| should be a 0 argument function which is 16225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // invoked. |new_web_contents| is true if the navigation is expected to 16235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // happen in a new WebContents via OpenURL. 16245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenURLWithJSImpl(const std::string& javascript_function_name, 16255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 16265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& ping_url, 16275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool new_web_contents) const { 16285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 1629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host = web_contents->GetMainFrame(); 16305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Extra arguments in JS are ignored. 16315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string javascript = base::StringPrintf( 16325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s('%s', '%s')", javascript_function_name.c_str(), 16335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.spec().c_str(), ping_url.spec().c_str()); 16345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_web_contents) { 16365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabNavigationOrSwapObserver observer; 1637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 16385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer.Wait(); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver observer(current_browser()->tab_strip_model(), 16415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents); 1642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 16434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer.Wait(); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContentsFactory* prerender_contents_factory_; 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NeverRunsExternalProtocolHandlerDelegate external_protocol_handler_delegate_; 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url_; 16535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::SpawnedTestServer> https_src_server_; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool call_javascript_; 16554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool check_load_events_; 16565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string loader_host_override_; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_path_; 1658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string loader_query_; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* explicitly_set_browser_; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a page is correctly prerendered in the case of a 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <link rel=prerender> tag and then loaded into a tab in response to a 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 16705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 16855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 16865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that cross-domain prerenders emit the correct histograms. 16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 16935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 1); 16975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 17005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 17015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PrerenderNotSwappedInPLT", 1); 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 17045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 17055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 17065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1); 17075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 17085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 17095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 17105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that pending prerenders launch and receive proper event treatment. 17125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 17135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 17145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_pending.html", 17155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 1); 17165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the prerender. 17185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 17195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 17205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Abort early if the original prerender didn't swap, so as not to hang. 17215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(prerender->contents()); 17225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the new prerender to be ready. 17245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForStart(); 17255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForLoads(1); 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL prerender_page_url = 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html"); 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContentsFor(prerender_page_url)); 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now navigate to our target page. 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 17355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), prerender_page_url, CURRENT_TAB, 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 17395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders which are canceled before they are launched 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// never get started. 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 1); 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 17515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { 1766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 1767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 1768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No ChannelDestructionWatcher is needed here, since prerenders in the 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderLinkManager should be deleted by removing the links, rather than 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting down the renderer process. 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 1774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prerender->WaitForStop(); 1775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_loader_query("links_to_insert=2"); 1791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 1792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 1793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(1); 1801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prerender->WaitForStop(); 1802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 1804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 1805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 1806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 1807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 1808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 1809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 1810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer events have arrived. 1811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinksOneLate) { 1816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 1817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 1818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 1820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 1821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 1); 1822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Add a second prerender for the same link. It reuses the prerender, so only 1824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the start event fires here. 1825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AddPrerender(url, 1); 1826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WaitForPrerenderEventCount(1, "webkitprerenderstart", 1); 1827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 1828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, GetPrerenderLoadEventCountForLinkNumber(1)); 1829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 1830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveLinkElement(0); 1832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveLinkElement(1); 1833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prerender->WaitForStop(); 1834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest, 1848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 1851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_loader_query("links_to_insert=2"); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 18715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the visibility API works. 18805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_visibility.html", 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly if we try to 1888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// swap it in before it commits. 1889868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { 1890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to a page that triggers a prerender for a URL that never commits. 1891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 18925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 18935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop prerender_start_loop; 1895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::PostTask( 1896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 189746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, 189846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) prerender_start_loop.QuitClosure())); 18994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 1900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(kNoCommitUrl, 19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_NAVIGATION_UNCOMMITTED, 1902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 0); 19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the hanging request to be scheduled. 19045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_start_loop.Run(); 1905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to the URL, but assume the contents won't be swapped in. 1907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Checks that client redirects don't add alias URLs until after they commit. 19110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap2) { 19120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Navigate to a page that then navigates to a URL that never commits. 19130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 19145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 19155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop prerender_start_loop; 19170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::PostTask( 19180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 191946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, 192046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) prerender_start_loop.QuitClosure())); 19210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DisableJavascriptCalls(); 19220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), 19230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 19245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the hanging request to be scheduled. 19255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_start_loop.Run(); 19260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 19270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Navigating to the second URL should not swap. 19280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateToURLWithDisposition(kNoCommitUrl, CURRENT_TAB, false); 19290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 19300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded while a page is being preloaded, but 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded when the page is displayed. 1949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 1951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_MACOSX) 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 1954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_LINUX) 1959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://crbug.com/306715 1960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin PrerenderDelayLoadPlugin 1963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 19644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://crbug.com/306715 1965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderDelayLoadPlugin) { 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/plugin_delay_load.html", 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded on prerendering pages when click-to-play 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is enabled. 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickToPlay) { 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable click-to-play. 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* content_settings_map = 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetHostContentSettingsMap(); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings_map->SetDefaultContentSetting( 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_click_to_play.html", 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't load a NaCl plugin when NaCl is disabled. 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNaClPluginDisabled) { 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_disabled.html", 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run this check again. When we try to load aa ppapi plugin, the 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "loadstart" event is asynchronously posted to a message loop. 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that earlier call could have been run before the 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the "loadstart" event was posted. 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): While this should reliably fail on regressions, the 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reliability depends on the specifics of ppapi plugin 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading. It would be great if we could avoid that. 20025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins in an iframe are not loaded while a page is 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being preloaded, but are loaded when the page is displayed. 2007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 2015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 2016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 2017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 2018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin PrerenderIframeDelayLoadPlugin 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderIframeDelayLoadPlugin) { 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a page that contains a prerender link to a page that contains an 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe with a source that requires http authentication. This should not 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender successfully. 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectNavigateToFirst) { 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderClientRedirectNavigateToSecond) { 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 2062f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and swap when navigating to the first page. 2063f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2064f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderLocationReplaceNavigateToFirst) { 2065f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2066f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED, 2067f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2); 2068f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDestURL(); 2069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2070f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2071f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 2072f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and swap when navigating to the second. 2073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderLocationReplaceNavigateToSecond) { 2075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED, 2077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2); 2078f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 2079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2080f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that we get the right PPLT histograms for client redirect prerenders 20825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// and navigations when the referring page is Google. 20835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderLocationReplaceGWSHistograms) { 20855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 20865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 20875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The loader page should look like Google. 20895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string kGoogleDotCom("www.google.com"); 20905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetLoaderHostOverride(kGoogleDotCom); 20915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_replace_state.html"); 20925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL dest_url = GetCrossDomainTestUrl( 20945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html"); 20955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 20975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 20985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 20995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#prerender"); 21005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL::Replacements replacements; 21015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) replacements.SetHostStr(kGoogleDotCom); 21025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_url = prerender_url.ReplaceComponents(replacements); 21035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 21055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 21065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 21075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 21085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 21095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 21105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, prerender->number_of_loads()); 21115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 21135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 21145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 21155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 21165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Although there is a client redirect, it is dropped from histograms because 21175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // it is a Google URL. The target page itself does not load until after the 21185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // swap. 21195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL navigate_url = test_server()->GetURL( 21225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 21235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 21245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#navigate"); 21255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_url = navigate_url.ReplaceComponents(replacements); 21265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer( 21285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model(), 21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 2); 21305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 21315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_url, Referrer(), CURRENT_TAB, 21325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 21335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 21345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 21365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 21385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 21395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLT", 1); 21405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLTMatched", 1); 21415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 21425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.gws_PerceivedPLTMatchedComplete", 1); 21435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The client redirect does /not/ count as a miss because it's a Google URL. 21455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.PerceivedPLTFirstAfterMiss", 0); 21465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectNavigateToSecondViaClick) { 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html")); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 21575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 2); 21585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(destination_url); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that a page served over HTTPS is correctly prerendered. 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 21767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectInIframe) { 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect( 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 21905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToFirst) { 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecond) { 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecondViaClick) { 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html")); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 22255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 22265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(destination_url); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect( 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through an 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe. This should not prerender successfully. 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) { 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_iframe.html", 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript changing the window.location. This should not prerender 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successfully 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through a 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client-issued redirect. This should not prerender successfully. 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_refresh.html", 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is set when prerendering. 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is not set when prerendering and the source page is 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTPS. 22837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderNoSSLReferrer) { 22855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UseHttpsSrcServer(); 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_no_referrer.html", 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer is set when prerendering is cancelled. 229368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrer) { 229468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 229568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 229668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 229768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 229868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 229968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 230068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 230168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 230268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 230368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 230568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 230668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 230768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 230868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that popups on a prerendered page cause cancellation. 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_popup.html", 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CREATE_NEW_WINDOW, 23134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that registering a protocol handler causes cancellation. 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRegisterProtocolHandler) { 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_register_protocol_handler.html", 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_REGISTER_PROTOCOL_HANDLER, 23204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that renderers using excessive memory will be terminated. 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) { 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderManager()); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 30 * 1024 * 1024; 23274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The excessive memory kill may happen before or after the load event as it 23284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // happens asynchronously with IPC calls. Even if the test does not start 23294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // allocating until after load, the browser process might notice before the 23304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // message gets through. This happens on XP debug bots because they're so 23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // slow. Instead, don't bother checking the load event count. 23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableLoadEventCheck(); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_excessive_memory.html", 23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 0); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks shutdown code while a prerender is active. 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 23394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 23405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableLoadEventCheck(); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop. 23475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 23565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 23575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerenders[0]->contents()); 23585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 23595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 23605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page load one. 23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure the PrerenderContents for the next url is now in the manager and 23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not pending. This relies on pending prerenders being resolved in the same 23715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event loop iteration as OnPrerenderStop. 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 23735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetLinkPrerenderCount()); 23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop and multiple links are 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handled correctly. 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderInfiniteLoopMultiple) { 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_a_multiple.html"; 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_b_multiple.html"; 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileC = 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_c_multiple.html"; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is conceptually simplest if concurrency is at two, since we 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 23995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 24005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerenders[0]->contents()); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next url should be in pending list but not an active entry. This relies on 24035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the fact that the renderer sends out the AddLinkRelPrerender IPC before 24045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // sending the page load one. 24055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(3U, GetLinkPrerenderCount()); 24065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next urls are now in the manager 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. One and only one of the URLs (the last seen) should be the 24145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // active entry. This relies on pending prerenders being resolved in the same 24155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event loop iteration as OnPrerenderStop. 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 24195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 24205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetRunningLinkPrerenderCount()); 24215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 24225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that pending prerenders are aborted (and never launched) when launched 24245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by a prerender that itself gets aborted. 24255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAbortPendingOnCancel) { 24265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 24275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 24285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 24305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, FINAL_STATUS_CANCELLED, 1); 24315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 24325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 24335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 24345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page load one. 24355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 24365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 24375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next url should be in pending list but not an active entry. 24395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 24405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cancel the prerender. 24425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 24435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 24445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All prerenders are now gone. 24465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerBeforePrerender) { 2450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 2451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 2452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 original = MatchTaskManagerTab("Preloader"); 2453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 prerender = MatchTaskManagerPrerender("Prerender Page"); 2454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 2455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the task manager. This populates the model. 2457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::OpenTaskManager(current_browser()); 2458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Prerender a page in addition to the original tab. 2462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 2463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A TaskManager entry should appear like "Prerender: Prerender Page" 2465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // alongside the original tab entry. There should be just these two entries. 2466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 2467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 2468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, final)); 2469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 2470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Swap in the prerendered content. 2473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 2474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The "Prerender: " TaskManager entry should disappear, being replaced by a 2476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // "Tab: Prerender Page" entry, and nothing else. 2477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, prerender)); 2478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, original)); 2479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerAfterPrerender) { 2485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 2486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 2487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 original = MatchTaskManagerTab("Preloader"); 2488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 prerender = MatchTaskManagerPrerender("Prerender Page"); 2489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with two resources. 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Show the task manager. This populates the model. Importantly, we're doing 2495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // this after the prerender WebContents already exists - the task manager 2496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // needs to find it, it can't just listen for creation. 2497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 2498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A TaskManager entry should appear like "Prerender: Prerender Page" 2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 2501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 2502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, final)); 2503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 2504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Swap in the tab. 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The "Prerender: Prerender Page" TaskManager row should disappear, being 2510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // replaced by "Tab: Prerender Page" 2511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, prerender)); 2512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, original)); 2513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerAfterSwapIn) { 2519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 2520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 2521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Prerender, and swap it in. 2524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 2525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 2526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Show the task manager. This populates the model. Importantly, we're doing 2528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // this after the prerender has been swapped in. 2529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 2530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We should not see a prerender resource in the task manager, just a normal 2532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // page. 2533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering. 2539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Audio) { 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio.html", 25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 25425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if autoplay is set. 2549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioAutoplay) { 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_autoplay.html", 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if js starts playing. 2559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioJsplay) { 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_jsplay.html", 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video loads are deferred on prerendering. 2568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Video) { 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video.html", 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video tags inserted by javascript are deferred and played 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly on swap in. 2578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoJs) { 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_script.html", 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks for correct network events by using a busy sleep the javascript. 2587c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoNetwork) { 25885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 25895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 25905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_network.html", 25915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 25925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 25945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 25955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that scripts can retrieve the correct window size while prerendering. 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowSize) { 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_size.html", 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 260723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// TODO(jam): http://crbug.com/350550 260823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !(defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)) 260923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerenderers will terminate when the RenderView crashes. 26115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { 26125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 26135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 26145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_RENDERER_CRASHED, 26155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to about:crash and then wait for the renderer to crash. 26185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 26195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()->prerender_contents()); 26205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->contents()->prerender_contents()->GetController(). 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURL( 26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(content::kChromeUICrashURL), 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 26265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 262823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageWithFragment) { 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html#fragment", 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageWithRedirectedFragment) { 2647d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderTestURL( 2648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html#fragment"), 2649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FINAL_STATUS_USED, 2650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2); 2651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2652d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 2653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 2654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 2655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToDestURL(); 2656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 2657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 2659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 2660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when navigating from 2662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the main page to a fragment. 2663d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2664d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageNavigateFragment) { 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html", 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to the main page. 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigatePage) { 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#fragment", 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2680d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2682d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to a different fragment on the same page. 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2688d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigateFragment) { 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#other_fragment", 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2692d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2693d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2694d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2697d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh from a fragment on the same page. 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2700d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectFromFragment) { 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 27024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html#fragment"), 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2705d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2706d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2707d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2710d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh to a fragment on the same page. 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2713d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectToFragment) { 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html"), 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2718d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2719d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2720d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses JS to set 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the window.location.hash to a fragment on the same page. 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageChangeFragmentLocationHash) { 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a PNG works correctly. 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.png", FINAL_STATUS_USED, 1); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a JPG works correctly. 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.jpeg", FINAL_STATUS_USED, 1); 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender of a CRX will result in a cancellation due to 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download. 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 27504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr GET requests allow prerenders. 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrGet) { 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_get.html", 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr HEAD requests allow prerenders. 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrHead) { 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_head.html", 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr OPTIONS requests allow prerenders. 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrOptions) { 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_options.html", 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr TRACE requests allow prerenders. 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrTrace) { 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_trace.html", 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr POST requests allow prerenders. 27865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPost) { 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_post.html", 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr PUT cancels prerenders. 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) { 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr DELETE cancels prerenders. 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) { 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_delete.html", 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would trigger an SSL error is canceled. 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) { 2809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 28124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_ERROR, 28194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from a subresource does not cancel 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 28294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from an iframe does not cancel 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { 2850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 28534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we cancel correctly when window.print() is called. 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { 28735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DisableLoadEventCheck(); 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_print.html", 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_PRINT, 28764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened in a new window by javascript and both the 2880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// pages are in the same domain, the prerendered page is not used, due to 2881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// there being other tabs in the same browsing instance. 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerWindowOpen) { 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2885cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaWindowOpen(); 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened due to click on a href with target="_blank" 2891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and both pages are in the same domain the prerendered page is not used, due 2892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// there being other tabs in the same browsing instance. 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerClickTarget) { 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickTarget(); 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Checks that prerenders do not get swapped into target pages that have opened 2902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// a popup, even if the target page itself does not have an opener. 2903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTargetHasPopup) { 2904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FINAL_STATUS_NON_EMPTY_BROWSING_INSTANCE, 2906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1); 2907f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OpenURLViaWindowOpen(GURL(url::kAboutBlankURL)); 2908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 2909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestClientCertStore : public net::ClientCertStore { 29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestClientCertStore() {} 29145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestClientCertStore() {} 29155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // net::ClientCertStore: 29175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, 29185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::CertificateList* selected_certs, 29195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Closure& callback) OVERRIDE { 29205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *selected_certs = net::CertificateList( 29215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, scoped_refptr<net::X509Certificate>( 29225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new net::X509Certificate("test", "test", base::Time(), base::Time()))); 29235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(); 29245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 29255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 29265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<net::ClientCertStore> CreateCertStore() { 29285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<net::ClientCertStore>(new TestClientCertStore); 29295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would normally request an SSL client 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate will never be seen since it's an https top-level resource. 2933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderSSLClientCertTopLevel) { 29355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 29365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 29385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 29424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 29464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 0); 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from a 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresource will cancel the prerendered page. 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSSLClientCertSubresource) { 29535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 29545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 29565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 29604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 29744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from an 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe will cancel the prerendered page. 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertIframe) { 29805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 29815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 29835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 29874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 30024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages with a safe browsing 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial. 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingTopLevel) { 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 30102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 30134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 0); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that server redirects to a malware page will cancel prerenders. 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingServerRedirect) { 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that client redirects to a malware page will cancel prerenders. 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingClientRedirect) { 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware subresource. 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url = test_server()->GetURL("files/prerender/image.jpeg"); 30412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url, SB_THREAT_TYPE_URL_MALWARE); 3043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 3047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware iframe. 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingIframe) { 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL iframe_url = test_server()->GetURL( 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iframe_url, SB_THREAT_TYPE_URL_MALWARE); 3062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", iframe_url.spec())); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 3066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage read will not cause prerender to fail. 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageRead) { 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_read.html", 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage write will not cause prerender to fail. 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_write.html", 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the favicon is properly loaded on prerender. 30945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderFavicon) { 30955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_favicon.html", 30975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 30985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 31005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!FaviconTabHelper::FromWebContents( 31025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents())->FaviconIsValid()) { 31035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the favicon has not been set yet, wait for it to be. 31045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver favicon_update_watcher( 31055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_FAVICON_UPDATED, 31065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<WebContents>(GetActiveWebContents())); 31075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_update_watcher.Wait(); 31085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(FaviconTabHelper::FromWebContents( 31105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents())->FaviconIsValid()); 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when a prerendered page is swapped in to a referring page, the 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unload handlers on the referring page are executed. 3115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { 3116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Matches URL in prerender_loader_with_unload.html. 3117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL unload_url("http://unload-url.test"); 3118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 3119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 3120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RequestCounter unload_counter; 3121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 3122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 312346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateCountingInterceptorOnIO, 3124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unload_url, empty_file, unload_counter.AsWeakPtr())); 3125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 3129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unload_counter.WaitForCount(1); 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Checks that a hanging unload on the referring page of a prerender swap does 3133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// not crash the browser on exit. 3134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { 3135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Matches URL in prerender_loader_with_unload.html. 3136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL hang_url("http://unload-url.test"); 3137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 3138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 3139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 3140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 314146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateHangingFirstRequestInterceptorOnIO, 3142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hang_url, empty_file, 3143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure())); 3144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 3146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 3148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the history is cleared, prerendering is cancelled and 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is cleared. 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 31545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 31575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ClearBrowsingData(current_browser(), BrowsingDataRemover::REMOVE_HISTORY); 31605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was cleared. 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetHistoryLength()); 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the cache is cleared, prerenders are cancelled but 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is not cleared. 31685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearCache) { 31695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 31725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ClearBrowsingData(current_browser(), BrowsingDataRemover::REMOVE_CACHE); 31755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was not cleared. Not a vital behavior, but 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to compare with PrerenderClearHistory test. 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetHistoryLength()); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { 31835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 31895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerender->contents()); 31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { 31955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 32005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 32052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancels the prerender of a page with its own prerender. The second prerender 32082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should never be started. 32092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 32102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelPrerenderWithPrerender) { 32115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 32125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_infinite_a.html", 32135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerender->contents()); 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerendering and history tests. 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is navigated to in several ways [navigate via 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox, click on link, key-modified click to open in background tab, etc], 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// followed by a navigation to another page from the prerendered page, followed 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a back navigation. 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateNavigateGoBack) { 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickClickGoBack) { 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32640529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { 32650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Prerender currently doesn't interpose on this navigation. 32660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://crbug.com/345474. 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FINAL_STATUS_USED, 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewWindow(); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32730529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { 32740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Prerender currently doesn't interpose on this navigation. 32750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://crbug.com/345474. 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FINAL_STATUS_USED, 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewForegroundTab(); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32820529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewBackgroundTab) { 32830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Prerender currently doesn't interpose on this navigation. 32840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://crbug.com/345474. 32855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 32865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 3287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FINAL_STATUS_USED, 32885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 32895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 32905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->contents()->set_should_be_shown(false); 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewBackgroundTab(); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPrerenderedPageWhenDevToolsAttached) { 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetOrCreateFor( 33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost())); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager* manager = DevToolsManager::GetInstance(); 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost client_host; 3303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manager->RegisterDevToolsClientHostFor(agent.get(), &client_host); 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url = "files/prerender/prerender_page.html"; 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); 33068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithDisposition(url, CURRENT_TAB, false); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->ClientHostClosing(&client_host); 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that the sessionStorage namespace remains the same when swapping 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a prerendered page. 33125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorage) { 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPageBeforePrerender(); 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that the control group works. An XHR PUT cannot be detected in the 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control group. 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroup) { 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 33274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 33285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that the control group correctly hits WOULD_HAVE_BEEN_USED 33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// renderer-initiated navigations. (This verifies that the ShouldFork logic 33355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// behaves correctly.) 33365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroupRendererInitiated) { 33375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 33385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::SetMode( 33395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 33405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 33415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 33435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenDestURLViaClick(); 33445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that the MatchComplete dummy works in the normal case. Once 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a prerender is cancelled because of a script, a dummy must be created to 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account for the MatchComplete case, and it must have a final status of 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FINAL_STATUS_WOULD_HAVE_BEEN_USED. 33505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { 33515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 33545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 33565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 1); 33585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 33605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 33615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 33625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 33635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 33675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 33685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 33695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 33705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that a navigation that hits a MatchComplete dummy while another is in 33735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// progress does not also classify the previous navigation as a MatchComplete. 33745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 33755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MatchCompleteDummyCancelNavigation) { 33765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 33775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Arrange for a URL to hang. 33795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 33805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL( 33815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome/test/data/prerender/prerender_page.html")); 33825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop hang_loop; 33835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 338546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, 338646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) file, hang_loop.QuitClosure())); 33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First, fire a prerender that aborts after it completes its load. 33895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 33905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 33915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 33925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 1); 33945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 33965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 33975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 33985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open the hanging URL in a new tab. Wait for both the new tab to open and 34015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the hanging request to be scheduled. 34025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 34035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kNoCommitUrl, NEW_FOREGROUND_TAB, 34045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 34055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hang_loop.Run(); 34065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now interrupt that navigation and navigate to the destination URL. This 34085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should forcibly complete the previous navigation and also complete a 34095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WOULD_HAVE_BEEN_PRERENDERED navigation. 34105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 34115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 34125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 2); 34135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 34145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 34155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 34165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 34175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 34185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTestWithNaCl() {} 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTestWithNaCl() {} 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableNaCl); 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that NaCl plugins work when enabled, with prerendering. 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl, 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderNaClPluginEnabled) { 3435ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 3436ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 3437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 3438ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 3439ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 3440ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_enabled.html", 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid any chance of a race, we have to let the script send its response 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 34482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 34492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "DidDisplayReallyPass()", 34532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &display_test_result)); 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(display_test_result); 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering. 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering on HTTPS. 34677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 34685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderSSLReferrerPolicy) { 34695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UseHttpsSrcServer(); 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 347768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer policy is used when prerendering is cancelled. 347868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrerPolicy) { 347968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 348068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 348168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 348268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 348368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 348468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 348568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 348668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 348768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 348868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 348968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 349068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool display_test_result = false; 349168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebContents* web_contents = 349268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 349368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 349468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_contents, 349568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 349668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &display_test_result)); 349768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(display_test_result); 349868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 349968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 350068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 350168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interaction of the webNavigation and tabs API with prerender. 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithExtensions : public PrerenderBrowserTest, 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionApiTest { 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 35061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrerenderBrowserTestWithExtensions() { 35071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The individual tests start the test server through ExtensionApiTest, so 35081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // the port number can be passed through to the extension. 35091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autostart_test_server_ = false; 35101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 35111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3512c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 3513c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PrerenderBrowserTest::SetUp(); 3514c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 3515c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpInProcessBrowserTestFixture(); 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::TearDownInProcessBrowserTestFixture(); 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::TearDownInProcessBrowserTestFixture(); 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, WebNavigation) { 35371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the extension to set itself up and return control to us. 35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("webnavigation/prerender")) << message_; 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 35482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 35492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 35512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 35552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35570529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, TabsApi) { 35581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the extension to set itself up and return control to us. 35620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(RunExtensionTest("tabs/on_replaced")) << message_; 35632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 35652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 35672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that prerenders abort when navigating to a stream. 3579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// See chrome/browser/extensions/api/streams_private/streams_private_apitest.cc 3580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, StreamsTest) { 3581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 3582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const extensions::Extension* extension = LoadExtension( 3584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test_data_dir_.AppendASCII("streams_private/handle_mime_type")); 3585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(extension); 3586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(std::string(extension_misc::kStreamsPrivateTestExtensionId), 3587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extension->id()); 3588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); 3589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(handler); 3590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(handler->CanHandleMIMEType("application/msword")); 3591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/document.doc", FINAL_STATUS_DOWNLOAD, 0); 3593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sanity-check that the extension would have picked up the stream in a normal 3595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // navigation had prerender not intercepted it. 3596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // streams_private/handle_mime_type reports success if it has handled the 3597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // application/msword type. 3598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResultCatcher catcher; 3599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 3600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()); 3601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the 3604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderCancelSubresourceUnsupportedScheme) { 36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); 3608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 36092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 36112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 36142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 36152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 36164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 36172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Ensure that about:blank is permitted for any subresource. 3620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderAllowAboutBlankSubresource) { 3622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL image_url = GURL("about:blank"); 3623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text.push_back( 3625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string replacement_path; 3627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text, 3630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &replacement_path)); 3631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 3633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the prerender 3636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// on redirect. 36372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelSubresourceRedirectUnsupportedScheme) { 36392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = test_server()->GetURL( 36402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.jpg")); 3641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 36422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 36432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 36442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 36462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 36472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 36482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 36494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that chrome-extension subresource does not cancel the prerender. 3653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceExtensionScheme) { 3655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = GURL("chrome-extension://abcdefg/test.jpg"); 3656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that redirect to chrome-extension subresource does not cancel the 3669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 3670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceRedirectExtensionScheme) { 3672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = test_server()->GetURL( 3673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateServerRedirect("chrome-extension://abcdefg/test.jpg")); 3674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 36862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that non-http/https main page redirects cancel the prerender. 36872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelMainFrameRedirectUnsupportedScheme) { 36892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL( 36902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.html")); 36914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 36922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that media source video loads are deferred on prerendering. 36957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { 36967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_media_source.html", 36977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FINAL_STATUS_USED, 36987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 36995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 37005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 37017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 37027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that a prerender that creates an audio stream (via a WebAudioDevice) 3704ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// is cancelled. 3705a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWebAudioDevice) { 3706a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DisableLoadEventCheck(); 3707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_web_audio_device.html", 3708a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FINAL_STATUS_CREATING_AUDIO_STREAM, 0); 3709ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3710ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3711ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that prerenders do not swap in to WebContents being captured. 3712ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCapturedWebContents) { 3713ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 3714ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_PAGE_BEING_CAPTURED, 1); 37155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 37165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents->IncrementCapturerCount(gfx::Size()); 3717ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3718ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->DecrementCapturerCount(); 3719ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3720ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 37214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 37224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a server redirect. 37234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessServerRedirect) { 37254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Force everything to be a process swap. 37264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 37274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ContentBrowserClient* original_browser_client = 37284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 37294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 37314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html"), 37324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 0); 37334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 37354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that URLRequests for prerenders being aborted on cross-process 37385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// navigation from a server redirect are cleaned up, so they don't keep cache 37395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// entries locked. 37405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See http://crbug.com/341134 37415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderCrossProcessServerRedirectNoHang) { 37435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char kDestPath[] = "files/prerender/prerender_page.html"; 37445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force everything to be a process swap. 37455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 37465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 37475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 37485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect(kDestPath), FINAL_STATUS_OPEN_URL, 0); 37505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL( 37525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser(), 37535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_server()->GetURL(kDestPath)); 37545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 37565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 37575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 37594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a client redirect. 37604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessClientRedirect) { 37624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cross-process navigation logic for renderer-initiated navigations 37634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is partially controlled by the renderer, namely 37644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ChromeContentRendererClient. This test instead relies on the Web 37654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Store triggering such navigations. 37664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string webstore_url = extension_urls::GetWebstoreLaunchURL(); 37674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Mock out requests to the Web Store. 37695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 37704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::PostTask( 37714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 377246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateMockInterceptorOnIO, GURL(webstore_url), file)); 37734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(CreateClientRedirect(webstore_url), 37754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 1); 37764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that canceling a MatchComplete dummy doesn't result in two 37794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// stop events. 37804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelMatchCompleteDummy) { 37815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 37824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 37834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_CANCELLED); 37845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 37855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 37865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 0); 37874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cancel the MatchComplete dummy. 37895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 37905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[1]->WaitForStop(); 37914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check the referring page only got one copy of the event. 37934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 37944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the page is 37975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// visible. Also test the right histogram events are emitted in this case. 37984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { 37995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 38005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 38015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 38035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 38045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 38055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL( 38065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html", 38075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 0); 38085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 38095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 38105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 38115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 38125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 38135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 38145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 38155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 38165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 38175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap. 38195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 38205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 38215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 38225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), dest_url(), CURRENT_TAB, 38235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 38245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 38255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender never observes the final load. 38275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 38285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now check DidDisplayPass. 38305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 38315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 38335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 38345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 38355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 38365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 38375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 38384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the 38414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page is visible, even after another redirect. 38424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 38434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredImageAfterRedirect) { 38445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 38455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 38475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 38485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 38495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL( 38505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html", 38515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 0); 38525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 38535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 38545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 38555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap. 38575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 38585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 38595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 38605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), dest_url(), CURRENT_TAB, 38615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 38625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 38635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender never observes the final load. 38655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 38665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now check DidDisplayPass. 38685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 38694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed. 38724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredMainFrame) { 38734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 38744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 38754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "files/prerender/image-deferred.png", 38764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 38774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 38784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed, even 38814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// with a double-redirect. 38824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 38834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredMainFrameAfterRedirect) { 38844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 38854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 38864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/image-deferred.png"), 38874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 38884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 38894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in a synchronous XHR abort the 38924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// prerender. 38934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { 38944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_deferred_sync_xhr.html", 38954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); 38964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 38974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that prerenders are not swapped for navigations with extra headers. 39008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExtraHeadersNoSwap) { 39018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 39028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 39038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 39048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 39058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 39068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.extra_headers = "X-Custom-Header: 42\r\n"; 39078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams(params, false); 39088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 39098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 39108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that prerenders are not swapped for navigations with browser-initiated 39118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// POST data. 39128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 39138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderBrowserInitiatedPostNoSwap) { 39148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 39158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 39168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 39178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string post_data = "DATA"; 39188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 39198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 39208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.uses_post = true; 39218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.browser_initiated_post_data = 39228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::RefCountedString::TakeString(&post_data); 39238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams(params, false); 39248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 39258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when the 3927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// prerendered page tries to make a second navigation entry. 3928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNewNavigationEntry) { 3929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_new_entry.html", 3930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_NEW_NAVIGATION_ENTRY, 3931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1); 3932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Attempt a swap-in in a new tab, verifying that session storage namespace 3935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// merging works. 3936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTab) { 39375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock out some URLs and count the number of requests to one of them. Both 39385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender_session_storage.html and init_session_storage.html need to be 39395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mocked so they are same-origin. 39405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kInitURL("http://prerender.test/init_session_storage.html"); 39415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath init_file = GetTestPath("init_session_storage.html"); 39425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 394446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateMockInterceptorOnIO, kInitURL, init_file)); 39455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 39475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 39485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter counter; 39495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 395146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateCountingInterceptorOnIO, 39525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTestURL, test_file, counter.AsWeakPtr())); 39535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 39555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 39575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 39585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kInitURL, NEW_FOREGROUND_TAB, 39595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 39605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. Set expect_swap_to_succeed to false because 39625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the swap does not occur synchronously. 39635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 39655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // return value assertion and let this go through the usual successful-swap 39665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // codepath. 39675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 39685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass manually since the previous call skipped it. 39705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass( 39715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents())); 39725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only one request to the test URL started. 39745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Re-enable this check when the races in attaching the 39765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle are resolved. http://crbug.com/335835 39775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EXPECT_EQ(1, counter.count()); 39785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Attempt a swap-in in a new tab, verifying that session storage namespace 39815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// merging works. Unlike the above test, the swap is for a navigation that would 39825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// normally be cross-process. 39835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTabCrossProcess) { 39845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_data_dir; 39855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); 39865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock out some URLs and count the number of requests to one of them. Both 39885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender_session_storage.html and init_session_storage.html need to be 39895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mocked so they are same-origin. 39905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kInitURL("http://prerender.test/init_session_storage.html"); 39915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath init_file = GetTestPath("init_session_storage.html"); 39925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 399446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateMockInterceptorOnIO, kInitURL, init_file)); 39955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 39975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 39985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter counter; 39995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 40005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 400146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateCountingInterceptorOnIO, 40025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTestURL, test_file, counter.AsWeakPtr())); 40035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 40055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 40075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 40085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kInitURL, NEW_FOREGROUND_TAB, 40095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 40105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to about:blank so the next navigation is cross-process. 4012f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), GURL(url::kAboutBlankURL)); 40135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. Set expect_swap_to_succeed to false because 40155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the swap does not occur synchronously. 40165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 40175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 40185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // return value assertion and let this go through the usual successful-swap 40195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // codepath. 40205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 40215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass manually since the previous call skipped it. 40235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 40245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only one request to the test URL started. 40265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 40275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Re-enable this check when the races in attaching the 40285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle are resolved. http://crbug.com/335835 40295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EXPECT_EQ(1, counter.count()); 40305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that session storage conflicts don't merge. 40335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorageConflict) { 40345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_session_storage_conflict.html", 40355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 40365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 40385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 40395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), 40405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_server()->GetURL("files/prerender/init_session_storage.html"), 40415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_FOREGROUND_TAB, 40425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 40435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. 40455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 40465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass in the new tab. 40485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 40495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that prerenders honor |should_replace_current_entry|. 40525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) { 40535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 40545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 40565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 40575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.should_replace_current_entry = true; 40585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToURLWithParams(params, false); 40595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NavigationController& controller = 40615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetController(); 40625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First entry is about:blank, second is prerender_page.html. 40635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(controller.GetPendingEntry() == NULL); 40645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2, controller.GetEntryCount()); 4065f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); 40665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); 40675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks prerender does not hit DCHECKs and behaves properly if two pending 40705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// swaps occur in a row. 40715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { 40725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 40735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 40745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); 40765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender1 = 40775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); 40785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); 40805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 40815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddPrerender(url2, 1); 40825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForStart(); 40835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForLoads(1); 40845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There's no reason the second prerender can't be used, but the swap races 40865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with didStartProvisionalLoad and didFailProvisionalLoad from the previous 40875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigation. The current logic will conservatively fail to swap under such 40885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // races. However, if the renderer is slow enough, it's possible for the 40895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender to still be used, so don't program in either expectation. 40905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender2->contents()); 40915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->contents()->set_skip_final_checks(true); 40925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 40945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4095f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) current_browser(), 4096f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(url::kAboutBlankURL), 4097f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NEW_FOREGROUND_TAB, 40985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 40995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fire off two navigations, without running the event loop between them. 41015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer( 41025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model(), 41035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 2); 41045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 41055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 41065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 41075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 41085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 41095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The WebContents should be on url2. There may be 2 or 3 entries, depending 41115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // on whether the first one managed to complete. 41125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 41135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case 41145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // shouldn't be possible because it's throttled by the pending swap that 41155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cannot complete. 41165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NavigationController& controller = 41175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetController(); 41185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(controller.GetPendingEntry() == NULL); 41195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LE(2, controller.GetEntryCount()); 41205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_GE(3, controller.GetEntryCount()); 4121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(GURL(url::kAboutBlankURL), controller.GetEntryAtIndex(0)->GetURL()); 41225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(url2, controller.GetEntryAtIndex( 41235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryCount() - 1)->GetURL()); 41245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that pending swaps get aborted on new navigations. 41275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 41285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderPendingSwapNewNavigation) { 41295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::HangSessionStorageMergesForTesting(); 41305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 41325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 41335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 41355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) current_browser(), 4137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(url::kAboutBlankURL), 4138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NEW_FOREGROUND_TAB, 41395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 41405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the URL. Wait for DidStartLoading, just so it's definitely 41425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // progressed somewhere. 41435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver page_load_observer( 41445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NOTIFICATION_LOAD_START, 41455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<NavigationController>( 41465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &GetActiveWebContents()->GetController())); 41475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 41485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_url(), Referrer(), CURRENT_TAB, 41495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 41505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_load_observer.Wait(); 41515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate somewhere else. This should succeed and abort the pending swap. 41535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 4154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams(GURL(url::kAboutBlankURL), 4155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Referrer(), 4156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CURRENT_TAB, 4157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 4158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 41595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nav_observer.Wait(); 41605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that <a ping> requests are not dropped in prerender. 41635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { 41645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Count hits to a certain URL. 41655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kPingURL("http://prerender.test/ping"); 41665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 41675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 41685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter ping_counter; 41695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 41705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 417146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&CreateCountingInterceptorOnIO, 41725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kPingURL, empty_file, ping_counter.AsWeakPtr())); 41735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 41755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenDestURLViaClickPing(kPingURL); 41765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ping_counter.WaitForCount(1); 41785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPPLTNormalNavigation) { 41815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 41825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 41845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), url); 41855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 41865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 41875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 41885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 41895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 4192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrerenderCookieChangeConflictTest) { 4193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigateStraightToURL( 4194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); 4195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url = test_server()->GetURL( 4197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); 4198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 4200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); 4201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddPrerender(url, 1); 4202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender->WaitForStart(); 4203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender->WaitForLoads(1); 4204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ensure that in the prerendered page, querying the cookie again 4205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // via javascript yields the same value that was set during load. 4206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 4207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The prerender has loaded. Ensure that the change is not visible 4209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to visible tabs. 4210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string value; 4211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunJSReturningString("GetCookie('c')", &value); 4212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(value, "1"); 4213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make a conflicting cookie change, which should cancel the prerender. 4215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunJS("SetCookie('c', '3')"); 4216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender->WaitForStop(); 4217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 4218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCookieChangeUseTest) { 4220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Permit 2 concurrent prerenders. 4221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 4222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 4223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Go to a first URL setting the cookie to value "1". 4225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigateStraightToURL( 4226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); 4227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Prerender a URL setting the cookie to value "2". 4229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url = test_server()->GetURL( 4230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "files/prerender/prerender_cookie.html?set=1&key=c&value=2"); 4231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestPrerender> prerender1 = ExpectPrerender(FINAL_STATUS_USED); 4233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddPrerender(url, 1); 4234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender1->WaitForStart(); 4235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender1->WaitForLoads(1); 4236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Launch a second prerender, setting the cookie to value "3". 4238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = 4239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); 4240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddPrerender(test_server()->GetURL( 4241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "files/prerender/prerender_cookie.html?set=1&key=c&value=3"), 1); 4242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender2->WaitForStart(); 4243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender2->WaitForLoads(1); 4244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Both prerenders have loaded. Ensure that the visible tab is still 4246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // unchanged and cannot see their changes. 4247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to visible tabs. 4248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string value; 4249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunJSReturningString("GetCookie('c')", &value); 4250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(value, "1"); 4251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Navigate to the prerendered URL. The first prerender should be swapped in, 4253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and the changes should now be visible. The second prerender should 4254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // be cancelled due to the conflict. 4255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_browser(), 4257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url, 4258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CURRENT_TAB, 4259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 4260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunJSReturningString("GetCookie('c')", &value); 4261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(value, "2"); 4262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender2->WaitForStop(); 4263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 4264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 4266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrerenderCookieChangeConflictHTTPHeaderTest) { 4267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NavigateStraightToURL( 4268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "files/prerender/prerender_cookie.html?set=1&key=c&value=1"); 4269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url = test_server()->GetURL("set-cookie?c=2"); 4271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 4272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExpectPrerender(FINAL_STATUS_COOKIE_CONFLICT); 4273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddPrerender(url, 1); 4274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender->WaitForStart(); 4275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender->WaitForLoads(1); 4276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The prerender has loaded. Ensure that the change is not visible 4278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to visible tabs. 4279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string value; 4280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunJSReturningString("GetCookie('c')", &value); 4281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(value, "1"); 4282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make a conflicting cookie change, which should cancel the prerender. 4284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunJS("SetCookie('c', '3')"); 4285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prerender->WaitForStop(); 4286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 4287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Checks that a prerender which calls window.close() on itself is aborted. 42895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { 42905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DisableLoadEventCheck(); 42915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrerenderTestURL("files/prerender/prerender_window_close.html", 42925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FINAL_STATUS_CLOSED, 0); 42935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 42945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 42955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 42965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 42975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 42985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* normal_profile = current_browser()->profile(); 42995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_browser(ui_test_utils::OpenURLOffTheRecord( 43005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) normal_profile, GURL("about:blank"))); 43015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 43025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 43035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 43045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 43055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that prerendering works in incognito mode. 43065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { 43075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 43085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 4309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 4310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Checks that prerenders are aborted when an incognito profile is closed. 43120529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, 43130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PrerenderIncognitoClosed) { 43140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<TestPrerender> prerender = 43150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 43160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FINAL_STATUS_PROFILE_DESTROYED, 1); 43170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch current_browser()->window()->Close(); 43180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch prerender->WaitForStop(); 43190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 43200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 43215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PrerenderOmniboxBrowserTest : public PrerenderBrowserTest { 43225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 43235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LocationBar* GetLocationBar() { 43245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return current_browser()->window()->GetLocationBar(); 43255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 43265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 43275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OmniboxView* GetOmniboxView() { 43285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetLocationBar()->GetOmniboxView(); 43295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 43305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 43315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void WaitForAutocompleteDone(OmniboxView* omnibox_view) { 43325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AutocompleteController* controller = 43335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu omnibox_view->model()->popup_model()->autocomplete_controller(); 43345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu while (!controller->done()) { 43355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::WindowedNotificationObserver ready_observer( 43365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY, 43375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::Source<AutocompleteController>(controller)); 43385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ready_observer.Wait(); 43395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 43405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 43415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 43425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu predictors::AutocompleteActionPredictor* GetAutocompleteActionPredictor() { 43435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Profile* profile = current_browser()->profile(); 43445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return predictors::AutocompleteActionPredictorFactory::GetForProfile( 43455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu profile); 43465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 43475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 43485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestPrerender> StartOmniboxPrerender( 43495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GURL& url, 43505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FinalStatus expected_final_status) { 43515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestPrerender> prerender = 43525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ExpectPrerender(expected_final_status); 43535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebContents* web_contents = GetActiveWebContents(); 43545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetAutocompleteActionPredictor()->StartPrerendering( 43555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url, 43565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_contents->GetController().GetSessionStorageNamespaceMap(), 43575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gfx::Size(50, 50)); 43585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prerender->WaitForStart(); 43595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return prerender.Pass(); 43605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 43615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 43625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 43635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Checks that closing the omnibox popup cancels an omnibox prerender. 43645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, PrerenderOmniboxCancel) { 4365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ensure the cookie store has been loaded. 4366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!GetPrerenderManager()->cookie_store_loaded()) { 4367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop loop; 4368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetPrerenderManager()->set_on_cookie_store_loaded_cb_for_testing( 4369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loop.QuitClosure()); 4370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loop.Run(); 4371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 43735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Fake an omnibox prerender. 43745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( 43755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_server()->GetURL("files/empty.html"), 43765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FINAL_STATUS_CANCELLED); 43775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 43785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Revert the location bar. This should cancel the prerender. 43795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetLocationBar()->Revert(); 43805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu prerender->WaitForStop(); 43815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 43825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Crashes on windows. The failure seems to be that the PrerenderOmniboxAbandon 4384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// test is setting up a call to the windows API RegisterApplicationRestart with 4385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// a command line that is too long (> 1024 characters). 4386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 4387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_PrerenderOmniboxAbandon DISABLED_PrerenderOmniboxAbandon 4388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 4389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_PrerenderOmniboxAbandon PrerenderOmniboxAbandon 4390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 4391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Checks that accepting omnibox input abandons an omnibox prerender. 4393116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderOmniboxBrowserTest, 4394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MAYBE_PrerenderOmniboxAbandon) { 43955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Set the abandon timeout to something high so it does not introduce 43965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // flakiness if the prerender times out before the test completes. 43975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetPrerenderManager()->mutable_config().abandon_time_to_live = 43985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::TimeDelta::FromDays(999); 43995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ensure the cookie store has been loaded. 4401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!GetPrerenderManager()->cookie_store_loaded()) { 4402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop loop; 4403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetPrerenderManager()->set_on_cookie_store_loaded_cb_for_testing( 4404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loop.QuitClosure()); 4405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loop.Run(); 4406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 44085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Enter a URL into the Omnibox. 44095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OmniboxView* omnibox_view = GetOmniboxView(); 44105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu omnibox_view->OnBeforePossibleChange(); 44115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu omnibox_view->SetUserText( 44125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::UTF8ToUTF16(test_server()->GetURL("files/empty.html?1").spec())); 44135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu omnibox_view->OnAfterPossibleChange(); 44145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WaitForAutocompleteDone(omnibox_view); 44155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 44165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Fake an omnibox prerender for a different URL. 44175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TestPrerender> prerender = StartOmniboxPrerender( 44185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu test_server()->GetURL("files/empty.html?2"), 44195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FINAL_STATUS_APP_TERMINATING); 44205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The final status may be either FINAL_STATUS_APP_TERMINATING or 4422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // FINAL_STATUS_CANCELLED. Although closing the omnibox will not cancel an 4423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // abandoned prerender, the AutocompleteActionPredictor will cancel the 4424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // predictor on destruction. 4425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) prerender->contents()->set_skip_final_checks(true); 4426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Navigate to the URL entered. 44285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu omnibox_view->model()->AcceptInput(CURRENT_TAB, false); 44295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 44305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Prerender should be running, but abandoned. 44315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE( 44325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); 44335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 44345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 4436