prerender_browsertest.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager_factory.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager_browsertest_util.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/site_instance.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/test/net/url_request_mock_http_job.h" 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/base/escape.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_job.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsClientHost; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerender tests work as follows: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A page with a prefetch link to the test page is loaded. Once prerendered, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its Javascript function DidPrerenderPass() is called, which returns true if 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page behaves as expected when prerendered. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is then displayed on a tab. The Javascript function 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidDisplayPass() is called, and returns true if the page behaved as it 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should while being displayed. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants used in the test HTML files. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kReadyTitle = "READY"; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kPassTitle = "PASS"; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateClientRedirect(const std::string& dest_url) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kClientRedirectBase = "client-redirect?"; 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateServerRedirect(const std::string& dest_url) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kServerRedirectBase = "server-redirect?"; 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return kServerRedirectBase + net::EscapeQueryParamValue(dest_url, false); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears the specified data using BrowsingDataRemover. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearBrowsingData(Browser* browser, int remove_mask) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(browser->profile()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover deletes itself. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CancelAllPrerenders(PrerenderManager* prerender_manager) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->CancelAllPrerenders(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if and only if the final status is one in which the prerendered 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page should prerender correctly. The page still may not be used. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_USED: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_WINDOW_OPENER: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_APP_TERMINATING: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll crash the renderer after it's loaded. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_RENDERER_CRASHED: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CANCELLED: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_DEVTOOLS_ATTACHED: 139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case FINAL_STATUS_PAGE_BEING_CAPTURED: 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case FINAL_STATUS_NAVIGATION_UNCOMMITTED: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for the destruction of a RenderProcessHost's IPC channel. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to make sure the PrerenderLinkManager's OnChannelClosed function has 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been called, before checking its state. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelDestructionWatcher { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ChannelDestructionWatcher() : channel_destroyed_(false) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ChannelDestructionWatcher() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WatchChannel(content::RenderProcessHost* host) { 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host->AddFilter(new DestructionMessageFilter(this)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForChannelClose() { 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Run(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(channel_destroyed_); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When destroyed, calls ChannelDestructionWatcher::OnChannelDestroyed. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores all messages. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionMessageFilter : public content::BrowserMessageFilter { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : watcher_(watcher) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionMessageFilter() { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChannelDestructionWatcher::OnChannelDestroyed, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(watcher_))); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* message_was_ok) OVERRIDE { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher* watcher_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionMessageFilter); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnChannelDestroyed() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(channel_destroyed_); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_destroyed_ = true; 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) run_loop_.Quit(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool channel_destroyed_; 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::RunLoop run_loop_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderContents that stops the UI message loop on DidStopLoading(). 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrerenderContents : public PrerenderContents { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PrerenderContents(prerender_manager, profile, url, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, origin, PrerenderManager::kNoExperiment), 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_(0), 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads_(expected_number_of_loads), 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status), 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_(NULL), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_(false), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_(false), 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_shown_(expected_final_status == FINAL_STATUS_USED), 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quit_message_loop_on_destruction_( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status != FINAL_STATUS_APP_TERMINATING && 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status != FINAL_STATUS_MAX), 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pending_prerenders_(0), 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title_( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title) { 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Stop waiting if there are no loads to wait on AND the prerender 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is not expected to abort. (If it is expected to abort, the 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // event loop should spin until that happens.) 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(davidben): Split all the various wait cases into different 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // base::RunLoop instances so this all has some hope of being 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // understandable. 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (expected_number_of_loads == 0 && 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (ShouldRenderPrerenderedPageCorrectly(expected_final_status) || 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status == FINAL_STATUS_WOULD_HAVE_BEEN_USED)) { 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestPrerenderContents() { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_MAX) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(match_complete_status(), MATCH_COMPLETE_REPLACEMENT); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()) << 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " when testing URL " << prerender_url().path() << 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (Expected: " << NameFromFinalStatus(expected_final_status_) << 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerendering RenderViewHosts should be hidden before the first 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so this should be happen for every PrerenderContents for 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which a RenderViewHost is created, regardless of whether or not it's 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_render_view_host_) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(was_hidden_); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A used PrerenderContents will only be destroyed when we swap out 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents, at the end of a navigation caused by a call to 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigateToURLImpl(). 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_status() == FINAL_STATUS_USED) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_render_view_host_); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_be_shown_, was_shown_); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the PrerenderContents is destroyed, quit the UI message loop. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This happens on navigation to used prerendered pages, and soon 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after cancellation of unused prerendered pages. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (quit_message_loop_on_destruction_) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The message loop may not be running if this is swapped in 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronously on a Navigation. 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop* loop = base::MessageLoopForUI::current(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (loop->is_running()) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop->Quit(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On quit, it's possible to end up here when render processes are closed 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the PrerenderManager is destroyed. As a result, it's possible to 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on quit. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's also possible for this to be called after we've been notified of 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app termination, but before we've been deleted, which is why the second 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check is needed. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING && 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status() != expected_final_status_) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderContents::RenderProcessGone(status); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AddAliasURL(const GURL& url) OVERRIDE { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the PrerenderRendererCrash test. 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.spec() != content::kChromeUICrashURL) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrerenderContents::AddAliasURL(url); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::DidStopLoading(render_view_host); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++number_of_loads_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldRenderPrerenderedPageCorrectly(expected_final_status_) && 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_ == expected_number_of_loads_) { 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddPendingPrerender( 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PendingPrerenderInfo> pending_prerender_info) OVERRIDE { 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents::AddPendingPrerender(pending_prerender_info.Pass()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_pending_prerenders_ > 0 && 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_prerender_count() == expected_pending_prerenders_) { 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebContents* CreateWebContents( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace) OVERRIDE { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = PrerenderContents::CreateWebContents( 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ready_title = ASCIIToUTF16(kReadyTitle); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_should_wait_for_ready_title_) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_title_watcher_.reset(new content::TitleWatcher( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, ready_title)); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForPrerenderToHaveReadyTitleIfRequired() { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ready_title_watcher_.get()) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ready_title = ASCIIToUTF16(kReadyTitle); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ready_title, ready_title_watcher_->WaitAndGetTitle()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until the prerender has |expected_pending_prerenders| pending 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerenders. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForPendingPrerenders(size_t expected_pending_prerenders) { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_prerender_count() < expected_pending_prerenders) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pending_prerenders_ = expected_pending_prerenders; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pending_prerenders_ = 0; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_pending_prerenders, pending_prerender_count()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tests that open the prerender in a new background tab, the RenderView 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not have been made visible when the PrerenderContents is destroyed 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though it is used. 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_be_shown(bool value) { should_be_shown_ = value; } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_loads() const { return number_of_loads_; } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool quit_message_loop_on_destruction() const { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quit_message_loop_on_destruction_; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_quit_message_loop_on_destruction(bool quit) { 37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) quit_message_loop_on_destruction_ = quit; 37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host) OVERRIDE { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to make sure the RenderViewHost is hidden and, if used, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequently shown. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar().Add( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(new_render_view_host)); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_ = new_render_view_host; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::OnRenderViewHostCreated(new_render_view_host); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_render_view_host_, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(source).ptr()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = *content::Details<bool>(details).ptr(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_visible) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_ = true; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_visible && was_hidden_) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once hidden, a prerendered RenderViewHost should only be shown after 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being removed from the PrerenderContents for display. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetRenderViewHost()); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_ = true; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Observe(type, source, details); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_loads_; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads_; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RenderViewHost created for the prerender, if any. 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host_; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is hidden. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_hidden_; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is shown, after having been 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hidden. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_shown_; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected final value of was_shown_. Defaults to true for 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FINAL_STATUS_USED, and false otherwise. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_shown_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, quits message loop on destruction of |this|. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool quit_message_loop_on_destruction_; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total number of pending prerenders we're currently waiting for. Zero 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicates we currently aren't waiting for any. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_pending_prerenders_; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, before calling DidPrerenderPass, will wait for the title of the 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerendered page to turn to "READY". 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title_; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::TitleWatcher> ready_title_watcher_; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderManager that uses TestPrerenderContents. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForLoadPrerenderContentsFactory( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : expected_number_of_loads_(expected_number_of_loads), 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue_(expected_final_status_queue), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title_( 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Factory created with queue length " << 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue_.size(); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) OVERRIDE { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = FINAL_STATUS_MAX; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!expected_final_status_queue_.empty()) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status = expected_final_status_queue_.front(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue_.pop_front(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Creating prerender contents for " << url.path() << 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " with expected final status " << expected_final_status; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << expected_final_status_queue_.size() << " left in the queue."; 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new TestPrerenderContents(prerender_manager, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, url, referrer, origin, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads_, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title_); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads_; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue_; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title_; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager implementation that returns a fixed result for 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a given URL. 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SafeBrowsingDatabaseManager(service), 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) threat_type_(SB_THREAT_TYPE_SAFE) { } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given url is safe or not. If we 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the url is safe, CheckUrl returns true. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it returns false, and "client" is called asynchronously with the 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result when it is ready. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true, indicating a SAFE result, unless the URL is the fixed URL 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the user, and the user-specified result is not SAFE 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in which that result will be communicated back via a call into the 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client, and false will be returned). 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides SafeBrowsingService::CheckBrowseUrl. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gurl != url_ || threat_type_ == SB_THREAT_TYPE_SAFE) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone, 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, gurl, client)); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetThreatTypeForUrl(const GURL& url, SBThreatType threat_type) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ = url; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingDatabaseManager() {} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCheckBrowseURLDone(const GURL& gurl, Client* client) { 52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<SBThreatType> expected_threats; 52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check( 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL>(1, gurl), 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBFullHash>(), 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) safe_browsing_util::MALWARE, 52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_check.url_results[0] = threat_type_; 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->OnSafeBrowsingResult(sb_check); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService { 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingService() { } 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returned pointer has the same lifespan as the database_manager_ refcounted 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager() { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingService() { } 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager_; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingServiceFactory() : 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_(NULL) { } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingServiceFactory() { } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_ = new FakeSafeBrowsingService(); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service() const { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service_; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDevToolsClientHost : public DevToolsClientHost { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost() {} 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDevToolsClientHost() {} 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InspectedContentsClosing() OVERRIDE {} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DispatchOnInspectorFrontend(const std::string& msg) OVERRIDE {} 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReplacedWithAnotherClient() OVERRIDE {} 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// URLRequestJob (and associated handler) which never starts. 604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NeverStartURLRequestJob : public net::URLRequestJob { 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NeverStartURLRequestJob(net::URLRequest* request, 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : net::URLRequestJob(request, network_delegate) { 609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Start() OVERRIDE {} 612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~NeverStartURLRequestJob() {} 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NeverStartProtocolHandler 618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NeverStartProtocolHandler() {} 621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~NeverStartProtocolHandler() {} 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequest* request, 625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return new NeverStartURLRequestJob(request, network_delegate); 627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void CreateNeverStartProtocolHandlerOnIO(const GURL& url) { 631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( 633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new NeverStartProtocolHandler()); 634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url, never_respond_handler.Pass()); 636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Makes |url| respond to requests with the contents of |file|. 6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CreateMockProtocolHandlerOnIO(const GURL& url, 6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& file) { 6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) url, content::URLRequestMockHTTPJob::CreateProtocolHandlerForSingleFile( 6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file)); 6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 64768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A ContentBrowserClient that cancels all prerenderers on OpenURL. 64868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class TestContentBrowserClient : public chrome::ChromeContentBrowserClient { 64968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 65068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestContentBrowserClient() {} 65168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~TestContentBrowserClient() {} 65268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 65368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 65468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual bool ShouldAllowOpenURL(content::SiteInstance* site_instance, 65568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& url) OVERRIDE { 65668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderManagerFactory::GetForProfile( 65768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::FromBrowserContext(site_instance->GetBrowserContext())) 65868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ->CancelAllPrerenders(); 65968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return chrome::ChromeContentBrowserClient::ShouldAllowOpenURL(site_instance, 66068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) url); 66168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 66268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 66368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 66468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient); 66568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 66668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A ContentBrowserClient that forces cross-process navigations. 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SwapProcessesContentBrowserClient 6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public chrome::ChromeContentBrowserClient { 6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient() {} 6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~SwapProcessesContentBrowserClient() {} 6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // chrome::ChromeContentBrowserClient implementation. 6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual bool ShouldSwapProcessesForRedirect( 6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ResourceContext* resource_context, 6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& current_url, 6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& new_url) OVERRIDE { 6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient); 6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Many of these tests are flaky. See http://crbug.com/249179 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTest : virtual public InProcessBrowserTest { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest() 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : autostart_test_server_(true), 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents_factory_(NULL), 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_https_src_server_(false), 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_(true), 6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_(true), 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_("files/prerender/prerender_loader.html"), 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_(NULL) {} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTest() {} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const { 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 710ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return web_contents->GetController().GetDefaultSessionStorageNamespace(); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 713c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 714c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // TODO(danakj): The GPU Video Decoder needs real GL bindings. 715c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // crbug.com/269087 716c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch UseRealGLBindings(); 717c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 718c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch InProcessBrowserTest::SetUp(); 719c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 720c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kPrerenderMode, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValueEnabled); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugins directory isn't read by default on the Mac, so it needs to be 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly registered. 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_dir; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP, &app_dir); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath( 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kExtraPluginDir, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_dir.Append(FILE_PATH_LITERAL("plugins"))); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (autostart_test_server_) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overload for a single expected final status 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL(const std::string& html_file, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(html_file, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL(const std::string& html_file, 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue(1, 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(html_file, 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(url, url, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(html_file, expected_final_status_queue, 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, false); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue(1, 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(url, url, 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& destination_url, 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue(1, 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(prerender_url, destination_url, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURL() const { 818868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, true); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the url in a new tab, with no opener. 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURLWithDisposition( 823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToURLImpl(dest_url_, disposition, expect_swap_to_succeed); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClick() const { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("Click()"); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickTarget() const { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("ClickTarget()"); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewWindow() const { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("ShiftClick()"); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewForegroundTab() const { 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("MetaShiftClick()"); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("CtrlShiftClick()"); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewBackgroundTab() const { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents != NULL); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents->set_should_be_shown(false); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("MetaClick()"); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("CtrlClick()"); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaWindowOpen() const { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("WindowOpen()"); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveLinkElement(int i) const { 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents()-> 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRenderViewHost()->ExecuteJavascriptInWebFrame( 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClickToNextPageAfterPrerender() { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver new_page_observer( 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_NAV_ENTRY_COMMITTED, 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* render_view_host = current_browser()->tab_strip_model()-> 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("ClickOpenLink()")); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_page_observer.Wait(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToNextPageAfterPrerender() const { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html")); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestUrlAndWaitForPassTitle() { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 expected_title = ASCIIToUTF16(kPassTitle); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher( 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContents()->prerender_contents(), 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_title); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after the prerendered page has been navigated to and then away from. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates back through the history to the prerendered page. 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPrerender() { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver back_nav_observer( 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_NAV_ENTRY_COMMITTED, 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool original_prerender_page = false; 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(IsOriginalPrerenderPage())", 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_prerender_page)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(original_prerender_page); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Goes back to the page that was active before the prerender was swapped 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. This must be called when the prerendered page is the current page 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the active tab. 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPageBeforePrerender() { 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab->IsLoading()); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver back_nav_observer( 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>(&tab->GetController())); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool js_result; 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidBackToOriginalPagePass())", 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &js_result)); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(js_result); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURL(const std::string& dest_html_file) const { 935d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition(dest_html_file, CURRENT_TAB, true); 936d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 937d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 938d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void NavigateToURLWithDisposition(const std::string& dest_html_file, 939d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) WindowOpenDisposition disposition, 940d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool expect_swap_to_succeed) const { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url = test_server()->GetURL(dest_html_file); 942d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLImpl(dest_url, disposition, expect_swap_to_succeed); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const std::string& html_file) const { 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const GURL& url) const { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderManager()->FindPrerenderData( 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetSessionStorageNamespace()) != NULL; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_use_https_src(bool use_https_src_server) { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_https_src_server_ = use_https_src_server; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableJavascriptCalls() { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_ = false; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void DisableLoadEventCheck() { 9634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) check_load_events_ = false; 9644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerModel* GetModel() const { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TaskManager::GetInstance()->model(); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* GetPrerenderManager() const { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile(current_browser()->profile()); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrerenderLinkManager* GetPrerenderLinkManager() const { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager = 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManagerFactory::GetForProfile( 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStartEventForLinkNumber(int index) const { 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_started; 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderStartEvents[%d]))", index); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_started)); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_started; 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int GetPrerenderLoadEventCountForLinkNumber(int index) const { 9974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int load_event_count; 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 9994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "window.domAutomationController.send(" 10004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "receivedPrerenderLoadEvents[%d] || 0)", index); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractInt( 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 10054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &load_event_count)); 10064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return load_event_count; 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStopEventForLinkNumber(int index) const { 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_stopped; 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderStopEvents[%d]))", index); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_stopped)); 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_stopped; 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HadPrerenderEventErrors() const { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool had_prerender_event_errors; 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " hadPrerenderEventErrors))", 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &had_prerender_event_errors)); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return had_prerender_event_errors; 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asserting on this can result in flaky tests. PrerenderHandles are 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // removed from the PrerenderLinkManager when the prerender is canceled from 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser, when the prerenders are cancelled from the renderer process, 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or the channel for the renderer process is closed on the IO thread. In the 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last case, the code must be careful to wait for the channel to close, as it 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is done asynchronously after swapping out the old process. See 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ChannelDestructionWatcher. 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->IsEmpty(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns length of |prerender_manager_|'s history, or -1 on failure. 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetHistoryLength() const { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DictionaryValue> prerender_dict( 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue())); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict.get()) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* history_list; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict->GetList("history", &history_list)) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(history_list->GetSize()); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return safe_browsing_factory_->most_recent_service()-> 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager(); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data = 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->FindPrerenderData( 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, GetSessionStorageNamespace()); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TestPrerenderContents*>( 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_data ? prerender_data->contents() : NULL); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContents() const { 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPrerenderContentsFor(dest_url_); 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_path(const std::string& path) { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_ = path; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_query_and_fragment(const std::string& query_and_fragment) { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_and_fragment_ = query_and_fragment; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCrossDomainTestUrl(const std::string& path) { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string secondary_domain = "www.foo.com"; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str(base::StringPrintf( 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s", 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_domain.c_str(), 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->host_port_pair().port(), 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.c_str())); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url_str); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_browser(Browser* browser) { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_ = browser; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() const { 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return explicitly_set_browser_ ? explicitly_set_browser_ : browser(); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreasePrerenderMemory() { 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase the memory allowed in a prerendered page above normal settings. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug build bots occasionally run against the default limit, and tests 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // were failing because the prerender was canceled due to memory exhaustion. 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/93076 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 1000 * 1024 * 1024; 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool autostart_test_server_; 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURLImpl( 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& destination_url, 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_url_ = destination_url; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_DESTINATION_URL", destination_url.spec())); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_, 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::SpawnedTestServer* src_server = test_server(); 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<net::SpawnedTestServer> https_src_server; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_https_src_server_) { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_src_server.reset( 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new net::SpawnedTestServer( 1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_src_server->Start()); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_server = https_src_server.get(); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL loader_url = src_server->GetURL(replacement_path + 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_and_fragment_); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = GetPrerenderManager(); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_manager); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->mutable_config().rate_limit_enabled = false; 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->mutable_config().https_allowed = true; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents_factory_ == NULL); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_ = 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WaitForLoadPrerenderContentsFactory( 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->SetPrerenderContentsFactory( 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = expected_final_status_queue.front(); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We construct launch_nav_observer so that we can be certain our loader 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page has finished loading before continuing. This prevents ambiguous 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTIFICATION_LOAD_STOP events from making tests flaky. 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver loader_nav_observer( 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ui_test_utils::NavigateToURL uses its own observer and message loop. 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since the test needs to wait until the prerendered page has stopped 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading, rather than the page directly navigated to, need to 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handle browser navigation directly. 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that we've run the prerender until it stopped loading, we can now 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also make sure the launcher has finished loading. 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_nav_observer.Wait(); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (call_javascript_) { 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the prerendered page to change title to signal it is ready 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if required. 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents->WaitForPrerenderToHaveReadyTitleIfRequired(); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if page behaves as expected while in prerendered state. 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_test_result = false; 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents->GetRenderViewHostMutable(), 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidPrerenderPass())", 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &prerender_test_result)); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_test_result); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Test that the referring page received events. 12044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 12054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (check_load_events_) { 12064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_number_of_loads, 12074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetPrerenderLoadEventCountForLinkNumber(0)); 12084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the failure case, we should have removed |dest_url_| from the 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerender_manager. We ignore dummy PrerenderContents (as indicated 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by not having started), and PrerenderContents that are expected to 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be left in the manager until the test finishes. 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents == NULL || 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !prerender_contents->prerendering_has_started()); 12174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (expected_final_status != FINAL_STATUS_WOULD_HAVE_BEEN_USED) { 12194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Not a dummy PrerenderContents, so test that the referring 12204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // page received events. 12214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 12224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (check_load_events_) { 12234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_number_of_loads, 12244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetPrerenderLoadEventCountForLinkNumber(0)); 12254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 12274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURLImpl(const GURL& dest_url, 1233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 1234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure in navigating we have a URL to use in the PrerenderManager. 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If opening the page in a background tab, it won't be shown when swapped 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (disposition == NEW_BACKGROUND_TAB) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContents()->set_should_be_shown(false); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::WindowedNotificationObserver> page_load_observer; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = NULL; 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetPrerenderContents()->prerender_contents()) { 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the case of zero loads, need to wait for the page load to complete 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before running any Javascript. 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents = GetPrerenderContents()->prerender_contents(); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetPrerenderContents()->number_of_loads() == 0) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_load_observer.reset( 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::WindowedNotificationObserver( 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController()))); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to the prerendered URL, but don't run the message loop. Browser 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // issued navigations to prerendered pages will synchronously swap in the 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerendered page. 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), dest_url, disposition, 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (call_javascript_ && web_contents && expect_swap_to_succeed) { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_load_observer.get()) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_load_observer->Wait(); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents, 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &display_test_result)); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(display_test_result); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the prerendered page using javascript functions in the 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loader page. |javascript_function_name| should be a 0 argument function 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is invoked. 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLWithJSImpl(const std::string& javascript_function_name) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const { 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* render_view_host = current_browser()->tab_strip_model()-> 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), ASCIIToUTF16(javascript_function_name)); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_contents->quit_message_loop_on_destruction()) { 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Run message loop until the prerender contents is destroyed. 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't expect to pick up a running prerender, so instead 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observe one navigation. 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestNavigationObserver observer( 1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents()); 1302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) observer.StartWatchingNewWebContents(); 13034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) observer.Wait(); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url_; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_https_src_server_; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool call_javascript_; 13144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool check_load_events_; 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_path_; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_query_and_fragment_; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* explicitly_set_browser_; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a page is correctly prerendered in the case of a 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <link rel=prerender> tag and then loaded into a tab in response to a 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders launch and receive proper event treatment. 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to http://crbug.com/167792 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderPagePending) { 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_pending.html", 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue, 1); 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher first_channel_close_watcher; 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NavigateToDestURL doesn't run a message loop. Normally that's fine, but in 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this case, we need the pending prerenders to start. 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_channel_close_watcher.WaitForChannelClose(); 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL prerender_page_url = 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html"); 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContentsFor(prerender_page_url)); 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now navigate to our target page. 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher second_channel_close_watcher; 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), prerender_page_url, CURRENT_TAB, 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_channel_close_watcher.WaitForChannelClose(); 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders which are canceled before they are launched 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// never get started. 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 1); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky, http://crbug.com/167340. 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=1"); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No ChannelDestructionWatcher is needed here, since prerenders in the 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderLinkManager should be deleted by removing the links, rather than 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting down the renderer process. 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky, http://crbug.com/167340. 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=2"); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(1); 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageRemovingLinkWithTwoLinksRemovingOne 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest, 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=2"); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering works in incognito mode. 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* normal_profile = current_browser()->profile(); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_browser( 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase memory expectations on the incognito PrerenderManager. 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the visibility API works. 14967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 14977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderVisibility) { 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_visibility.html", 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly if we try to 1505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// swap it in before it commits. 1506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { 1507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to a page that triggers a prerender for a URL that never commits. 1508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 1509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::PostTask( 1510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 1511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&CreateNeverStartProtocolHandlerOnIO, kNoCommitUrl)); 15124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 1513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(kNoCommitUrl, 15144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_NAVIGATION_UNCOMMITTED, 1515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 0); 1516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to the URL, but assume the contents won't be swapped in. 1518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 15264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded while a page is being preloaded, but 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded when the page is displayed. 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 1541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 15424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// http://crbug.com/306715 15434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderDelayLoadPlugin) { 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/plugin_delay_load.html", 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded on prerendering pages when click-to-play 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is enabled. 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickToPlay) { 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable click-to-play. 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* content_settings_map = 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetHostContentSettingsMap(); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings_map->SetDefaultContentSetting( 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_click_to_play.html", 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't load a NaCl plugin when NaCl is disabled. 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNaClPluginDisabled) { 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_disabled.html", 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run this check again. When we try to load aa ppapi plugin, the 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "loadstart" event is asynchronously posted to a message loop. 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that earlier call could have been run before the 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the "loadstart" event was posted. 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): While this should reliably fail on regressions, the 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reliability depends on the specifics of ppapi plugin 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading. It would be great if we could avoid that. 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents, 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &display_test_result)); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(display_test_result); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins in an iframe are not loaded while a page is 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being preloaded, but are loaded when the page is displayed. 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 1600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 1603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin PrerenderIframeDelayLoadPlugin 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderIframeDelayLoadPlugin) { 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a page that contains a prerender link to a page that contains an 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe with a source that requires http authentication. This should not 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender successfully. 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 16214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectNavigateToFirst) { 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderClientRedirectNavigateToSecond) { 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectNavigateToSecondViaClick) { 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html")); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 2); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender for an https will prevent a prerender from happening. 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects to an https page will cancel prerenders. 16737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectToHttps) { 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect(https_url.spec()), 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 16887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectInIframe) { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect( 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page to an https page will not cancel the prerender, nor will it 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// count as an "alias" for the prerendered page. 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectToHttpsInIframe) { 1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect(https_url.spec()); 1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(https_url)); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToFirst) { 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecond) { 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecondViaClick) { 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html")); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 1); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects from an http to an https 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// location will cancel prerendering. 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectToHttps) { 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect(https_url.spec()), 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect( 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page to an https page will not cancel the prerender, nor will it 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// count as an "alias" for the prerendered page. 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 18037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderServerRedirectToHttpsInIframe) { 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect(https_url.spec()); 1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(https_url)); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through an 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe. This should not prerender successfully. 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) { 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_iframe.html", 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 18284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript changing the window.location. This should not prerender 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successfully 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through a 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client-issued redirect. This should not prerender successfully. 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_refresh.html", 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is set when prerendering. 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is not set when prerendering and the source page is 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTPS. 18587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 18597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderNoSSLReferrer) { 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_use_https_src(true); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_no_referrer.html", 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer is set when prerendering is cancelled. 186868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrer) { 186968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 187068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 187168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 187268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 187368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 187468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 187568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 187668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 187768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetPrerenderContents()->set_quit_message_loop_on_destruction(false); 187868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 187968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 188068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool display_test_result = false; 188168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebContents* web_contents = 188268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 188368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 188468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_contents, 188568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 188668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &display_test_result)); 188768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(display_test_result); 188868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 188968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 189068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 189168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that popups on a prerendered page cause cancellation. 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_popup.html", 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CREATE_NEW_WINDOW, 18964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that registering a protocol handler causes cancellation. 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRegisterProtocolHandler) { 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_register_protocol_handler.html", 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_REGISTER_PROTOCOL_HANDLER, 19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that renderers using excessive memory will be terminated. 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) { 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderManager()); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 30 * 1024 * 1024; 19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The excessive memory kill may happen before or after the load event as it 19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // happens asynchronously with IPC calls. Even if the test does not start 19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // allocating until after load, the browser process might notice before the 19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // message gets through. This happens on XP debug bots because they're so 19144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // slow. Instead, don't bother checking the load event count. 19154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableLoadEventCheck(); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_excessive_memory.html", 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks shutdown code while a prerender is active. 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 19234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test. 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop. 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()); 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContents()->WaitForPendingPrerenders(1u); 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next url is now in the manager 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test. 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop and multiple links are 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handled correctly. 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_PrerenderInfiniteLoopMultiple) { 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_a_multiple.html"; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_b_multiple.html"; 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileC = 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_c_multiple.html"; 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is conceptually simplest if concurrency is at two, since we 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContents()->WaitForPendingPrerenders(2u); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next urls are now in the manager 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. One and only one of the URLs (the last seen) should be the 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active entry. 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See crbug.com/131836. 199458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTaskManager) { 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the task manager. This populates the model. 1996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::OpenTaskManager(current_browser()); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the model of task manager to start. 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerBrowserTestUtil::WaitForWebResourceChange(1); 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with two resources. 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One of the resources that has a WebContents associated with it should have 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the Prerender prefix. 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 prefix = 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, string16()); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 prerender_title; 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_prerender_tabs = 0; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TaskManagerModel* model = GetModel(); 201158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The task manager caches values. Force the titles to be fresh. 201258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model->Refresh(); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->ResourceCount(); ++i) { 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetResourceWebContents(i)) { 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_title = model->GetResourceTitle(i); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWith(prerender_title, prefix, true)) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_prerender_tabs; 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_prerender_tabs); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 prerender_page_title = prerender_title.substr(prefix.length()); 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be no tabs with the Prerender prefix. 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 tab_prefix = 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, string16()); 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_prerender_tabs = 0; 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_tabs_with_prerender_page_title = 0; 203058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model->Refresh(); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->ResourceCount(); ++i) { 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetResourceWebContents(i)) { 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 tab_title = model->GetResourceTitle(i); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWith(tab_title, prefix, true)) { 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_prerender_tabs; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWith(tab_title, tab_prefix, true)); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The prerender tab should now be a normal tab but the title should be 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same. Depending on timing, there may be more than one of these. 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 tab_page_title = tab_title.substr(tab_prefix.length()); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_page_title.compare(tab_page_title) == 0) 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_tabs_with_prerender_page_title; 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_prerender_tabs); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may have deleted the prerender tab, but the swapped in tab should be 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active. 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(num_tabs_with_prerender_page_title, 1); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(num_tabs_with_prerender_page_title, 2); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering. 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Times out under AddressSanitizer, see http://crbug.com/108402 20577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderHTML5Audio) { 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio.html", 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if autoplay is set. 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Periodically fails on chrome-os. See http://crbug.com/145263 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5AudioAutoplay) { 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_autoplay.html", 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if js starts playing. 20777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5AudioJsplay) { 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_jsplay.html", 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video loads are deferred on prerendering. 20867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderHTML5Video) { 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video.html", 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video tags inserted by javascript are deferred and played 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly on swap in. 20957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5VideoJs) { 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_script.html", 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks for correct network events by using a busy sleep the javascript. 21047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5VideoNetwork) { 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_network.html", 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that scripts can retrieve the correct window size while prerendering. 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): Widget hierarchy split causes this to fail http://crbug.com/82363 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderWindowSize) { 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowSize) { 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_size.html", 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flakily times out: http://crbug.com/171546 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerenderers will terminate when the RenderView crashes. 21287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderRendererCrash) { 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_RENDERER_CRASHED, 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to about:crash and then wait for the renderer to crash. 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()->prerender_contents()); 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContents()->prerender_contents()->GetController(). 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURL( 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(content::kChromeUICrashURL), 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageWithFragment) { 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html#fragment", 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageWithRedirectedFragment) { 2162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderTestURL( 2163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html#fragment"), 2164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FINAL_STATUS_USED, 2165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2); 2166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 2168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 2169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 2170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToDestURL(); 2171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 2172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 2174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 2175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when navigating from 2177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the main page to a fragment. 2178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderPageNavigateFragment) { 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html", 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to the main page. 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigatePage) { 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#fragment", 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when we prerender a fragment 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to a different fragment on the same page. 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderFragmentNavigateFragment) { 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#other_fragment", 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 2207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh from a fragment on the same page. 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectFromFragment) { 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 22174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html#fragment"), 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html", 2222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Checks that we do not use a prerendered page when the page uses a client 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh to a fragment on the same page. 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrerenderClientRedirectToFragment) { 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html"), 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 2233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigateToURLWithDisposition( 2234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "files/prerender/no_prerender_page.html#fragment", 2235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CURRENT_TAB, false); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses JS to set 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the window.location.hash to a fragment on the same page. 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageChangeFragmentLocationHash) { 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a PNG works correctly. 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.png", FINAL_STATUS_USED, 1); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a JPG works correctly. 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.jpeg", FINAL_STATUS_USED, 1); 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender of a CRX will result in a cancellation due to 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download. 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr GET requests allow prerenders. 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrGet) { 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_get.html", 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr HEAD requests allow prerenders. 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrHead) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_head.html", 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr OPTIONS requests allow prerenders. 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrOptions) { 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_options.html", 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr TRACE requests allow prerenders. 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrTrace) { 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_trace.html", 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr POST requests allow prerenders. 23017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderXhrPost) { 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_post.html", 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr PUT cancels prerenders. 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr DELETE cancels prerenders. 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) { 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_delete.html", 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would trigger an SSL error is canceled. 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) { 2324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 23274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 23284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 23294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_ERROR, 23344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from a subresource does not cancel 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 23444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 23454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 23464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from an iframe does not cancel 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { 2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 23684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 23694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 23704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we cancel correctly when window.print() is called. 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_print.html", 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_PRINT, 23904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened in a new window by javascript and both the 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pages are in the same domain, the prerendered page is not used. 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerWindowOpen) { 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaWindowOpen(); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened due to click on a href with target="_blank" 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and both pages are in the same domain the prerendered page is not used. 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerClickTarget) { 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickTarget(); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would normally request an SSL client 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate will never be seen since it's an https top-level resource. 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertTopLevel) { 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 24184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 24194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 24204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 24234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 0); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from a 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresource will cancel the prerendered page. 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSSLClientCertSubresource) { 2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 24324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 24334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 24344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 24474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from an 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe will cancel the prerendered page. 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertIframe) { 2453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 24554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer https_server( 24564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 24574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 24714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages with a safe browsing 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial. 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingTopLevel) { 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 24824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 0); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that server redirects to a malware page will cancel prerenders. 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingServerRedirect) { 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 24934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that client redirects to a malware page will cancel prerenders. 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingClientRedirect) { 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware subresource. 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url = test_server()->GetURL("files/prerender/image.jpeg"); 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url, SB_THREAT_TYPE_URL_MALWARE); 2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 25224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware iframe. 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingIframe) { 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL iframe_url = test_server()->GetURL( 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iframe_url, SB_THREAT_TYPE_URL_MALWARE); 2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", iframe_url.spec())); 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 25414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage read will not cause prerender to fail. 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageRead) { 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_read.html", 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage write will not cause prerender to fail. 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_write.html", 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the favicon is properly loaded on prerender. 25637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderFavicon) { 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_favicon.html", 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents != NULL); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver favicon_update_watcher( 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_FAVICON_UPDATED, 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<WebContents>(prerender_contents->prerender_contents())); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_update_watcher.Wait(); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when a prerendered page is swapped in to a referring page, the 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unload handlers on the referring page are executed. 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails about 50% on CrOS, 5-10% on linux, win, mac. http://crbug.com/128986 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderUnload) { 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 expected_title = ASCIIToUTF16("Unloaded"); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher( 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_title); 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the history is cleared, prerendering is cancelled and 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is cleared. 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to clear the history, and run the message loop until it 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroys the prerender. 260090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_HISTORY)); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was cleared. 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetHistoryLength()); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the cache is cleared, prerenders are cancelled but 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is not cleared. 2612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flaky/times out on linux_aura, win, mac - http://crbug.com/270948 2613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderClearCache) { 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to clear the cache, and run the message loop until it 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroys the prerender. 262090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_CACHE)); 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was not cleared. Not a vital behavior, but 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to compare with PrerenderClearHistory test. 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetHistoryLength()); 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to cancel all the prerenders. 263590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetPrerenderContents() == NULL); 26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 264590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancels the prerender of a page with its own prerender. The second prerender 26552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should never be started. 26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelPrerenderWithPrerender) { 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_infinite_a.html", 26592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CANCELLED, 26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Post a task to cancel all the prerenders. 266290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetPrerenderContents() == NULL); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerendering and history tests. 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is navigated to in several ways [navigate via 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox, click on link, key-modified click to open in background tab, etc], 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// followed by a navigation to another page from the prerendered page, followed 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a back navigation. 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderNavigateClickGoBack) { 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled due to timeouts on commit queue. 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/121130 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderNavigateNavigateGoBack) { 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClickClickGoBack) { 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled due to timeouts on commit queue. 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/121130 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderClickNavigateGoBack) { 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewWindow(); 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewForegroundTab(); 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClickNewBackgroundTab) { 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewBackgroundTab(); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPrerenderedPageWhenDevToolsAttached) { 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetOrCreateFor( 27462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost())); 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager* manager = DevToolsManager::GetInstance(); 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost client_host; 2749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manager->RegisterDevToolsClientHostFor(agent.get(), &client_host); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url = "files/prerender/prerender_page.html"; 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL(url); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->ClientHostClosing(&client_host); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that the sessionStorage namespace remains the same when swapping 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a prerendered page. 27587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderSessionStorage) { 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPageBeforePrerender(); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/142535 - Times out on Chrome Mac release builder 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ControlGroup DISABLED_ControlGroup 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ControlGroup ControlGroup 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the control group works. A JS alert cannot be detected in the 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control group. 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_ControlGroup) { 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 27804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that the MatchComplete dummy works in the normal case. Once 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a prerender is cancelled because of a script, a dummy must be created to 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account for the MatchComplete case, and it must have a final status of 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FINAL_STATUS_WOULD_HAVE_BEEN_USED. 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/142912 - Times out on Chrome Mac release builder 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_MatchCompleteDummy DISABLED_MatchCompleteDummy 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_MatchCompleteDummy MatchCompleteDummy 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_MatchCompleteDummy) { 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 28014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue, 0); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTestWithNaCl() {} 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTestWithNaCl() {} 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableNaCl); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that NaCl plugins work when enabled, with prerendering. 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl, 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderNaClPluginEnabled) { 2819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 2820ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 2821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 2822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 2824ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_enabled.html", 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid any chance of a race, we have to let the script send its response 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "DidDisplayReallyPass()", 28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &display_test_result)); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(display_test_result); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering. 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering on HTTPS. 28517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderSSLReferrerPolicy) { 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_use_https_src(true); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Checks that the referrer policy is used when prerendering is cancelled. 286268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelReferrerPolicy) { 286368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<TestContentBrowserClient> test_content_browser_client( 286468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new TestContentBrowserClient); 286568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::ContentBrowserClient* original_browser_client = 286668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(test_content_browser_client.get()); 286768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 286868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 286968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 287068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FINAL_STATUS_CANCELLED, 287168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1); 287268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetPrerenderContents()->set_quit_message_loop_on_destruction(false); 287368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OpenDestURLViaClick(); 287468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 287568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool display_test_result = false; 287668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebContents* web_contents = 287768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 287868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 287968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_contents, 288068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 288168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &display_test_result)); 288268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(display_test_result); 288368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 288468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 288568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 288668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interaction of the webNavigation and tabs API with prerender. 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithExtensions : public PrerenderBrowserTest, 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionApiTest { 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2891c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 2892c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PrerenderBrowserTest::SetUp(); 2893c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 2894c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpInProcessBrowserTestFixture(); 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::TearDownInProcessBrowserTestFixture(); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::TearDownInProcessBrowserTestFixture(); 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/177163 2916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, 29177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_WebNavigation) { 2918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 2922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kAllowLegacyExtensionManifests); 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the extension to set itself up and return control to us. 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunExtensionSubtest("webnavigation", "test_prerender.html")) << message_; 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 29342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 29352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 294290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails often on Windows dbg bots. http://crbug.com/177163 294390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN) 294490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_TabsApi DISABLED_TabsApi 294590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 294690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_TabsApi TabsApi 294790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // defined(OS_WIN) 294890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, MAYBE_TabsApi) { 2949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the extension to set itself up and return control to us. 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(RunExtensionSubtest("tabs/on_replaced", "on_replaced.html")) 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << message_; 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 29572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the 2971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderCancelSubresourceUnsupportedScheme) { 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); 2975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 29782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 2979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 29822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 29834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 29842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2987a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Ensure that about:blank is permitted for any subresource. 2988a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2989a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderAllowAboutBlankSubresource) { 2990a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL image_url = GURL("about:blank"); 2991a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 2992a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text.push_back( 2993a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 2994a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string replacement_path; 2995a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 2996a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "files/prerender/prerender_with_image.html", 2997a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text, 2998a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &replacement_path)); 2999a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3000a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 3001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the prerender 3004868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// on redirect. 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelSubresourceRedirectUnsupportedScheme) { 30072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = test_server()->GetURL( 30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.jpg")); 3009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 30102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 30122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 3013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 30174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3021868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that chrome-extension subresource does not cancel the prerender. 3022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceExtensionScheme) { 3024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = GURL("chrome-extension://abcdefg/test.jpg"); 3025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3027868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3029868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3030868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that redirect to chrome-extension subresource does not cancel the 3038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 3039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 3040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceRedirectExtensionScheme) { 3041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = test_server()->GetURL( 3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateServerRedirect("chrome-extension://abcdefg/test.jpg")); 3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 3049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 3050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 3051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 3052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 3053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 30562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that non-http/https main page redirects cancel the prerender. 30572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelMainFrameRedirectUnsupportedScheme) { 30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL( 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.html")); 30614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 0); 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that media source video loads are deferred on prerendering. 30667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { 30677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_media_source.html", 30687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FINAL_STATUS_USED, 30697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 30707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 30717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3073ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that a prerender that creates an audio stream (via a WebAudioDevice) 3074ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// is cancelled. 3075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// http://crbug.com/261489 3076ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderWebAudioDevice) { 3077ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_web_audio_device.html", 3078ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_CREATING_AUDIO_STREAM, 1); 3079ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3081ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that prerenders do not swap in to WebContents being captured. 3082ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCapturedWebContents) { 3083ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 3084ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_PAGE_BEING_CAPTURED, 1); 3085ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* web_contents = 3086ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch current_browser()->tab_strip_model()->GetActiveWebContents(); 3087ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->IncrementCapturerCount(); 3088ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NavigateToDestURLWithDisposition(CURRENT_TAB, false); 3089ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->DecrementCapturerCount(); 3090ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 3091ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 30924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 30934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a server redirect. 30944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 30954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessServerRedirect) { 30964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Force everything to be a process swap. 30974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SwapProcessesContentBrowserClient test_browser_client; 30984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::ContentBrowserClient* original_browser_client = 30994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(&test_browser_client); 31004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 31024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html"), 31034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 0); 31044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SetBrowserClientForTesting(original_browser_client); 31064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that prerenders are aborted on cross-process navigation from 31094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a client redirect. 31104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 31114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderCrossProcessClientRedirect) { 31124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cross-process navigation logic for renderer-initiated navigations 31134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is partially controlled by the renderer, namely 31144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ChromeContentRendererClient. This test instead relies on the Web 31154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Store triggering such navigations. 31164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string webstore_url = extension_urls::GetWebstoreLaunchURL(); 31174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Mock out requests to the Web Store. 31194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath file(FILE_PATH_LITERAL( 31204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "chrome/test/data/prerender/prerender_page.html")); 31214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::PostTask( 31224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 31234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&CreateMockProtocolHandlerOnIO, 31244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(webstore_url), file)); 31254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL(CreateClientRedirect(webstore_url), 31274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_OPEN_URL, 1); 31284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that canceling a MatchComplete dummy doesn't result in two 31314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// stop events. 31324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelMatchCompleteDummy) { 31334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 31344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 31354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_CANCELLED); 31364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 31374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_final_status_queue, 0); 31384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cancel the MatchComplete dummy. 31404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 31414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 31424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::RunMessageLoop(); 31434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check the referring page only got one copy of the event. 31454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 31464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the 31494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page is visible. 31504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredImage) { 31514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We do NOT wait for a load event, as the image will block the 31524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // load. Instead, wait for the title to change. 31534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_deferred_image.html", 31544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 0, true); 31554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 31564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that a deferred redirect to an image is not loaded until the 31594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// page is visible, even after another redirect. 31604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 31614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredImageAfterRedirect) { 31624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We do NOT wait for a load event, as the image will block the 31634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // load. Instead, wait for the title to change. 31644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 31654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "files/prerender/prerender_deferred_image.html#double_redirect", 31664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 0, true); 31674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 31684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed. 31714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredMainFrame) { 31724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 31734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 31744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "files/prerender/image-deferred.png", 31754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 31764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 31774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in the main frame are followed, even 31804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// with a double-redirect. 31814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 31824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderDeferredMainFrameAfterRedirect) { 31834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DisableJavascriptCalls(); 31844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL( 31854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateServerRedirect("files/prerender/image-deferred.png"), 31864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_USED, 1); 31874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 31884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that deferred redirects in a synchronous XHR abort the 31914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// prerender. 31924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDeferredSynchronousXHR) { 31934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_deferred_sync_xhr.html", 31944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FINAL_STATUS_BAD_DEFERRED_REDIRECT, 0); 31954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NavigateToDestURL(); 31964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 3199