prerender_browsertest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/files/file_path.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/ref_counted_memory.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_vector.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/external_protocol/external_protocol_handler.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager_factory.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h" 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager_browsertest_util.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/mime_types_handler.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/uma_histogram_helper.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/site_instance.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h" 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/escape.h" 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/cert/x509_certificate.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/ssl/client_cert_store.h" 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_job.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsClientHost; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using content::RenderFrameHost; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::TestNavigationObserver; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::WebContentsObserver; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using task_manager::browsertest_util::WaitForTaskManagerRows; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerender tests work as follows: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A page with a prefetch link to the test page is loaded. Once prerendered, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its Javascript function DidPrerenderPass() is called, which returns true if 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page behaves as expected when prerendered. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is then displayed on a tab. The Javascript function 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidDisplayPass() is called, and returns true if the page behaved as it 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should while being displayed. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants used in the test HTML files. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kReadyTitle = "READY"; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kPassTitle = "PASS"; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateClientRedirect(const std::string& dest_url) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kClientRedirectBase = "client-redirect?"; 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateServerRedirect(const std::string& dest_url) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kServerRedirectBase = "server-redirect?"; 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kServerRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears the specified data using BrowsingDataRemover. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearBrowsingData(Browser* browser, int remove_mask) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(browser->profile()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover deletes itself. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns true if the prerender is expected to abort on its own, before 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// attempting to swap it. 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShouldAbortPrerenderBeforeSwap(FinalStatus status) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_USED: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_WINDOW_OPENER: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_APP_TERMINATING: 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case FINAL_STATUS_PROFILE_DESTROYED: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll crash the renderer after it's loaded. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_RENDERER_CRASHED: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CANCELLED: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_DEVTOOLS_ATTACHED: 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case FINAL_STATUS_PAGE_BEING_CAPTURED: 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case FINAL_STATUS_NAVIGATION_UNCOMMITTED: 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case FINAL_STATUS_WOULD_HAVE_BEEN_USED: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Convenience function to wait for a title. Handles the case when the 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebContents already has the expected title. 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WaitForASCIITitle(WebContents* web_contents, 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* expected_title_ascii) { 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 expected_title = base::ASCIIToUTF16(expected_title_ascii); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (web_contents->GetTitle() == expected_title) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for the destruction of a RenderProcessHost's IPC channel. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to make sure the PrerenderLinkManager's OnChannelClosed function has 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been called, before checking its state. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelDestructionWatcher { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ChannelDestructionWatcher() : channel_destroyed_(false) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ChannelDestructionWatcher() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WatchChannel(content::RenderProcessHost* host) { 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new DestructionMessageFilter(this)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForChannelClose() { 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Run(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(channel_destroyed_); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When destroyed, calls ChannelDestructionWatcher::OnChannelDestroyed. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores all messages. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionMessageFilter : public content::BrowserMessageFilter { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter(0), 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) watcher_(watcher) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionMessageFilter() { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChannelDestructionWatcher::OnChannelDestroyed, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(watcher_))); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* message_was_ok) OVERRIDE { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher* watcher_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionMessageFilter); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnChannelDestroyed() { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(channel_destroyed_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_destroyed_ = true; 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Quit(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool channel_destroyed_; 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop run_loop_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A navigation observer to wait on either a new load or a swap of a 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebContents. On swap, if the new WebContents is still loading, wait for that 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// load to complete as well. Note that the load must begin after the observer is 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// attached. 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NavigationOrSwapObserver : public WebContentsObserver, 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public TabStripModelObserver { 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for either a new load or a swap of |tab_strip_model|'s active 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WebContents. 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(web_contents), 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_(false), 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(1) { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for either |number_of_loads| loads or a swap of |tab_strip_model|'s 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // active WebContents. 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver(TabStripModel* tab_strip_model, 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents, 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads) 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(web_contents), 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_(tab_strip_model), 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_(false), 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(number_of_loads) { 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(TabStripModel::kNoTab, 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model->GetIndexOfWebContents(web_contents)); 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->AddObserver(this); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~NavigationOrSwapObserver() { 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tab_strip_model_->RemoveObserver(this); 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void set_did_start_loading() { 2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch did_start_loading_ = true; 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Wait() { 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Run(); 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WebContentsObserver implementation: 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidStartLoading(RenderViewHost* render_view_host) OVERRIDE { 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_ = true; 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!did_start_loading_) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_--; 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_loads_ == 0) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Quit(); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TabStripModelObserver implementation: 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TabReplacedAt(TabStripModel* tab_strip_model, 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* old_contents, 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* new_contents, 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int index) OVERRIDE { 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (old_contents != web_contents()) 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Switch to observing the new WebContents. 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Observe(new_contents); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_contents->IsLoading()) { 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the new WebContents is still loading, wait for it to complete. Only 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // one load post-swap is supported. 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_start_loading_ = true; 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_ = 1; 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.Quit(); 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabStripModel* tab_strip_model_; 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_start_loading_; 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads_; 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop loop_; 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Waits for a new tab to open and a navigation or swap in it. 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NewTabNavigationOrSwapObserver { 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabNavigationOrSwapObserver() 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : new_tab_observer_( 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_TAB_ADDED, 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&NewTabNavigationOrSwapObserver::OnTabAdded, 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))) { 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Watch for NOTIFICATION_TAB_ADDED. Add a callback so that the 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NavigationOrSwapObserver can be attached synchronously and no events are 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // missed. 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Wait() { 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_tab_observer_.Wait(); 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer_->Wait(); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool OnTabAdded(const content::NotificationSource& source, 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const content::NotificationDetails& details) { 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (swap_observer_) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* new_tab = content::Details<WebContents>(details).ptr(); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get the TabStripModel. Assume this is attached to a Browser. 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TabStripModel* tab_strip_model = 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<Browser*>(new_tab->GetDelegate())->tab_strip_model(); 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer_.reset(new NavigationOrSwapObserver(tab_strip_model, 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_tab)); 3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch swap_observer_->set_did_start_loading(); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver new_tab_observer_; 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<NavigationOrSwapObserver> swap_observer_; 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderContents that stops the UI message loop on DidStopLoading(). 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrerenderContents : public PrerenderContents { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus expected_final_status) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PrerenderContents(prerender_manager, profile, url, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, origin, PrerenderManager::kNoExperiment), 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status), 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_(NULL), 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_(false), 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_(false), 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_shown_(expected_final_status == FINAL_STATUS_USED), 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skip_final_checks_(false) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestPrerenderContents() { 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (skip_final_checks_) 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_MAX) { 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MATCH_COMPLETE_REPLACEMENT, match_complete_status()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()) << 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " when testing URL " << prerender_url().path() << 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (Expected: " << NameFromFinalStatus(expected_final_status_) << 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerendering RenderViewHosts should be hidden before the first 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so this should be happen for every PrerenderContents for 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which a RenderViewHost is created, regardless of whether or not it's 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_render_view_host_) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(was_hidden_); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A used PrerenderContents will only be destroyed when we swap out 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents, at the end of a navigation caused by a call to 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigateToURLImpl(). 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_status() == FINAL_STATUS_USED) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_render_view_host_); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_be_shown_, was_shown_); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On quit, it's possible to end up here when render processes are closed 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the PrerenderManager is destroyed. As a result, it's possible to 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on quit. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's also possible for this to be called after we've been notified of 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app termination, but before we've been deleted, which is why the second 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check is needed. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING && 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status() != expected_final_status_) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderContents::RenderProcessGone(status); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual bool CheckURL(const GURL& url) OVERRIDE { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the PrerenderRendererCrash test. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.spec() != content::kChromeUICrashURL) 4290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PrerenderContents::CheckURL(url); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tests that open the prerender in a new background tab, the RenderView 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not have been made visible when the PrerenderContents is destroyed 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though it is used. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_be_shown(bool value) { should_be_shown_ = value; } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For tests which do not know whether the prerender will be used. 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_skip_final_checks(bool value) { skip_final_checks_ = value; } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host) OVERRIDE { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to make sure the RenderViewHost is hidden and, if used, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequently shown. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar().Add( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(new_render_view_host)); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_ = new_render_view_host; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::OnRenderViewHostCreated(new_render_view_host); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_render_view_host_, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(source).ptr()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = *content::Details<bool>(details).ptr(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_visible) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_ = true; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_visible && was_hidden_) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once hidden, a prerendered RenderViewHost should only be shown after 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being removed from the PrerenderContents for display. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetRenderViewHost()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_ = true; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Observe(type, source, details); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RenderViewHost created for the prerender, if any. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host_; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is hidden. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_hidden_; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is shown, after having been 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hidden. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_shown_; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected final value of was_shown_. Defaults to true for 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FINAL_STATUS_USED, and false otherwise. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_shown_; 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If true, |expected_final_status_| and other shutdown checks are skipped. 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool skip_final_checks_; 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A handle to a TestPrerenderContents whose lifetime is under the caller's 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// control. A PrerenderContents may be destroyed at any point. This allows 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tracking the final status, etc. 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestPrerender : public PrerenderContents::Observer, 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public base::SupportsWeakPtr<TestPrerender> { 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerender() 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : contents_(NULL), 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_(0), 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_(0) { 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestPrerender() { 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (contents_) 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_->RemoveObserver(this); 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents() const { return contents_; } 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads() const { return number_of_loads_; } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForCreate() { create_loop_.Run(); } 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForStart() { start_loop_.Run(); } 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForStop() { stop_loop_.Run(); } 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Waits for |number_of_loads()| to be at least |expected_number_of_loads| OR 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for the prerender to stop running (just to avoid a timeout if the prerender 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // dies). Note: this does not assert equality on the number of loads; the 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // caller must do it instead. 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForLoads(int expected_number_of_loads) { 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!load_waiter_); 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!expected_number_of_loads_); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_loads_ < expected_number_of_loads) { 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_.reset(new base::RunLoop); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_ = expected_number_of_loads; 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Run(); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_.reset(); 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads_ = 0; 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LE(expected_number_of_loads, number_of_loads_); 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnPrerenderCreated(TestPrerenderContents* contents) { 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!contents_); 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_ = contents; 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_->AddObserver(this); 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) create_loop_.Quit(); 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PrerenderContents::Observer implementation: 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStart(PrerenderContents* contents) OVERRIDE { 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_loop_.Quit(); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderContents* contents) OVERRIDE { 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_loads_++; 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (load_waiter_ && number_of_loads_ >= expected_number_of_loads_) 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Quit(); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderStop(PrerenderContents* contents) OVERRIDE { 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(contents_); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents_ = NULL; 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stop_loop_.Quit(); 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If there is a WaitForLoads call and it has yet to see the expected number 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // of loads, stop the loop so the test fails instead of timing out. 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (load_waiter_) 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) load_waiter_->Quit(); 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE { 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents_; 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int number_of_loads_; 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads_; 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> load_waiter_; 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop create_loop_; 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop start_loop_; 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop stop_loop_; 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestPrerender); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderManager that uses TestPrerenderContents. 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestPrerenderContentsFactory : public PrerenderContents::Factory { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContentsFactory() {} 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestPrerenderContentsFactory() { 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(expected_contents_queue_.empty()); 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerenderContents(FinalStatus final_status) { 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> handle(new TestPrerender()); 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_contents_queue_.push_back( 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents(final_status, handle->AsWeakPtr())); 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return handle.Pass(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) OVERRIDE { 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents expected; 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!expected_contents_queue_.empty()) { 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected = expected_contents_queue_.front(); 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_contents_queue_.pop_front(); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Creating prerender contents for " << url.path() << 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) " with expected final status " << expected.final_status; 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << expected_contents_queue_.size() << " left in the queue."; 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* contents = 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new TestPrerenderContents(prerender_manager, 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile, url, referrer, origin, 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.final_status); 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (expected.handle) 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.handle->OnPrerenderCreated(contents); 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return contents; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct ExpectedContents { 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents() : final_status(FINAL_STATUS_MAX) { } 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExpectedContents(FinalStatus final_status, 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<TestPrerender>& handle) 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : final_status(final_status), 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handle(handle) { 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus final_status; 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<TestPrerender> handle; 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::deque<ExpectedContents> expected_contents_queue_; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager implementation that returns a fixed result for 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a given URL. 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SafeBrowsingDatabaseManager(service), 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) threat_type_(SB_THREAT_TYPE_SAFE) { } 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given url is safe or not. If we 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the url is safe, CheckUrl returns true. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it returns false, and "client" is called asynchronously with the 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result when it is ready. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true, indicating a SAFE result, unless the URL is the fixed URL 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the user, and the user-specified result is not SAFE 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in which that result will be communicated back via a call into the 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client, and false will be returned). 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides SafeBrowsingService::CheckBrowseUrl. 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE { 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gurl != url_ || threat_type_ == SB_THREAT_TYPE_SAFE) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone, 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, gurl, client)); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetThreatTypeForUrl(const GURL& url, SBThreatType threat_type) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ = url; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingDatabaseManager() {} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCheckBrowseURLDone(const GURL& gurl, Client* client) { 67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<SBThreatType> expected_threats; 67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check( 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL>(1, gurl), 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBFullHash>(), 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) safe_browsing_util::MALWARE, 68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_check.url_results[0] = threat_type_; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->OnSafeBrowsingResult(sb_check); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService { 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingService() { } 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returned pointer has the same lifespan as the database_manager_ refcounted 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager() { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingService() { } 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE { 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager_; 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances. 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingServiceFactory() : 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_(NULL) { } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingServiceFactory() { } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_ = new FakeSafeBrowsingService(); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service() const { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service_; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDevToolsClientHost : public DevToolsClientHost { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost() {} 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDevToolsClientHost() {} 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InspectedContentsClosing() OVERRIDE {} 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DispatchOnInspectorFrontend(const std::string& msg) OVERRIDE {} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReplacedWithAnotherClient() OVERRIDE {} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// URLRequestJob (and associated handler) which hangs. 7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HangingURLRequestJob : public net::URLRequestJob { 760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HangingURLRequestJob(net::URLRequest* request, 762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) 763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : net::URLRequestJob(request, network_delegate) { 764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Start() OVERRIDE {} 767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~HangingURLRequestJob() {} 770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class HangingFirstRequestProtocolHandler 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HangingFirstRequestProtocolHandler(const base::FilePath& file, 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback) 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : file_(file), 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_(callback), 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) first_run_(true) { 7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~HangingFirstRequestProtocolHandler() {} 782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequest* request, 785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (first_run_) { 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) first_run_ = false; 788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!callback_.is_null()) { 789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::UI, FROM_HERE, callback_); 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new HangingURLRequestJob(request, network_delegate); 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new content::URLRequestMockHTTPJob(request, network_delegate, file_); 795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_; 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback_; 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mutable bool first_run_; 801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes |url| never respond on the first load, and then with the contents of 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |file| afterwards. When the first load has been scheduled, runs |callback| on 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the UI thread. 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateHangingFirstRequestProtocolHandlerOnIO(const GURL& url, 8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file, 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure callback) { 809868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( 8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new HangingFirstRequestProtocolHandler(file, callback)); 812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 813868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url, never_respond_handler.Pass()); 814868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Wrapper over URLRequestMockHTTPJob that exposes extra callbacks. 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockHTTPJob : public content::URLRequestMockHTTPJob { 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHTTPJob(net::URLRequest* request, 8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::NetworkDelegate* delegate, 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file) 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : content::URLRequestMockHTTPJob(request, delegate, file) { 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_start_callback(const base::Closure& start_callback) { 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_callback_ = start_callback; 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Start() OVERRIDE { 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!start_callback_.is_null()) 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) start_callback_.Run(); 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::URLRequestMockHTTPJob::Start(); 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MockHTTPJob() {} 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure start_callback_; 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Dummy counter class to live on the UI thread for counting requests. 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RequestCounter : public base::SupportsWeakPtr<RequestCounter> { 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter() : count_(0), expected_count_(-1) {} 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int count() const { return count_; } 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestStarted() { 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) count_++; 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (loop_ && count_ == expected_count_) 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_->Quit(); 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WaitForCount(int expected_count) { 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(!loop_); 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(-1, expected_count_); 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (count_ < expected_count) { 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_count_ = expected_count; 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.reset(new base::RunLoop); 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_->Run(); 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_count_ = -1; 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop_.reset(); 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_count, count_); 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int count_; 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_count_; 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::RunLoop> loop_; 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Protocol handler which counts the number of requests that start. 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CountingProtocolHandler 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountingProtocolHandler(const base::FilePath& file, 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : file_(file), 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) counter_(counter), 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_(this) { 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~CountingProtocolHandler() {} 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequest* request, 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockHTTPJob* job = new MockHTTPJob(request, network_delegate, file_); 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) job->set_start_callback(base::Bind(&CountingProtocolHandler::RequestStarted, 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_factory_.GetWeakPtr())); 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return job; 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void RequestStarted() { 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RequestCounter::RequestStarted, counter_)); 8975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_; 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<RequestCounter> counter_; 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mutable base::WeakPtrFactory<CountingProtocolHandler> weak_factory_; 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Makes |url| respond to requests with the contents of |file|, counting the 9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// number that start in |counter|. 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateCountingProtocolHandlerOnIO( 9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file, 9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::WeakPtr<RequestCounter>& counter) { 9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> protocol_handler( 9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new CountingProtocolHandler(file, counter)); 9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, protocol_handler.Pass()); 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Makes |url| respond to requests with the contents of |file|. 9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CreateMockProtocolHandlerOnIO(const GURL& url, 9204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& file) { 9214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 9224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 9234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) url, content::URLRequestMockHTTPJob::CreateProtocolHandlerForSingleFile( 9244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file)); 9254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 92768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A ContentBrowserClient that cancels all prerenderers on OpenURL. 92868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class TestContentBrowserClient : public chrome::ChromeContentBrowserClient { 92968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 93068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestContentBrowserClient() {} 93168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~TestContentBrowserClient() {} 93268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 93368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool ShouldAllowOpenURL(content::SiteInstance* site_instance, 93568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& url) OVERRIDE { 93668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderManagerFactory::GetForProfile( 93768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext())) 93868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ->CancelAllPrerenders(); 93968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return chrome::ChromeContentBrowserClient::ShouldAllowOpenURL(site_instance, 94068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) url); 94168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 94268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 94368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 94468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient); 94568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 94668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A ContentBrowserClient that forces cross-process navigations. 9484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SwapProcessesContentBrowserClient 9494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public chrome::ChromeContentBrowserClient { 9504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 9514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient() {} 9524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~SwapProcessesContentBrowserClient() {} 9534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 9554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool ShouldSwapProcessesForRedirect( 9564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ResourceContext* resource_context, 9574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& current_url, 9584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& new_url) OVERRIDE { 9594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 9634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient); 9644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 9654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// An ExternalProtocolHandler that blocks everything and asserts it never is 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// called. 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NeverRunsExternalProtocolHandlerDelegate 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public ExternalProtocolHandler::Delegate { 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ExternalProtocolHandler::Delegate implementation. 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker( 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShellIntegration::DefaultWebClientObserver* observer, 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& protocol) OVERRIDE { 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This will crash, but it shouldn't get this far with BlockState::BLOCK 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // anyway. 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ExternalProtocolHandler::BlockState GetBlockState( 981c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& scheme, 982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool initiated_by_user_gesture) OVERRIDE { 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Block everything and fail the test. 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ADD_FAILURE(); 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ExternalProtocolHandler::BLOCK; 9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BlockRequest() OVERRIDE { } 9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void RunExternalProtocolDialog(const GURL& url, 9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_process_host_id, 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int routing_id) OVERRIDE { 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void LaunchUrlWithoutSecurityCheck(const GURL& url) OVERRIDE { 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void FinishedProcessingCheck() OVERRIDE { 9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetTestPath(const std::string& file_name) { 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ui_test_utils::GetTestFilePath( 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("prerender")), 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath().AppendASCII(file_name)); 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Many of these tests are flaky. See http://crbug.com/249179 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTest : virtual public InProcessBrowserTest { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest() 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : autostart_test_server_(true), 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents_factory_(NULL), 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_(true), 10194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_(true), 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_("files/prerender/prerender_loader.html"), 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_(NULL) {} 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTest() {} 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const { 10265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return web_contents->GetController().GetDefaultSessionStorageNamespace(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 1039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 1040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SafeBrowsingService::RegisterFactory(NULL); 1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 1042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kPrerenderMode, 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValueEnabled); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugins directory isn't read by default on the Mac, so it needs to be 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly registered. 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_dir; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP, &app_dir); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath( 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kExtraPluginDir, 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_dir.Append(FILE_PATH_LITERAL("plugins"))); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (autostart_test_server_) 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChromeResourceDispatcherHostDelegate:: 10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetExternalProtocolHandlerDelegateForTesting( 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &external_protocol_handler_delegate_); 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager* prerender_manager = GetPrerenderManager(); 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender_manager); 10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager->mutable_config().rate_limit_enabled = false; 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender_contents_factory_ == NULL); 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_factory_ = new TestPrerenderContentsFactory; 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_manager->SetPrerenderContentsFactory(prerender_contents_factory_); 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Convenience function to get the currently active WebContents in 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // current_browser(). 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* GetActiveWebContents() const { 10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return current_browser()->tab_strip_model()->GetActiveWebContents(); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overload for a single expected final status 10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinalStatus expected_final_status, 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads) { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PrerenderTestURL(url, 10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status, 10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURL( 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PrerenderTestURLImpl(url, 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> PrerenderTestURL( 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue( 11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, expected_final_status); 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<TestPrerender*> prerenders; 11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURLImpl(url, 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_number_of_loads).release(&prerenders); 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(1u, prerenders.size()); 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<TestPrerender>(prerenders[0]); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURL() const { 1119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, true); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the url in a new tab, with no opener. 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURLWithDisposition( 1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 1125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 11268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams( 11278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams(dest_url_, Referrer(), disposition, 11288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expect_swap_to_succeed); 11308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURL(const std::string& dest_html_file) const { 11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithDisposition(dest_html_file, CURRENT_TAB, true); 11348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLWithDisposition(const std::string& dest_html_file, 11378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WindowOpenDisposition disposition, 11388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expect_swap_to_succeed) const { 11398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL dest_url = test_server()->GetURL(dest_html_file); 11400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateToURLWithDisposition(dest_url, disposition, expect_swap_to_succeed); 11410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 11420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void NavigateToURLWithDisposition(const GURL& dest_url, 11440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) WindowOpenDisposition disposition, 11450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool expect_swap_to_succeed) const { 11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams( 11478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams(dest_url, Referrer(), disposition, 11488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false), 11498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expect_swap_to_succeed); 11508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLWithParams(const content::OpenURLParams& params, 11538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expect_swap_to_succeed) const { 11548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLImpl(params, expect_swap_to_succeed); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClick() const { 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(dest_url_); 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenURLViaClick(const GURL& url) const { 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("Click", url, GURL(), false); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickTarget() const { 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ClickTarget", dest_url_, GURL(), true); 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenDestURLViaClickPing(const GURL& ping_url) const { 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ClickPing", dest_url_, ping_url, false); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewWindow() const { 11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("ShiftClick", dest_url_, GURL(), true); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewForegroundTab() const { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("MetaShiftClick", dest_url_, GURL(), true); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("CtrlShiftClick", dest_url_, GURL(), true); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewBackgroundTab() const { 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("MetaClick", dest_url_, GURL(), true); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("CtrlClick", dest_url_, GURL(), true); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaWindowOpen() const { 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLWithJSImpl("WindowOpen", dest_url_, GURL(), true); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveLinkElement(int i) const { 1198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetActiveWebContents()->GetMainFrame()->ExecuteJavaScript( 1199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClickToNextPageAfterPrerender() { 12035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 1204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("ClickOpenLink()")); 12065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nav_observer.Wait(); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToNextPageAfterPrerender() const { 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html")); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after the prerendered page has been navigated to and then away from. 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates back through the history to the prerendered page. 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPrerender() { 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver back_nav_observer(GetActiveWebContents()); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool original_prerender_page = false; 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(IsOriginalPrerenderPage())", 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_prerender_page)); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(original_prerender_page); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Goes back to the page that was active before the prerender was swapped 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. This must be called when the prerendered page is the current page 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the active tab. 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPageBeforePrerender() { 12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* tab = GetActiveWebContents(); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab->IsLoading()); 12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver back_nav_observer(tab); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool js_result; 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidBackToOriginalPagePass())", 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &js_result)); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(js_result); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const std::string& html_file) const { 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const GURL& url) const { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderManager()->FindPrerenderData( 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetSessionStorageNamespace()) != NULL; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UseHttpsSrcServer() { 12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (https_src_server_) 12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) https_src_server_.reset( 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new net::SpawnedTestServer( 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::SpawnedTestServer::kLocalhost, 12635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 12645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(https_src_server_->Start()); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableJavascriptCalls() { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_ = false; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void DisableLoadEventCheck() { 12724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_ = false; 12734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerModel* GetModel() const { 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TaskManager::GetInstance()->model(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* GetPrerenderManager() const { 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile(current_browser()->profile()); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrerenderLinkManager* GetPrerenderLinkManager() const { 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager = 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManagerFactory::GetForProfile( 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager; 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetPrerenderEventCount(int index, const std::string& type) const { 1293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int event_count; 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 1295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "window.domAutomationController.send(" 1296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " GetPrerenderEventCount(%d, '%s'))", index, type.c_str()); 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 1299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetActiveWebContents(), expression, &event_count)); 1300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return event_count; 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool DidReceivePrerenderStartEventForLinkNumber(int index) const { 1304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderstart") > 0; 1305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetPrerenderLoadEventCountForLinkNumber(int index) const { 1308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderload"); 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int GetPrerenderDomContentLoadedEventCountForLinkNumber(int index) const { 1312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderdomcontentloaded"); 13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStopEventForLinkNumber(int index) const { 1316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetPrerenderEventCount(index, "webkitprerenderstop") > 0; 1317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void WaitForPrerenderEventCount(int index, 1320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& type, 1321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int count) const { 1322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int dummy; 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 1324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "WaitForPrerenderEventCount(%d, '%s', %d," 1325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " window.domAutomationController.send.bind(" 1326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " window.domAutomationController, 0))", 1327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) index, type.c_str(), count); 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetActiveWebContents(), expression, &dummy)); 1331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CHECK_EQ(0, dummy); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HadPrerenderEventErrors() const { 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool had_prerender_event_errors; 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " hadPrerenderEventErrors))", 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &had_prerender_event_errors)); 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return had_prerender_event_errors; 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asserting on this can result in flaky tests. PrerenderHandles are 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // removed from the PrerenderLinkManager when the prerender is canceled from 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser, when the prerenders are cancelled from the renderer process, 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or the channel for the renderer process is closed on the IO thread. In the 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last case, the code must be careful to wait for the channel to close, as it 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is done asynchronously after swapping out the old process. See 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ChannelDestructionWatcher. 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->IsEmpty(); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetLinkPrerenderCount() const { 13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderLinkManager()->prerenders_.size(); 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetRunningLinkPrerenderCount() const { 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderLinkManager()->CountRunningPrerenders(); 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns length of |prerender_manager_|'s history, or -1 on failure. 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetHistoryLength() const { 13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> prerender_dict( 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<base::DictionaryValue*>( 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->GetAsValue())); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict.get()) 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* history_list; 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict->GetList("history", &history_list)) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(history_list->GetSize()); 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return safe_browsing_factory_->most_recent_service()-> 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager(); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data = 1385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPrerenderManager()->FindPrerenderData(url, NULL); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TestPrerenderContents*>( 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_data ? prerender_data->contents() : NULL); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetLoaderHostOverride(const std::string& host) { 13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_host_override_ = host; 13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver()->AddRule(host, "127.0.0.1"); 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_path(const std::string& path) { 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_ = path; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_loader_query(const std::string& query) { 1400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loader_query_ = query; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCrossDomainTestUrl(const std::string& path) { 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string secondary_domain = "www.foo.com"; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str(base::StringPrintf( 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s", 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_domain.c_str(), 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->host_port_pair().port(), 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.c_str())); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url_str); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_browser(Browser* browser) { 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_ = browser; 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() const { 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return explicitly_set_browser_ ? explicitly_set_browser_ : browser(); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& dest_url() const { 14238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return dest_url_; 14248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 14258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreasePrerenderMemory() { 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase the memory allowed in a prerendered page above normal settings. 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug build bots occasionally run against the default limit, and tests 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // were failing because the prerender was canceled due to memory exhaustion. 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/93076 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 1000 * 1024 * 1024; 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DidPrerenderPass(WebContents* web_contents) const { 14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool prerender_test_result = false; 14365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents, 14385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(DidPrerenderPass())", 14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &prerender_test_result)) 14405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender_test_result; 14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DidDisplayPass(WebContents* web_contents) const { 14455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool display_test_result = false; 14465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!content::ExecuteScriptAndExtractBool( 14475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents, 14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 14495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &display_test_result)) 14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 14515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return display_test_result; 14525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> ExpectPrerender(FinalStatus expected_final_status) { 14555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerender_contents_factory_->ExpectPrerenderContents( 14565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status); 14575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddPrerender(const GURL& url, int index) { 14605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string javascript = base::StringPrintf( 14615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "AddPrerender('%s', %d)", url.spec().c_str(), index); 1462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 1463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 1464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns a string for pattern-matching TaskManager tab entries. 1467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 MatchTaskManagerTab(const char* page_title) { 1468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, 1469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(page_title)); 1470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns a string for pattern-matching TaskManager prerender entries. 1473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::string16 MatchTaskManagerPrerender(const char* page_title) { 1474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, 1475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ASCIIToUTF16(page_title)); 14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool autostart_test_server_; 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 14825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Remove this altogether so the tests don't globally assume 14835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only one prerender. 14845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* GetPrerenderContents() const { 14855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetPrerenderContentsFor(dest_url_); 14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> PrerenderTestURLImpl( 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 14905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<FinalStatus>& expected_final_status_queue, 14915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int expected_number_of_loads) { 14925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_url_ = prerender_url; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 14985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(net::SpawnedTestServer::GetFilePathWithReplacements( 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_, 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::SpawnedTestServer* src_server = test_server(); 15045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (https_src_server_) 15055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) src_server = https_src_server_.get(); 1506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL loader_url = src_server->GetURL( 1507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) replacement_path + "&" + loader_query_); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL::Replacements loader_replacements; 15105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!loader_host_override_.empty()) 15115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_replacements.SetHostStr(loader_host_override_); 15125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loader_url = loader_url.ReplaceComponents(loader_replacements); 15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Running test with queue length " << 15155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.size(); 15165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!expected_final_status_queue.empty()); 15175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders; 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < expected_final_status_queue.size(); i++) { 15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders.push_back( 15205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_contents_factory_->ExpectPrerenderContents( 15215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue[i]).release()); 15225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = expected_final_status_queue.front(); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the loader URL and then wait for the first prerender to be 15275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // created. 15285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), loader_url); 15295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForCreate(); 15305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForLoads(expected_number_of_loads); 15315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 15335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will abort on its own. Assert it does so correctly. 15345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[0]->WaitForStop(); 15355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerenders[0]->contents()); 15365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 15375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 15385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise, check that it prerendered correctly. 15395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 15435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (call_javascript_) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if page behaves as expected while in prerendered state. 15475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender_contents->prerender_contents())); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 15504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test that the referring page received the right start and load events. 15525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (check_load_events_) { 15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, prerenders[0]->number_of_loads()); 15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_number_of_loads, 15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderLoadEventCountForLinkNumber(0)); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return prerenders.Pass(); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void NavigateToURLImpl(const content::OpenURLParams& params, 1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure in navigating we have a URL to use in the PrerenderManager. 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetPrerenderContents()->prerender_contents(); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate and wait for either the load to finish normally or for a swap to 15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // occur. 15735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): The only handles CURRENT_TAB navigations, which is the 15745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only case tested or prerendered right now. 15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK_EQ(CURRENT_TAB, params.disposition); 15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 15788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebContents* target_web_contents = current_browser()->OpenURL(params); 15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 15808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 15818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (web_contents && expect_swap_to_succeed) { 15828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(web_contents, target_web_contents); 15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (call_javascript_) 15845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(web_contents)); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Opens the prerendered page using javascript functions in the loader 15895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // page. |javascript_function_name| should be a 0 argument function which is 15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // invoked. |new_web_contents| is true if the navigation is expected to 15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // happen in a new WebContents via OpenURL. 15925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OpenURLWithJSImpl(const std::string& javascript_function_name, 15935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 15945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& ping_url, 15955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool new_web_contents) const { 15965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 1597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderFrameHost* render_frame_host = web_contents->GetMainFrame(); 15985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Extra arguments in JS are ignored. 15995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string javascript = base::StringPrintf( 16005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "%s('%s', '%s')", javascript_function_name.c_str(), 16015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.spec().c_str(), ping_url.spec().c_str()); 16025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_web_contents) { 16045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NewTabNavigationOrSwapObserver observer; 1605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 16065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer.Wait(); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver observer(current_browser()->tab_strip_model(), 16095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents); 1610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16(javascript)); 16114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer.Wait(); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestPrerenderContentsFactory* prerender_contents_factory_; 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NeverRunsExternalProtocolHandlerDelegate external_protocol_handler_delegate_; 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url_; 16215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::SpawnedTestServer> https_src_server_; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool call_javascript_; 16234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool check_load_events_; 16245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string loader_host_override_; 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_path_; 1626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string loader_query_; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* explicitly_set_browser_; 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a page is correctly prerendered in the case of a 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <link rel=prerender> tag and then loaded into a tab in response to a 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 16345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 16355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 16375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 16385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 16455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 16525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 16535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 16545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 16555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that cross-domain prerenders emit the correct histograms. 16605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 16615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 16645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 1); 16655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 16685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 16695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PrerenderNotSwappedInPLT", 1); 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1); 16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 16765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 16775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 16785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that pending prerenders launch and receive proper event treatment. 16805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 16815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_pending.html", 16835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 1); 16845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the prerender. 16865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 16875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 16885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Abort early if the original prerender didn't swap, so as not to hang. 16895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(prerender->contents()); 16905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the new prerender to be ready. 16925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForStart(); 16935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForLoads(1); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL prerender_page_url = 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html"); 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContentsFor(prerender_page_url)); 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now navigate to our target page. 17025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 17035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), prerender_page_url, CURRENT_TAB, 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 17075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders which are canceled before they are launched 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// never get started. 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 1); 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 17195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovingLink) { 1734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 1735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 1736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No ChannelDestructionWatcher is needed here, since prerenders in the 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderLinkManager should be deleted by removing the links, rather than 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting down the renderer process. 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 1742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prerender->WaitForStop(); 1743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinks) { 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_loader_query("links_to_insert=2"); 1759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 1760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 1761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(1); 1769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prerender->WaitForStop(); 1770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 1772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 1773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 1774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 1775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 1776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 1777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 1778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // renderer events have arrived. 1779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 1780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 1783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderBrowserTest, PrerenderPageRemovingLinkWithTwoLinksOneLate) { 1784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 1785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 1786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 1788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 1789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 1); 1790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Add a second prerender for the same link. It reuses the prerender, so only 1792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the start event fires here. 1793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AddPrerender(url, 1); 1794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WaitForPrerenderEventCount(1, "webkitprerenderstart", 1); 1795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 1796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, GetPrerenderLoadEventCountForLinkNumber(1)); 1797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 1798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveLinkElement(0); 1800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RemoveLinkElement(1); 1801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) prerender->WaitForStop(); 1802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest, 1816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 1819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_loader_query("links_to_insert=2"); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 18395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_close_watcher.WatchChannel( 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the visibility API works. 18485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibility) { 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_visibility.html", 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly if we try to 1856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// swap it in before it commits. 1857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { 1858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to a page that triggers a prerender for a URL that never commits. 1859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 18605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 18615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop prerender_start_loop; 1863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::PostTask( 1864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 18655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 18665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNoCommitUrl, file, prerender_start_loop.QuitClosure())); 18674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 1868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(kNoCommitUrl, 18694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_NAVIGATION_UNCOMMITTED, 1870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 0); 18715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the hanging request to be scheduled. 18725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_start_loop.Run(); 1873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to the URL, but assume the contents won't be swapped in. 1875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Checks that client redirects don't add alias URLs until after they commit. 18790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap2) { 18800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Navigate to a page that then navigates to a URL that never commits. 18810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 18825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 18835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop prerender_start_loop; 18850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::PostTask( 18860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 18875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 18885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNoCommitUrl, file, prerender_start_loop.QuitClosure())); 18890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DisableJavascriptCalls(); 18900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), 18910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 18925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the hanging request to be scheduled. 18935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_start_loop.Run(); 18940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 18950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Navigating to the second URL should not swap. 18960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NavigateToURLWithDisposition(kNoCommitUrl, CURRENT_TAB, false); 18970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 18980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded while a page is being preloaded, but 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded when the page is displayed. 1917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 1919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_MACOSX) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 1922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_LINUX) 1927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://crbug.com/306715 1928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin PrerenderDelayLoadPlugin 1931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 19324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://crbug.com/306715 1933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderDelayLoadPlugin) { 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/plugin_delay_load.html", 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded on prerendering pages when click-to-play 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is enabled. 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickToPlay) { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable click-to-play. 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* content_settings_map = 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetHostContentSettingsMap(); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings_map->SetDefaultContentSetting( 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_click_to_play.html", 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't load a NaCl plugin when NaCl is disabled. 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNaClPluginDisabled) { 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_disabled.html", 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run this check again. When we try to load aa ppapi plugin, the 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "loadstart" event is asynchronously posted to a message loop. 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that earlier call could have been run before the 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the "loadstart" event was posted. 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): While this should reliably fail on regressions, the 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reliability depends on the specifics of ppapi plugin 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading. It would be great if we could avoid that. 19705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins in an iframe are not loaded while a page is 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being preloaded, but are loaded when the page is displayed. 1975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_WIN) 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 1983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 1986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin PrerenderIframeDelayLoadPlugin 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderIframeDelayLoadPlugin) { 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a page that contains a prerender link to a page that contains an 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe with a source that requires http authentication. This should not 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender successfully. 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 20044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectNavigateToFirst) { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderClientRedirectNavigateToSecond) { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 2030f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and swap when navigating to the first page. 2031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderLocationReplaceNavigateToFirst) { 2033f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED, 2035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2); 2036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDestURL(); 2037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that redirects with location.replace do not cancel a prerender and 2040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and swap when navigating to the second. 2041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderLocationReplaceNavigateToSecond) { 2043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_location_replace.html", 2044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_USED, 2045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2); 2046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 2047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that we get the right PPLT histograms for client redirect prerenders 20505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// and navigations when the referring page is Google. 20515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderLocationReplaceGWSHistograms) { 20535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 20545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 20555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The loader page should look like Google. 20575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string kGoogleDotCom("www.google.com"); 20585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetLoaderHostOverride(kGoogleDotCom); 20595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_replace_state.html"); 20605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL dest_url = GetCrossDomainTestUrl( 20625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html"); 20635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 20655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 20665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 20675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#prerender"); 20685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL::Replacements replacements; 20695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) replacements.SetHostStr(kGoogleDotCom); 20705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender_url = prerender_url.ReplaceComponents(replacements); 20715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 20735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 20745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 20755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 20765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 20775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 20785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, prerender->number_of_loads()); 20795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 20815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 20825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 20835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 20845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Although there is a client redirect, it is dropped from histograms because 20855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // it is a Google URL. The target page itself does not load until after the 20865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // swap. 20875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 20885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL navigate_url = test_server()->GetURL( 20905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_location_replace.html?" + 20915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::EscapeQueryParamValue(dest_url.spec(), false) + 20925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "#navigate"); 20935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_url = navigate_url.ReplaceComponents(replacements); 20945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer( 20965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model(), 20975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 2); 20985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 20995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigate_url, Referrer(), CURRENT_TAB, 21005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 21015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 21025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 21045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 21065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", 0); 21075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLT", 1); 21085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.gws_PerceivedPLTMatched", 1); 21095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 21105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.gws_PerceivedPLTMatchedComplete", 1); 21115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The client redirect does /not/ count as a miss because it's a Google URL. 21135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.PerceivedPLTFirstAfterMiss", 0); 21145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 21155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectNavigateToSecondViaClick) { 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html")); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 21255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 2); 21265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(destination_url); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that a page served over HTTPS is correctly prerendered. 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { 2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 21447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderClientRedirectInIframe) { 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect( 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 21585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToFirst) { 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecond) { 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecondViaClick) { 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html")); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 21935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); 21945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenURLViaClick(destination_url); 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect( 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through an 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe. This should not prerender successfully. 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) { 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_iframe.html", 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript changing the window.location. This should not prerender 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successfully 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through a 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client-issued redirect. This should not prerender successfully. 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_refresh.html", 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is set when prerendering. 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is not set when prerendering and the source page is 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTPS. 22517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderNoSSLReferrer) { 22535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UseHttpsSrcServer(); 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_no_referrer.html", 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer is set when prerendering is cancelled. 226168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrer) { 226268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 226368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 226468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 226568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 226668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 226768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 226868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 226968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 227068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 227168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 227368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 227468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 227568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 227668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that popups on a prerendered page cause cancellation. 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_popup.html", 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CREATE_NEW_WINDOW, 22814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that registering a protocol handler causes cancellation. 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRegisterProtocolHandler) { 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_register_protocol_handler.html", 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_REGISTER_PROTOCOL_HANDLER, 22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that renderers using excessive memory will be terminated. 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) { 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderManager()); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 30 * 1024 * 1024; 22954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The excessive memory kill may happen before or after the load event as it 22964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // happens asynchronously with IPC calls. Even if the test does not start 22974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // allocating until after load, the browser process might notice before the 22984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // message gets through. This happens on XP debug bots because they're so 22994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // slow. Instead, don't bother checking the load event count. 23004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableLoadEventCheck(); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_excessive_memory.html", 23025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 0); 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks shutdown code while a prerender is active. 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 23074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableLoadEventCheck(); 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop. 23155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 23245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 23255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerenders[0]->contents()); 23265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 23285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page load one. 23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure the PrerenderContents for the next url is now in the manager and 23385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not pending. This relies on pending prerenders being resolved in the same 23395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event loop iteration as OnPrerenderStop. 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 23415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetLinkPrerenderCount()); 23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop and multiple links are 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handled correctly. 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderInfiniteLoopMultiple) { 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_a_multiple.html"; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_b_multiple.html"; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileC = 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_c_multiple.html"; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is conceptually simplest if concurrency is at two, since we 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 23675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerenders[0]->contents()); 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next url should be in pending list but not an active entry. This relies on 23715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the fact that the renderer sends out the AddLinkRelPrerender IPC before 23725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // sending the page load one. 23735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(3U, GetLinkPrerenderCount()); 23745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next urls are now in the manager 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. One and only one of the URLs (the last seen) should be the 23825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // active entry. This relies on pending prerenders being resolved in the same 23835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event loop iteration as OnPrerenderStop. 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 23875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 23885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetRunningLinkPrerenderCount()); 23895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 23905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that pending prerenders are aborted (and never launched) when launched 23925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by a prerender that itself gets aborted. 23935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAbortPendingOnCancel) { 23945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 23955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 23965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, FINAL_STATUS_CANCELLED, 1); 23995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 24005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assert that the pending prerender is in there already. This relies on the 24015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fact that the renderer sends out the AddLinkRelPrerender IPC before sending 24025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the page load one. 24035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2U, GetLinkPrerenderCount()); 24045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, GetRunningLinkPrerenderCount()); 24055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next url should be in pending list but not an active entry. 24075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 24085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cancel the prerender. 24105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 24115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 24125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All prerenders are now gone. 24145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerBeforePrerender) { 2418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 2419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 2420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 original = MatchTaskManagerTab("Preloader"); 2421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 prerender = MatchTaskManagerPrerender("Prerender Page"); 2422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 2423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the task manager. This populates the model. 2425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::OpenTaskManager(current_browser()); 2426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Prerender a page in addition to the original tab. 2430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 2431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A TaskManager entry should appear like "Prerender: Prerender Page" 2433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // alongside the original tab entry. There should be just these two entries. 2434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 2435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 2436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, final)); 2437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 2438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Swap in the prerendered content. 2441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 2442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The "Prerender: " TaskManager entry should disappear, being replaced by a 2444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // "Tab: Prerender Page" entry, and nothing else. 2445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, prerender)); 2446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, original)); 2447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerAfterPrerender) { 2453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 2454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 2455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 original = MatchTaskManagerTab("Preloader"); 2456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 prerender = MatchTaskManagerPrerender("Prerender Page"); 2457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with two resources. 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Show the task manager. This populates the model. Importantly, we're doing 2463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // this after the prerender WebContents already exists - the task manager 2464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // needs to find it, it can't just listen for creation. 2465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 2466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A TaskManager entry should appear like "Prerender: Prerender Page" 2468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, prerender)); 2469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, original)); 2470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, final)); 2471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_prerender)); 2472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Swap in the tab. 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The "Prerender: Prerender Page" TaskManager row should disappear, being 2478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // replaced by "Tab: Prerender Page" 2479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, prerender)); 2480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, original)); 2481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 2484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, OpenTaskManagerAfterSwapIn) { 2487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_prerender = MatchTaskManagerPrerender("*"); 2488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 any_tab = MatchTaskManagerTab("*"); 2489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16 final = MatchTaskManagerTab("Prerender Page"); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Prerender, and swap it in. 2492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 2493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 2494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Show the task manager. This populates the model. Importantly, we're doing 2496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // this after the prerender has been swapped in. 2497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::OpenTaskManager(current_browser()); 2498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We should not see a prerender resource in the task manager, just a normal 2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // page. 2501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, final)); 2502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, any_tab)); 2503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, any_prerender)); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering. 2507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Audio) { 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio.html", 25095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 25105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if autoplay is set. 2517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioAutoplay) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_autoplay.html", 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if js starts playing. 2527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5AudioJsplay) { 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_jsplay.html", 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video loads are deferred on prerendering. 2536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5Video) { 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video.html", 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video tags inserted by javascript are deferred and played 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly on swap in. 2546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoJs) { 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_script.html", 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks for correct network events by using a busy sleep the javascript. 2555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5VideoNetwork) { 25565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 25575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 25585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_network.html", 25595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 25605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 25625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 25645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that scripts can retrieve the correct window size while prerendering. 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowSize) { 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_size.html", 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// TODO(jam): http://crbug.com/350550 257623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !(defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)) 257723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerenderers will terminate when the RenderView crashes. 25795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { 25805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 25815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 25825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_RENDERER_CRASHED, 25835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to about:crash and then wait for the renderer to crash. 25865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 25875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()->prerender_contents()); 25885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->contents()->prerender_contents()->GetController(). 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURL( 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(content::kChromeUICrashURL), 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 25945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 259623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageWithFragment) { 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html#fragment", 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2614d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageWithRedirectedFragment) { 2615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderTestURL( 2616d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html#fragment"), 2617d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FINAL_STATUS_USED, 2618d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2); 2619d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 2621d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 2622d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 2623d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToDestURL(); 2624d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 2625d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 2627d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 2628d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2629d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when navigating from 2630d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the main page to a fragment. 2631d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2632d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageNavigateFragment) { 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html", 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2637d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2638d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to the main page. 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigatePage) { 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#fragment", 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to a different fragment on the same page. 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigateFragment) { 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#other_fragment", 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh from a fragment on the same page. 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectFromFragment) { 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 26704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html#fragment"), 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2678d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh to a fragment on the same page. 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectToFragment) { 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html"), 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2686d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2687d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2688d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses JS to set 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the window.location.hash to a fragment on the same page. 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageChangeFragmentLocationHash) { 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a PNG works correctly. 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.png", FINAL_STATUS_USED, 1); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a JPG works correctly. 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.jpeg", FINAL_STATUS_USED, 1); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender of a CRX will result in a cancellation due to 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download. 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 27184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr GET requests allow prerenders. 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrGet) { 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_get.html", 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr HEAD requests allow prerenders. 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrHead) { 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_head.html", 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr OPTIONS requests allow prerenders. 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrOptions) { 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_options.html", 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr TRACE requests allow prerenders. 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrTrace) { 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_trace.html", 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr POST requests allow prerenders. 27545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPost) { 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_post.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 PUT cancels prerenders. 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) { 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr DELETE cancels prerenders. 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) { 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_delete.html", 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would trigger an SSL error is canceled. 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) { 2777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 27804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 27814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 27824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_ERROR, 27874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from a subresource does not cancel 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 27974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 27984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 27994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from an iframe does not cancel 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { 2818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 28214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 28234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we cancel correctly when window.print() is called. 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_print.html", 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_PRINT, 28434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened in a new window by javascript and both the 2847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// pages are in the same domain, the prerendered page is not used, due to 2848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// window.opener. 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerWindowOpen) { 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaWindowOpen(); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened due to click on a href with target="_blank" 2858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and both pages are in the same domain the prerendered page is not used, due 2859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// to window.opener. 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerClickTarget) { 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 2863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_WINDOW_OPENER, 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickTarget(); 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestClientCertStore : public net::ClientCertStore { 28695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 28705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestClientCertStore() {} 28715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestClientCertStore() {} 28725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // net::ClientCertStore: 28745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info, 28755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::CertificateList* selected_certs, 28765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Closure& callback) OVERRIDE { 28775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *selected_certs = net::CertificateList( 28785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, scoped_refptr<net::X509Certificate>( 28795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new net::X509Certificate("test", "test", base::Time(), base::Time()))); 28805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(); 28815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 28825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 28835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<net::ClientCertStore> CreateCertStore() { 28855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<net::ClientCertStore>(new TestClientCertStore); 28865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would normally request an SSL client 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate will never be seen since it's an https top-level resource. 2890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderSSLClientCertTopLevel) { 28925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 28935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 28945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 28955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 28984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 28994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 29034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 0); 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from a 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresource will cancel the prerendered page. 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSSLClientCertSubresource) { 29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 29115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 29174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 29314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from an 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe will cancel the prerendered page. 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertIframe) { 29375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileIOData::FromResourceContext( 29385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->profile()->GetResourceContext())-> 29395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_client_cert_store_factory_for_testing( 29405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCertStore)); 2941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 29434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 29444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 29454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 29594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages with a safe browsing 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial. 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingTopLevel) { 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 29704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 0); 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that server redirects to a malware page will cancel prerenders. 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingServerRedirect) { 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that client redirects to a malware page will cancel prerenders. 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingClientRedirect) { 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 29882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware subresource. 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url = test_server()->GetURL("files/prerender/image.jpeg"); 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url, SB_THREAT_TYPE_URL_MALWARE); 3000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 3004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware iframe. 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingIframe) { 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL iframe_url = test_server()->GetURL( 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iframe_url, SB_THREAT_TYPE_URL_MALWARE); 3019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", iframe_url.spec())); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 30294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage read will not cause prerender to fail. 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageRead) { 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_read.html", 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage write will not cause prerender to fail. 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_write.html", 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the favicon is properly loaded on prerender. 30515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderFavicon) { 30525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 30535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_favicon.html", 30545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 30555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 30575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!FaviconTabHelper::FromWebContents( 30595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents())->FaviconIsValid()) { 30605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the favicon has not been set yet, wait for it to be. 30615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver favicon_update_watcher( 30625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_FAVICON_UPDATED, 30635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<WebContents>(GetActiveWebContents())); 30645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) favicon_update_watcher.Wait(); 30655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 30665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(FaviconTabHelper::FromWebContents( 30675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents())->FaviconIsValid()); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when a prerendered page is swapped in to a referring page, the 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unload handlers on the referring page are executed. 3072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { 3073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Matches URL in prerender_loader_with_unload.html. 3074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL unload_url("http://unload-url.test"); 3075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 3076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 3077a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RequestCounter unload_counter; 3078a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 3079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 3080a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 3081a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unload_url, empty_file, unload_counter.AsWeakPtr())); 3082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 3086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unload_counter.WaitForCount(1); 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Checks that a hanging unload on the referring page of a prerender swap does 3090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// not crash the browser on exit. 3091a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { 3092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Matches URL in prerender_loader_with_unload.html. 3093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL hang_url("http://unload-url.test"); 3094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 3095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 3096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 3097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 3098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 3099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hang_url, empty_file, 3100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure())); 3101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 3103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 3104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 3105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the history is cleared, prerendering is cancelled and 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is cleared. 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 31115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 31145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 311690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_HISTORY)); 31205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was cleared. 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetHistoryLength()); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Disabled due to flakiness: crbug.com/316225 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the cache is cleared, prerenders are cancelled but 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is not cleared. 3129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderClearCache) { 31305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 31335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 313590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_CACHE)); 31385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was not cleared. Not a vital behavior, but 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to compare with PrerenderClearHistory test. 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetHistoryLength()); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { 31465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 31495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 31525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerender->contents()); 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { 31585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 31605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 31612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 31635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 31662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 31672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 31682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancels the prerender of a page with its own prerender. The second prerender 31712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should never be started. 31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelPrerenderWithPrerender) { 31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 31755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_infinite_a.html", 31765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_CANCELLED, 31775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 31785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 31805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->WaitForStop(); 31815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(prerender->contents()); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerendering and history tests. 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is navigated to in several ways [navigate via 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox, click on link, key-modified click to open in background tab, etc], 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// followed by a navigation to another page from the prerendered page, followed 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a back navigation. 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateClickGoBack) { 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNavigateNavigateGoBack) { 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickClickGoBack) { 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNavigateGoBack) { 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32270529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { 32280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Prerender currently doesn't interpose on this navigation. 32290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://crbug.com/345474. 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FINAL_STATUS_APP_TERMINATING, 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewWindow(); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32360529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { 32370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Prerender currently doesn't interpose on this navigation. 32380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://crbug.com/345474. 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FINAL_STATUS_APP_TERMINATING, 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewForegroundTab(); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32450529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewBackgroundTab) { 32460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Prerender currently doesn't interpose on this navigation. 32470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://crbug.com/345474. 32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 32500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FINAL_STATUS_APP_TERMINATING, 32515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender->contents()); 32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender->contents()->set_should_be_shown(false); 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewBackgroundTab(); 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPrerenderedPageWhenDevToolsAttached) { 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 32612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 32622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetOrCreateFor( 32632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost())); 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager* manager = DevToolsManager::GetInstance(); 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost client_host; 3266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manager->RegisterDevToolsClientHostFor(agent.get(), &client_host); 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url = "files/prerender/prerender_page.html"; 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); 32698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithDisposition(url, CURRENT_TAB, false); 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->ClientHostClosing(&client_host); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that the sessionStorage namespace remains the same when swapping 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a prerendered page. 32755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorage) { 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPageBeforePrerender(); 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that the control group works. An XHR PUT cannot be detected in the 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control group. 32865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroup) { 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 32904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 32915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that the control group correctly hits WOULD_HAVE_BEEN_USED 32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// renderer-initiated navigations. (This verifies that the ShouldFork logic 32985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// behaves correctly.) 32995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ControlGroupRendererInitiated) { 33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 33015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::SetMode( 33025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 33035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 33045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 33065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenDestURLViaClick(); 33075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that the MatchComplete dummy works in the normal case. Once 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a prerender is cancelled because of a script, a dummy must be created to 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account for the MatchComplete case, and it must have a final status of 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FINAL_STATUS_WOULD_HAVE_BEEN_USED. 33135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { 33145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 33155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 33175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 33195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 1); 33215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 33255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 33265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 33285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 33305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 33315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 33325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 33335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that a navigation that hits a MatchComplete dummy while another is in 33365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// progress does not also classify the previous navigation as a MatchComplete. 33375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 33385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MatchCompleteDummyCancelNavigation) { 33395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 33405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Arrange for a URL to hang. 33425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 33435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL( 33445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome/test/data/prerender/prerender_page.html")); 33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop hang_loop; 33465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 33475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 33485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateHangingFirstRequestProtocolHandlerOnIO, 33495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNoCommitUrl, file, hang_loop.QuitClosure())); 33505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First, fire a prerender that aborts after it completes its load. 33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_INVALID_HTTP_METHOD); 33545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 33555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 33565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 1); 33575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 33595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 33605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 33615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 1); 33625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open the hanging URL in a new tab. Wait for both the new tab to open and 33645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the hanging request to be scheduled. 33655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 33665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kNoCommitUrl, NEW_FOREGROUND_TAB, 33675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); 33685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hang_loop.Run(); 33695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now interrupt that navigation and navigate to the destination URL. This 33715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should forcibly complete the previous navigation and also complete a 33725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // WOULD_HAVE_BEEN_PRERENDERED navigation. 33735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 33745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 33755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 2); 33765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 33775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 33785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 33795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 0); 33805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 33815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTestWithNaCl() {} 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTestWithNaCl() {} 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableNaCl); 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that NaCl plugins work when enabled, with prerendering. 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl, 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderNaClPluginEnabled) { 3398ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 3399ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 3400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 3401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 3402ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 3403ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_enabled.html", 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid any chance of a race, we have to let the script send its response 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 34112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 34122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 34142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 34152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "DidDisplayReallyPass()", 34162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &display_test_result)); 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(display_test_result); 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering. 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering on HTTPS. 34307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 34315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderSSLReferrerPolicy) { 34325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UseHttpsSrcServer(); 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 344068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer policy is used when prerendering is cancelled. 344168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrerPolicy) { 344268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 344368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 344468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 344568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 344668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 344768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 344868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 344968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 345068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 345168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 345268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 345368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool display_test_result = false; 345468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebContents* web_contents = 345568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 345668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 345768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_contents, 345868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 345968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &display_test_result)); 346068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(display_test_result); 346168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 346268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 346368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 346468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interaction of the webNavigation and tabs API with prerender. 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithExtensions : public PrerenderBrowserTest, 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionApiTest { 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 34691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrerenderBrowserTestWithExtensions() { 34701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The individual tests start the test server through ExtensionApiTest, so 34711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // the port number can be passed through to the extension. 34721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) autostart_test_server_ = false; 34731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 34741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3475c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 3476c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PrerenderBrowserTest::SetUp(); 3477c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 3478c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpInProcessBrowserTestFixture(); 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::TearDownInProcessBrowserTestFixture(); 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::TearDownInProcessBrowserTestFixture(); 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, WebNavigation) { 35001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the extension to set itself up and return control to us. 35045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("webnavigation/prerender")) << message_; 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 35152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35200529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, TabsApi) { 35211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 35232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the extension to set itself up and return control to us. 35250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(RunExtensionTest("tabs/on_replaced")) << message_; 35262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 35282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 35302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 35332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that prerenders abort when navigating to a stream. 3542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// See chrome/browser/extensions/api/streams_private/streams_private_apitest.cc 3543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, StreamsTest) { 3544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(StartSpawnedTestServer()); 3545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const extensions::Extension* extension = LoadExtension( 3547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test_data_dir_.AppendASCII("streams_private/handle_mime_type")); 3548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(extension); 3549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(std::string(extension_misc::kStreamsPrivateTestExtensionId), 3550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) extension->id()); 3551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); 3552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(handler); 3553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(handler->CanHandleMIMEType("application/msword")); 3554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrerenderTestURL("files/prerender/document.doc", FINAL_STATUS_DOWNLOAD, 0); 3556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sanity-check that the extension would have picked up the stream in a normal 3558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // navigation had prerender not intercepted it. 3559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // streams_private/handle_mime_type reports success if it has handled the 3560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // application/msword type. 3561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResultCatcher catcher; 3562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NavigateToDestURL(); 3563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()); 3564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the 3567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 35695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderCancelSubresourceUnsupportedScheme) { 35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); 3571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 35732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 35772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 35782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 35794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 35802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Ensure that about:blank is permitted for any subresource. 3583a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderAllowAboutBlankSubresource) { 3585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL image_url = GURL("about:blank"); 3586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text.push_back( 3588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string replacement_path; 3590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3592a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text, 3593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &replacement_path)); 3594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3595a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 3596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3597a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the prerender 3599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// on redirect. 36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelSubresourceRedirectUnsupportedScheme) { 36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = test_server()->GetURL( 36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.jpg")); 3604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 36092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 36112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 36124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that chrome-extension subresource does not cancel the prerender. 3616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceExtensionScheme) { 3618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = GURL("chrome-extension://abcdefg/test.jpg"); 3619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that redirect to chrome-extension subresource does not cancel the 3632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 3633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceRedirectExtensionScheme) { 3635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = test_server()->GetURL( 3636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateServerRedirect("chrome-extension://abcdefg/test.jpg")); 3637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 36492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that non-http/https main page redirects cancel the prerender. 36502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelMainFrameRedirectUnsupportedScheme) { 36522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL( 36532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.html")); 36544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 36552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that media source video loads are deferred on prerendering. 36587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { 36597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_media_source.html", 36607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FINAL_STATUS_USED, 36617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 36625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 36635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(GetActiveWebContents(), kPassTitle); 36647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 36657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3666ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that a prerender that creates an audio stream (via a WebAudioDevice) 3667ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// is cancelled. 3668a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWebAudioDevice) { 3669a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DisableLoadEventCheck(); 3670ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_web_audio_device.html", 3671a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FINAL_STATUS_CREATING_AUDIO_STREAM, 0); 3672ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3673ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3674ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that prerenders do not swap in to WebContents being captured. 3675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCapturedWebContents) { 3676ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 3677ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_PAGE_BEING_CAPTURED, 1); 36785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents = GetActiveWebContents(); 36795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents->IncrementCapturerCount(gfx::Size()); 3680ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->DecrementCapturerCount(); 3682ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3683ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 36844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 36854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a server redirect. 36864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 36874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessServerRedirect) { 36884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Force everything to be a process swap. 36894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 36904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ContentBrowserClient* original_browser_client = 36914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 36924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 36944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html"), 36954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 0); 36964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 36974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 36984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 36994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that URLRequests for prerenders being aborted on cross-process 37015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// navigation from a server redirect are cleaned up, so they don't keep cache 37025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// entries locked. 37035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See http://crbug.com/341134 37045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderCrossProcessServerRedirectNoHang) { 37065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char kDestPath[] = "files/prerender/prerender_page.html"; 37075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force everything to be a process swap. 37085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 37095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 37105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 37115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect(kDestPath), FINAL_STATUS_OPEN_URL, 0); 37135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL( 37155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser(), 37165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_server()->GetURL(kDestPath)); 37175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 37195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 37205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 37224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a client redirect. 37234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 37244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessClientRedirect) { 37254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cross-process navigation logic for renderer-initiated navigations 37264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is partially controlled by the renderer, namely 37274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ChromeContentRendererClient. This test instead relies on the Web 37284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Store triggering such navigations. 37294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string webstore_url = extension_urls::GetWebstoreLaunchURL(); 37304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Mock out requests to the Web Store. 37325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file(GetTestPath("prerender_page.html")); 37334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::PostTask( 37344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 37354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, 37364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(webstore_url), file)); 37374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(CreateClientRedirect(webstore_url), 37394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 1); 37404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that canceling a MatchComplete dummy doesn't result in two 37434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// stop events. 37444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelMatchCompleteDummy) { 37455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<FinalStatus> expected_final_status_queue; 37464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 37474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_CANCELLED); 37485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<TestPrerender> prerenders = 37495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 37505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_final_status_queue, 0); 37514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cancel the MatchComplete dummy. 37535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->CancelAllPrerenders(); 37545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerenders[1]->WaitForStop(); 37554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check the referring page only got one copy of the event. 37574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 37584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 37594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 37605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the page is 37615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// visible. Also test the right histogram events are emitted in this case. 37624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { 37635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 37645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 37655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 37675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 37685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 37695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL( 37705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html", 37715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 0); 37725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 37735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 37745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 37755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 37765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 37775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 37785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 37795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 37805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 37815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap. 37835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 37845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 37855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 37865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), dest_url(), CURRENT_TAB, 37875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 37885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 37895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender never observes the final load. 37915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 37925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now check DidDisplayPass. 37945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 37955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 37975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PrerenderNotSwappedInPLT", 0); 37985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 37995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1); 38005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount( 38015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Prerender.websame_PerceivedPLTMatchedComplete", 1); 38024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the 38054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page is visible, even after another redirect. 38064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 38074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredImageAfterRedirect) { 38085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DisableJavascriptCalls(); 38095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender will not completely load until after the swap, so wait for a 38115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // title change before calling DidPrerenderPass. 38125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender = 38135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL( 38145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "files/prerender/prerender_deferred_image.html", 38155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_USED, 0); 38165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); 38175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); 38185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 38195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Swap. 38215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), 38225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()); 38235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 38245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), dest_url(), CURRENT_TAB, 38255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 38265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 38275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The prerender never observes the final load. 38295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, prerender->number_of_loads()); 38305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now check DidDisplayPass. 38325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 38334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed. 38364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredMainFrame) { 38374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 38384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 38394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "files/prerender/image-deferred.png", 38404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 38414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 38424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed, even 38454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// with a double-redirect. 38464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 38474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredMainFrameAfterRedirect) { 38484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 38494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 38504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/image-deferred.png"), 38514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 38524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 38534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in a synchronous XHR abort the 38564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// prerender. 38574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { 38584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_deferred_sync_xhr.html", 38594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); 38604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 38614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that prerenders are not swapped for navigations with extra headers. 38648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExtraHeadersNoSwap) { 38658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 38668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 38678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 38688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 38698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 38708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.extra_headers = "X-Custom-Header: 42\r\n"; 38718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams(params, false); 38728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 38738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 38748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks that prerenders are not swapped for navigations with browser-initiated 38758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// POST data. 38768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 38778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderBrowserInitiatedPostNoSwap) { 38788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 38798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 38808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 38818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string post_data = "DATA"; 38828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 38838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 38848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.uses_post = true; 38858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) params.browser_initiated_post_data = 38868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::RefCountedString::TakeString(&post_data); 38878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigateToURLWithParams(params, false); 38888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 38898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when the 3891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// prerendered page tries to make a second navigation entry. 3892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNewNavigationEntry) { 3893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_new_entry.html", 3894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FINAL_STATUS_NEW_NAVIGATION_ENTRY, 3895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1); 3896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Attempt a swap-in in a new tab, verifying that session storage namespace 3899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// merging works. 3900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTab) { 39015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock out some URLs and count the number of requests to one of them. Both 39025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender_session_storage.html and init_session_storage.html need to be 39035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mocked so they are same-origin. 39045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kInitURL("http://prerender.test/init_session_storage.html"); 39055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath init_file = GetTestPath("init_session_storage.html"); 39065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 39085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, kInitURL, init_file)); 39095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 39115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 39125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter counter; 39135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 39155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 39165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTestURL, test_file, counter.AsWeakPtr())); 39175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 39195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 39215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 39225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kInitURL, NEW_FOREGROUND_TAB, 39235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 39245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. Set expect_swap_to_succeed to false because 39265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the swap does not occur synchronously. 39275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 39295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // return value assertion and let this go through the usual successful-swap 39305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // codepath. 39315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 39325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass manually since the previous call skipped it. 39345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass( 39355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents())); 39365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only one request to the test URL started. 39385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Re-enable this check when the races in attaching the 39405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle are resolved. http://crbug.com/335835 39415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EXPECT_EQ(1, counter.count()); 39425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Attempt a swap-in in a new tab, verifying that session storage namespace 39455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// merging works. Unlike the above test, the swap is for a navigation that would 39465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// normally be cross-process. 39475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNewTabCrossProcess) { 39485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_data_dir; 39495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); 39505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Mock out some URLs and count the number of requests to one of them. Both 39525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender_session_storage.html and init_session_storage.html need to be 39535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mocked so they are same-origin. 39545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kInitURL("http://prerender.test/init_session_storage.html"); 39555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath init_file = GetTestPath("init_session_storage.html"); 39565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 39585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, kInitURL, init_file)); 39595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kTestURL("http://prerender.test/prerender_session_storage.html"); 39615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath test_file = GetTestPath("prerender_session_storage.html"); 39625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter counter; 39635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 39645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 39655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 39665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTestURL, test_file, counter.AsWeakPtr())); 39675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(kTestURL, FINAL_STATUS_USED, 1); 39695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 39715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 39725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), kInitURL, NEW_FOREGROUND_TAB, 39735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 39745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to about:blank so the next navigation is cross-process. 39765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), 39775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(content::kAboutBlankURL)); 39785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. Set expect_swap_to_succeed to false because 39805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the swap does not occur synchronously. 39815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When all swaps become asynchronous, remove the OpenURL 39835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // return value assertion and let this go through the usual successful-swap 39845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // codepath. 39855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 39865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass manually since the previous call skipped it. 39885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 39895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only one request to the test URL started. 39915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 39925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): Re-enable this check when the races in attaching the 39935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // throttle are resolved. http://crbug.com/335835 39945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EXPECT_EQ(1, counter.count()); 39955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 39965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that session storage conflicts don't merge. 39985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSessionStorageConflict) { 39995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_session_storage_conflict.html", 40005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 40015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 40035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 40045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), 40055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) test_server()->GetURL("files/prerender/init_session_storage.html"), 40065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NEW_FOREGROUND_TAB, 40075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 40085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now navigate in the new tab. 40105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 40115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Verify DidDisplayPass in the new tab. 40135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); 40145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that prerenders honor |should_replace_current_entry|. 40175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) { 40185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 40195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB, 40215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false); 40225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.should_replace_current_entry = true; 40235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToURLWithParams(params, false); 40245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NavigationController& controller = 40265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetController(); 40275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First entry is about:blank, second is prerender_page.html. 40285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(controller.GetPendingEntry() == NULL); 40295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2, controller.GetEntryCount()); 40305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GURL(content::kAboutBlankURL), 40315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryAtIndex(0)->GetURL()); 40325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(dest_url(), controller.GetEntryAtIndex(1)->GetURL()); 40335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks prerender does not hit DCHECKs and behaves properly if two pending 40365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// swaps occur in a row. 40375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDoublePendingSwap) { 40385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 40395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 40405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url1 = test_server()->GetURL("files/prerender/prerender_page.html?1"); 40425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender1 = 40435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL(url1, FINAL_STATUS_APP_TERMINATING, 1); 40445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url2 = test_server()->GetURL("files/prerender/prerender_page.html?2"); 40465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestPrerender> prerender2 = ExpectPrerender(FINAL_STATUS_USED); 40475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddPrerender(url2, 1); 40485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForStart(); 40495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->WaitForLoads(1); 40505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There's no reason the second prerender can't be used, but the swap races 40525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with didStartProvisionalLoad and didFailProvisionalLoad from the previous 40535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigation. The current logic will conservatively fail to swap under such 40545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // races. However, if the renderer is slow enough, it's possible for the 40555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // prerender to still be used, so don't program in either expectation. 40565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prerender2->contents()); 40575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prerender2->contents()->set_skip_final_checks(true); 40585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 40605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 40615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, 40625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 40635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fire off two navigations, without running the event loop between them. 40655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigationOrSwapObserver swap_observer( 40665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->tab_strip_model(), 40675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents(), 2); 40685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 40695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 40705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 40715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false)); 40725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) swap_observer.Wait(); 40735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The WebContents should be on url2. There may be 2 or 3 entries, depending 40755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // on whether the first one managed to complete. 40765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 40775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(davidben): When http://crbug.com/335835 is fixed, the 3 entry case 40785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // shouldn't be possible because it's throttled by the pending swap that 40795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cannot complete. 40805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const NavigationController& controller = 40815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetActiveWebContents()->GetController(); 40825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(controller.GetPendingEntry() == NULL); 40835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_LE(2, controller.GetEntryCount()); 40845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_GE(3, controller.GetEntryCount()); 40855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(GURL(content::kAboutBlankURL), 40865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryAtIndex(0)->GetURL()); 40875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(url2, controller.GetEntryAtIndex( 40885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) controller.GetEntryCount() - 1)->GetURL()); 40895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 40905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verify that pending swaps get aborted on new navigations. 40925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 40935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderPendingSwapNewNavigation) { 40945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderManager::HangSessionStorageMergesForTesting(); 40955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 40975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 1); 40985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open a new tab to navigate in. 41005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 41015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser(), GURL(content::kAboutBlankURL), NEW_FOREGROUND_TAB, 41025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 41035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate to the URL. Wait for DidStartLoading, just so it's definitely 41055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // progressed somewhere. 41065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver page_load_observer( 41075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::NOTIFICATION_LOAD_START, 41085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<NavigationController>( 41095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &GetActiveWebContents()->GetController())); 41105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 41115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_url(), Referrer(), CURRENT_TAB, 41125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 41135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_load_observer.Wait(); 41145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate somewhere else. This should succeed and abort the pending swap. 41165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNavigationObserver nav_observer(GetActiveWebContents()); 41175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 41185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL(content::kAboutBlankURL), Referrer(), CURRENT_TAB, 41195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, false)); 41205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nav_observer.Wait(); 41215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that <a ping> requests are not dropped in prerender. 41245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPing) { 41255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Count hits to a certain URL. 41265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL kPingURL("http://prerender.test/ping"); 41275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath empty_file = ui_test_utils::GetTestFilePath( 41285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); 41295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestCounter ping_counter; 41305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::PostTask( 41315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 41325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&CreateCountingProtocolHandlerOnIO, 41335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kPingURL, empty_file, ping_counter.AsWeakPtr())); 41345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 41365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OpenDestURLViaClickPing(kPingURL); 41375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ping_counter.WaitForCount(1); 41395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPPLTNormalNavigation) { 41425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMAHistogramHelper histograms; 41435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 41455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::NavigateToURL(current_browser(), url); 41465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.Fetch(); 41475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 41485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 41495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) histograms.ExpectTotalCount("Prerender.none_PerceivedPLTMatchedComplete", 0); 41505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 41515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 41535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 41545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 41555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* normal_profile = current_browser()->profile(); 41565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_browser(ui_test_utils::OpenURLOffTheRecord( 41575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) normal_profile, GURL("about:blank"))); 41585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 41595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 41605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 41615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Checks that prerendering works in incognito mode. 41635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, PrerenderIncognito) { 41645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 41655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NavigateToDestURL(); 4166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 4167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Checks that prerenders are aborted when an incognito profile is closed. 41690529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PrerenderIncognitoBrowserTest, 41700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PrerenderIncognitoClosed) { 41710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<TestPrerender> prerender = 41720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 41730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FINAL_STATUS_PROFILE_DESTROYED, 1); 41740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch current_browser()->window()->Close(); 41750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch prerender->WaitForStop(); 41760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 41770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 4179