prerender_browsertest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_contents.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_link_manager_factory.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager_browsertest_util.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/url_request/url_request_job.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsClientHost; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerender tests work as follows: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A page with a prefetch link to the test page is loaded. Once prerendered, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its Javascript function DidPrerenderPass() is called, which returns true if 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page behaves as expected when prerendered. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is then displayed on a tab. The Javascript function 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DidDisplayPass() is called, and returns true if the page behaved as it 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should while being displayed. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constants used in the test HTML files. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kReadyTitle = "READY"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kPassTitle = "PASS"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateClientRedirect(const std::string& dest_url) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kClientRedirectBase = "client-redirect?"; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kClientRedirectBase + dest_url; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreateServerRedirect(const std::string& dest_url) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kServerRedirectBase = "server-redirect?"; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kServerRedirectBase + dest_url; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears the specified data using BrowsingDataRemover. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearBrowsingData(Browser* browser, int remove_mask) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover* remover = 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::CreateForUnboundedRange(browser->profile()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remover->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingDataRemover deletes itself. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CancelAllPrerenders(PrerenderManager* prerender_manager) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->CancelAllPrerenders(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if and only if the final status is one in which the prerendered 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page should prerender correctly. The page still may not be used. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_USED: 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_WINDOW_OPENER: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_APP_TERMINATING: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll crash the renderer after it's loaded. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_RENDERER_CRASHED: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_CANCELLED: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FINAL_STATUS_DEVTOOLS_ATTACHED: 131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case FINAL_STATUS_PAGE_BEING_CAPTURED: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for the destruction of a RenderProcessHost's IPC channel. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to make sure the PrerenderLinkManager's OnChannelClosed function has 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been called, before checking its state. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChannelDestructionWatcher { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher() : channel_destroyed_(false), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_channel_destruction_(false) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ChannelDestructionWatcher() { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WatchChannel(content::RenderProcessHost* host) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host->GetChannel()->AddFilter(new DestructionMessageFilter(this)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForChannelClose() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(waiting_for_channel_destruction_); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel_destroyed_) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_channel_destruction_ = true; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(waiting_for_channel_destruction_); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(channel_destroyed_); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When destroyed, calls ChannelDestructionWatcher::OnChannelDestroyed. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignores all messages. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DestructionMessageFilter : public content::BrowserMessageFilter { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : watcher_(watcher) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DestructionMessageFilter() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ChannelDestructionWatcher::OnChannelDestroyed, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(watcher_))); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* message_was_ok) OVERRIDE { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher* watcher_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DestructionMessageFilter); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnChannelDestroyed() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(channel_destroyed_); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_destroyed_ = true; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_for_channel_destruction_) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_for_channel_destruction_ = false; 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool channel_destroyed_; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_for_channel_destruction_; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderContents that stops the UI message loop on DidStopLoading(). 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestPrerenderContents : public PrerenderContents { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PrerenderContents(prerender_manager, profile, url, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) referrer, origin, PrerenderManager::kNoExperiment), 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_(0), 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads_(expected_number_of_loads), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_(expected_final_status), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_(NULL), 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_(false), 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_(false), 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_shown_(expected_final_status == FINAL_STATUS_USED), 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quit_message_loop_on_destruction_( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status != FINAL_STATUS_APP_TERMINATING && 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status != FINAL_STATUS_MAX), 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pending_prerenders_(0), 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title_( 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_number_of_loads == 0) 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestPrerenderContents() { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_MAX) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(match_complete_status(), MATCH_COMPLETE_REPLACEMENT); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_final_status_, final_status()) << 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " when testing URL " << prerender_url().path() << 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (Expected: " << NameFromFinalStatus(expected_final_status_) << 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", Actual: " << NameFromFinalStatus(final_status()) << ")"; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prerendering RenderViewHosts should be hidden before the first 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation, so this should be happen for every PrerenderContents for 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which a RenderViewHost is created, regardless of whether or not it's 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_render_view_host_) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(was_hidden_); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A used PrerenderContents will only be destroyed when we swap out 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents, at the end of a navigation caused by a call to 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NavigateToURLImpl(). 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (final_status() == FINAL_STATUS_USED) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_render_view_host_); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_be_shown_, was_shown_); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the PrerenderContents is destroyed, quit the UI message loop. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This happens on navigation to used prerendered pages, and soon 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after cancellation of unused prerendered pages. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (quit_message_loop_on_destruction_) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The message loop may not be running if this is swapped in 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronously on a Navigation. 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop* loop = base::MessageLoopForUI::current(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (loop->is_running()) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop->Quit(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On quit, it's possible to end up here when render processes are closed 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the PrerenderManager is destroyed. As a result, it's possible to 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on quit. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's also possible for this to be called after we've been notified of 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // app termination, but before we've been deleted, which is why the second 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check is needed. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_final_status_ == FINAL_STATUS_APP_TERMINATING && 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_status() != expected_final_status_) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_ = FINAL_STATUS_RENDERER_CRASHED; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PrerenderContents::RenderProcessGone(status); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AddAliasURL(const GURL& url) OVERRIDE { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent FINAL_STATUS_UNSUPPORTED_SCHEME when navigating to about:crash in 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the PrerenderRendererCrash test. 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (url.spec() != content::kChromeUICrashURL) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrerenderContents::AddAliasURL(url); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStopLoading(RenderViewHost* render_view_host) OVERRIDE { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::DidStopLoading(render_view_host); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++number_of_loads_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldRenderPrerenderedPageCorrectly(expected_final_status_) && 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_loads_ == expected_number_of_loads_) { 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddPendingPrerender( 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PendingPrerenderInfo> pending_prerender_info) OVERRIDE { 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents::AddPendingPrerender(pending_prerender_info.Pass()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_pending_prerenders_ > 0 && 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_prerender_count() == expected_pending_prerenders_) { 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebContents* CreateWebContents( 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* session_storage_namespace) OVERRIDE { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = PrerenderContents::CreateWebContents( 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_storage_namespace); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ready_title = ASCIIToUTF16(kReadyTitle); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_should_wait_for_ready_title_) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_title_watcher_.reset(new content::TitleWatcher( 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, ready_title)); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForPrerenderToHaveReadyTitleIfRequired() { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ready_title_watcher_.get()) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 ready_title = ASCIIToUTF16(kReadyTitle); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ready_title, ready_title_watcher_->WaitAndGetTitle()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until the prerender has |expected_pending_prerenders| pending 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerenders. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForPendingPrerenders(size_t expected_pending_prerenders) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_prerender_count() < expected_pending_prerenders) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pending_prerenders_ = expected_pending_prerenders; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pending_prerenders_ = 0; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_pending_prerenders, pending_prerender_count()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tests that open the prerender in a new background tab, the RenderView 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will not have been made visible when the PrerenderContents is destroyed 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even though it is used. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_be_shown(bool value) { should_be_shown_ = value; } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_loads() const { return number_of_loads_; } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status() const { return expected_final_status_; } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool quit_message_loop_on_destruction() const { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return quit_message_loop_on_destruction_; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRenderViewHostCreated( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host) OVERRIDE { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to make sure the RenderViewHost is hidden and, if used, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequently shown. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_registrar().Add( 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(new_render_view_host)); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_render_view_host_ = new_render_view_host; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::OnRenderViewHostCreated(new_render_view_host); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_render_view_host_, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<RenderWidgetHost>(source).ptr()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = *content::Details<bool>(details).ptr(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_visible) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_hidden_ = true; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (is_visible && was_hidden_) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once hidden, a prerendered RenderViewHost should only be shown after 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being removed from the PrerenderContents for display. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetRenderViewHost()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) was_shown_ = true; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderContents::Observe(type, source, details); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_loads_; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads_; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status_; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The RenderViewHost created for the prerender, if any. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* new_render_view_host_; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is hidden. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_hidden_; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true when the prerendering RenderWidget is shown, after having been 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hidden. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_shown_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected final value of was_shown_. Defaults to true for 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FINAL_STATUS_USED, and false otherwise. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_shown_; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, quits message loop on destruction of |this|. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool quit_message_loop_on_destruction_; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total number of pending prerenders we're currently waiting for. Zero 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicates we currently aren't waiting for any. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_pending_prerenders_; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, before calling DidPrerenderPass, will wait for the title of the 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerendered page to turn to "READY". 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title_; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::TitleWatcher> ready_title_watcher_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderManager that uses TestPrerenderContents. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitForLoadPrerenderContentsFactory : public PrerenderContents::Factory { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForLoadPrerenderContentsFactory( 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : expected_number_of_loads_(expected_number_of_loads), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue_(expected_final_status_queue), 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title_( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Factory created with queue length " << 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue_.size(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PrerenderContents* CreatePrerenderContents( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::Referrer& referrer, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Origin origin, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 experiment_id) OVERRIDE { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = FINAL_STATUS_MAX; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!expected_final_status_queue_.empty()) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status = expected_final_status_queue_.front(); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue_.pop_front(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Creating prerender contents for " << url.path() << 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " with expected final status " << expected_final_status; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << expected_final_status_queue_.size() << " left in the queue."; 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new TestPrerenderContents(prerender_manager, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, url, referrer, origin, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads_, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title_); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads_; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue_; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title_; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A SafeBrowsingDatabaseManager implementation that returns a fixed result for 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a given URL. 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit FakeSafeBrowsingDatabaseManager(SafeBrowsingService* service) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SafeBrowsingDatabaseManager(service), 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) threat_type_(SB_THREAT_TYPE_SAFE) { } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given url is safe or not. If we 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the url is safe, CheckUrl returns true. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise it returns false, and "client" is called asynchronously with the 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result when it is ready. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true, indicating a SAFE result, unless the URL is the fixed URL 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the user, and the user-specified result is not SAFE 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (in which that result will be communicated back via a call into the 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client, and false will be returned). 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides SafeBrowsingService::CheckBrowseUrl. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckBrowseUrl(const GURL& gurl, Client* client) OVERRIDE { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gurl != url_ || threat_type_ == SB_THREAT_TYPE_SAFE) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone, 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, gurl, client)); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetThreatTypeForUrl(const GURL& url, SBThreatType threat_type) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_ = url; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingDatabaseManager() {} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCheckBrowseURLDone(const GURL& gurl, Client* client) { 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<SBThreatType> expected_threats; 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_MALWARE); 51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats.push_back(SB_THREAT_TYPE_URL_PHISHING); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingDatabaseManager::SafeBrowsingCheck sb_check( 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GURL>(1, gurl), 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBFullHash>(), 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client, 51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) safe_browsing_util::MALWARE, 51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_threats); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_check.url_results[0] = threat_type_; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->OnSafeBrowsingResult(sb_check); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingDatabaseManager); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeSafeBrowsingService : public SafeBrowsingService { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingService() { } 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returned pointer has the same lifespan as the database_manager_ refcounted 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object. 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager() { 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeSafeBrowsingService() { } 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual SafeBrowsingDatabaseManager* CreateDatabaseManager() OVERRIDE { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager_ = new FakeSafeBrowsingDatabaseManager(this); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_database_manager_; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* fake_database_manager_; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates FakeSafeBrowsingService instances. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingServiceFactory() : 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_(NULL) { } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingServiceFactory() { } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_recent_service_ = new FakeSafeBrowsingService(); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service() const { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_recent_service_; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSafeBrowsingService* most_recent_service_; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDevToolsClientHost : public DevToolsClientHost { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost() {} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeDevToolsClientHost() {} 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InspectedContentsClosing() OVERRIDE {} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DispatchOnInspectorFrontend(const std::string& msg) OVERRIDE {} 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReplacedWithAnotherClient() OVERRIDE {} 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestorePrerenderMode { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderManagerMode prev_mode_; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// URLRequestJob (and associated handler) which never starts. 592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NeverStartURLRequestJob : public net::URLRequestJob { 593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NeverStartURLRequestJob(net::URLRequest* request, 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) 596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : net::URLRequestJob(request, network_delegate) { 597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Start() OVERRIDE {} 600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~NeverStartURLRequestJob() {} 603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NeverStartProtocolHandler 606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : public net::URLRequestJobFactory::ProtocolHandler { 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NeverStartProtocolHandler() {} 609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~NeverStartProtocolHandler() {} 610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual net::URLRequestJob* MaybeCreateJob( 612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequest* request, 613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::NetworkDelegate* network_delegate) const OVERRIDE { 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return new NeverStartURLRequestJob(request, network_delegate); 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void CreateNeverStartProtocolHandlerOnIO(const GURL& url) { 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler> never_respond_handler( 621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new NeverStartProtocolHandler()); 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url, never_respond_handler.Pass()); 624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Many of these tests are flaky. See http://crbug.com/249179 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTest : virtual public InProcessBrowserTest { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest() 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : autostart_test_server_(true), 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents_factory_(NULL), 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_factory_(new TestSafeBrowsingServiceFactory()), 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_https_src_server_(false), 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_(true), 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_("files/prerender/prerender_loader.html"), 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_(NULL) {} 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTest() {} 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 649ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return web_contents->GetController().GetDefaultSessionStorageNamespace(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 653c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // TODO(danakj): The GPU Video Decoder needs real GL bindings. 654c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // crbug.com/269087 655c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch UseRealGLBindings(); 656c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 657c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch InProcessBrowserTest::SetUp(); 658c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 659c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kPrerenderMode, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kPrerenderModeSwitchValueEnabled); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugins directory isn't read by default on the Mac, so it needs to be 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // explicitly registered. 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_dir; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_APP, &app_dir); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath( 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kExtraPluginDir, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_dir.Append(FILE_PATH_LITERAL("plugins"))); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetPrefs()->SetBoolean( 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kPromptForDownload, false); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (autostart_test_server_) 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overload for a single expected final status 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL(const std::string& html_file, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(html_file, 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status, 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL(const std::string& html_file, 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue(1, 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(html_file, 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) { 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(html_file); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(url, url, 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& html_file, 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(html_file, expected_final_status_queue, 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, false); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue(1, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(url, url, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURL( 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& destination_url, 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status, 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads) { 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue(1, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURLImpl(prerender_url, destination_url, 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURL() const { 757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, true); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the url in a new tab, with no opener. 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestURLWithDisposition( 762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 764868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToURLImpl(dest_url_, disposition, expect_swap_to_succeed); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClick() const { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("Click()"); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickTarget() const { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("ClickTarget()"); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewWindow() const { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("ShiftClick()"); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewForegroundTab() const { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("MetaShiftClick()"); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("CtrlShiftClick()"); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaClickNewBackgroundTab() const { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents != NULL); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents->set_should_be_shown(false); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("MetaClick()"); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("CtrlClick()"); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLViaWindowOpen() const { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLWithJSImpl("WindowOpen()"); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveLinkElement(int i) const { 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents()-> 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRenderViewHost()->ExecuteJavascriptInWebFrame( 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16(), 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASCIIToUTF16(base::StringPrintf("RemoveLinkElement(%d)", i))); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClickToNextPageAfterPrerender() { 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver new_page_observer( 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_NAV_ENTRY_COMMITTED, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* render_view_host = current_browser()->tab_strip_model()-> 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16("ClickOpenLink()")); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_page_observer.Wait(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToNextPageAfterPrerender() const { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html")); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToDestUrlAndWaitForPassTitle() { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 expected_title = ASCIIToUTF16(kPassTitle); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher( 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContents()->prerender_contents(), 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_title); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after the prerendered page has been navigated to and then away from. 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates back through the history to the prerendered page. 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPrerender() { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver back_nav_observer( 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_NAV_ENTRY_COMMITTED, 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool original_prerender_page = false; 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(IsOriginalPrerenderPage())", 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original_prerender_page)); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(original_prerender_page); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Goes back to the page that was active before the prerender was swapped 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. This must be called when the prerendered page is the current page 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the active tab. 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBackToPageBeforePrerender() { 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab->IsLoading()); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver back_nav_observer( 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>(&tab->GetController())); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(current_browser(), CURRENT_TAB); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) back_nav_observer.Wait(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool js_result; 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab, 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidBackToOriginalPagePass())", 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &js_result)); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(js_result); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURL(const std::string& dest_html_file) const { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url = test_server()->GetURL(dest_html_file); 875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToURLImpl(dest_url, CURRENT_TAB, true); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const std::string& html_file) const { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UrlIsInPrerenderManager(const GURL& url) const { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderManager()->FindPrerenderData( 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, GetSessionStorageNamespace()) != NULL; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_use_https_src(bool use_https_src_server) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_https_src_server_ = use_https_src_server; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableJavascriptCalls() { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_javascript_ = false; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerModel* GetModel() const { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TaskManager::GetInstance()->model(); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* GetPrerenderManager() const { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManagerFactory::GetForProfile(current_browser()->profile()); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_manager; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrerenderLinkManager* GetPrerenderLinkManager() const { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManager* prerender_link_manager = 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderLinkManagerFactory::GetForProfile( 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_link_manager; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStartEventForLinkNumber(int index) const { 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_started; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderStartEvents[%d]))", index); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_started)); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_started; 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderLoadEventForLinkNumber(int index) const { 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_loaded; 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderLoadEvents[%d]))", index); 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_loaded)); 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_loaded; 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidReceivePrerenderStopEventForLinkNumber(int index) const { 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_prerender_stopped; 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string expression = base::StringPrintf( 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "receivedPrerenderStopEvents[%d]))", index); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expression, 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &received_prerender_stopped)); 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return received_prerender_stopped; 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HadPrerenderEventErrors() const { 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool had_prerender_event_errors; 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(content::ExecuteScriptAndExtractBool( 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(Boolean(" 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " hadPrerenderEventErrors))", 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &had_prerender_event_errors)); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return had_prerender_event_errors; 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asserting on this can result in flaky tests. PrerenderHandles are 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // removed from the PrerenderLinkManager when the prerender is canceled from 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the browser, when the prerenders are cancelled from the renderer process, 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or the channel for the renderer process is closed on the IO thread. In the 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last case, the code must be careful to wait for the channel to close, as it 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is done asynchronously after swapping out the old process. See 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ChannelDestructionWatcher. 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEmptyPrerenderLinkManager() const { 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrerenderLinkManager()->IsEmpty(); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns length of |prerender_manager_|'s history, or -1 on failure. 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetHistoryLength() const { 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DictionaryValue> prerender_dict( 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<DictionaryValue*>(GetPrerenderManager()->GetAsValue())); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict.get()) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* history_list; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_dict->GetList("history", &history_list)) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(history_list->GetSize()); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeSafeBrowsingDatabaseManager* GetFakeSafeBrowsingDatabaseManager() { 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return safe_browsing_factory_->most_recent_service()-> 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fake_database_manager(); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContentsFor(const GURL& url) const { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PrerenderData* prerender_data = 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->FindPrerenderData( 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, GetSessionStorageNamespace()); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TestPrerenderContents*>( 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_data ? prerender_data->contents() : NULL); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestPrerenderContents* GetPrerenderContents() const { 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPrerenderContentsFor(dest_url_); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_path(const std::string& path) { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_ = path; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_loader_query_and_fragment(const std::string& query_and_fragment) { 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_and_fragment_ = query_and_fragment; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCrossDomainTestUrl(const std::string& path) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const std::string secondary_domain = "www.foo.com"; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule(secondary_domain, "127.0.0.1"); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_str(base::StringPrintf( 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://%s:%d/%s", 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_domain.c_str(), 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server()->host_port_pair().port(), 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.c_str())); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(url_str); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_browser(Browser* browser) { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicitly_set_browser_ = browser; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* current_browser() const { 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return explicitly_set_browser_ ? explicitly_set_browser_ : browser(); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncreasePrerenderMemory() { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase the memory allowed in a prerendered page above normal settings. 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debug build bots occasionally run against the default limit, and tests 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // were failing because the prerender was canceled due to memory exhaustion. 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/93076 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 1000 * 1024 * 1024; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool autostart_test_server_; 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrerenderTestURLImpl( 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& prerender_url, 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& destination_url, 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::deque<FinalStatus>& expected_final_status_queue, 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_number_of_loads, 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_should_wait_for_ready_title) { 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_url_ = destination_url; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_pair("REPLACE_WITH_DESTINATION_URL", destination_url.spec())); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_path_, 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::SpawnedTestServer* src_server = test_server(); 1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<net::SpawnedTestServer> https_src_server; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_https_src_server_) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_src_server.reset( 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new net::SpawnedTestServer( 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data")))); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_src_server->Start()); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_server = https_src_server.get(); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL loader_url = src_server->GetURL(replacement_path + 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_query_and_fragment_); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager* prerender_manager = GetPrerenderManager(); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_manager); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->mutable_config().rate_limit_enabled = false; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->mutable_config().https_allowed = true; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents_factory_ == NULL); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_ = 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WaitForLoadPrerenderContentsFactory( 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_number_of_loads, 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_should_wait_for_ready_title); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_manager->SetPrerenderContentsFactory( 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents_factory_); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalStatus expected_final_status = expected_final_status_queue.front(); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We construct launch_nav_observer so that we can be certain our loader 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page has finished loading before continuing. This prevents ambiguous 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTIFICATION_LOAD_STOP events from making tests flaky. 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver loader_nav_observer( 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ui_test_utils::NavigateToURL uses its own observer and message loop. 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since the test needs to wait until the prerendered page has stopped 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading, rather than the page directly navigated to, need to 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handle browser navigation directly. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->OpenURL(OpenURLParams( 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that we've run the prerender until it stopped loading, we can now 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also make sure the launcher has finished loading. 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loader_nav_observer.Wait(); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) { 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_javascript_ && expected_number_of_loads > 0) { 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the prerendered page to change title to signal it is ready 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if required. 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_contents->WaitForPrerenderToHaveReadyTitleIfRequired(); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if page behaves as expected while in prerendered state. 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool prerender_test_result = false; 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prerender_contents->GetRenderViewHostMutable(), 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidPrerenderPass())", 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &prerender_test_result)); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_test_result); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the failure case, we should have removed |dest_url_| from the 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerender_manager. We ignore dummy PrerenderContents (as indicated 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by not having started), and PrerenderContents that are expected to 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be left in the manager until the test finishes. 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prerender_contents == NULL || 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !prerender_contents->prerendering_has_started()); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateToURLImpl(const GURL& dest_url, 1142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowOpenDisposition disposition, 1143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool expect_swap_to_succeed) const { 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderManager*>(NULL), GetPrerenderManager()); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure in navigating we have a URL to use in the PrerenderManager. 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), GetPrerenderContents()); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If opening the page in a background tab, it won't be shown when swapped 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in. 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (disposition == NEW_BACKGROUND_TAB) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContents()->set_should_be_shown(false); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::WindowedNotificationObserver> page_load_observer; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* web_contents = NULL; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetPrerenderContents()->prerender_contents()) { 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the case of zero loads, need to wait for the page load to complete 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before running any Javascript. 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents = GetPrerenderContents()->prerender_contents(); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetPrerenderContents()->number_of_loads() == 0) { 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_load_observer.reset( 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new content::WindowedNotificationObserver( 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController()))); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to the prerendered URL, but don't run the message loop. Browser 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // issued navigations to prerendered pages will synchronously swap in the 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerendered page. 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser(), dest_url, disposition, 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (call_javascript_ && web_contents && expect_swap_to_succeed) { 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_load_observer.get()) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_load_observer->Wait(); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents, 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &display_test_result)); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(display_test_result); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the prerendered page using javascript functions in the 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loader page. |javascript_function_name| should be a 0 argument function 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which is invoked. 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDestURLWithJSImpl(const std::string& javascript_function_name) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<PrerenderContents*>(NULL), prerender_contents); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* render_view_host = current_browser()->tab_strip_model()-> 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderViewHost(); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host->ExecuteJavascriptInWebFrame( 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), ASCIIToUTF16(javascript_function_name)); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_contents->quit_message_loop_on_destruction()) { 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Run message loop until the prerender contents is destroyed. 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't expect to pick up a running prerender, so instead 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observe one navigation. 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestNavigationObserver observer( 1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents()); 1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) observer.StartWatchingNewWebContents(); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RunLoop run_loop; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.WaitForObservation( 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&content::RunThisRunLoop, 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&run_loop)), 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::GetQuitTaskForRunLoop(&run_loop)); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestSafeBrowsingServiceFactory> safe_browsing_factory_; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest_url_; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_https_src_server_; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool call_javascript_; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_path_; 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string loader_query_and_fragment_; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* explicitly_set_browser_; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a page is correctly prerendered in the case of a 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <link rel=prerender> tag and then loaded into a tab in response to a 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders launch and receive proper event treatment. 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled due to http://crbug.com/167792 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderPagePending) { 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_pending.html", 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_final_status_queue, 1); 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher first_channel_close_watcher; 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NavigateToDestURL doesn't run a message loop. Normally that's fine, but in 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this case, we need the pending prerenders to start. 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_channel_close_watcher.WaitForChannelClose(); 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL prerender_page_url = 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server()->GetURL("files/prerender/prerender_page.html"); 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(static_cast<TestPrerenderContents*>(NULL), 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContentsFor(prerender_page_url)); 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now navigate to our target page. 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher second_channel_close_watcher; 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser(), prerender_page_url, CURRENT_TAB, 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::BROWSER_TEST_NONE); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_channel_close_watcher.WaitForChannelClose(); 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that pending prerenders which are canceled before they are launched 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// never get started. 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageRemovesPending) { 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_removes_pending.html", 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_USED, 1); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStartEventForLinkNumber(1)); 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky, http://crbug.com/167340. 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F( 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLink) { 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=1"); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No ChannelDestructionWatcher is needed here, since prerenders in the 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrerenderLinkManager should be deleted by removing the links, rather than 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shutting down the renderer process. 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flaky, http://crbug.com/167340. 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderBrowserTest, DISABLED_PrerenderPageRemovingLinkWithTwoLinks) { 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=2"); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(1); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(gavinp): Fails on XP Rel - http://crbug.com/128841 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderPageRemovingLinkWithTwoLinksRemovingOne 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne \ 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageRemovingLinkWithTwoLinksRemovingOne 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest, 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderPageRemovingLinkWithTwoLinksRemovingOne) { 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_removing_links.html"); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_loader_query_and_fragment("?links_to_insert=2"); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 1); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveLinkElement(0); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(1)); 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(1)); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsEmptyPrerenderLinkManager() is not racy because the earlier DidReceive* 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calls did a thread/process hop to the renderer which insured pending 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer events have arrived. 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(IsEmptyPrerenderLinkManager()); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(IsEmptyPrerenderLinkManager()); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering works in incognito mode. 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderIncognito) { 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* normal_profile = current_browser()->profile(); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_browser( 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increase memory expectations on the incognito PrerenderManager. 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncreasePrerenderMemory(); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the visibility API works. 14147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 14157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderVisibility) { 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_visibility.html", 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly if we try to 1423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// swap it in before it commits. 1424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNoCommitNoSwap) { 1425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to a page that triggers a prerender for a URL that never commits. 1426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const GURL kNoCommitUrl("http://never-respond.example.com"); 1427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::PostTask( 1428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 1429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&CreateNeverStartProtocolHandlerOnIO, kNoCommitUrl)); 1430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(kNoCommitUrl, 1431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FINAL_STATUS_CANCELLED, 1432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 0); 1433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigate to the URL, but assume the contents won't be swapped in. 1435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURLWithDisposition(CURRENT_TAB, false); 1436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Confirm that the prerendered version of the URL is not swapped in, 1438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // since it never committed. 1439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(UrlIsInPrerenderManager(kNoCommitUrl)); 1440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Post a task to cancel all the prerenders, so that we don't wait further. 1442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 1443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 1444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::RunMessageLoop(); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the prerendering of a page is canceled correctly when a 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript alert is called. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertAfterOnload) { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_after_onload.html", 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_JAVASCRIPT_ALERT, 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded while a page is being preloaded, but 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded when the page is displayed. 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 1471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin DISABLED_PrerenderDelayLoadPlugin 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderDelayLoadPlugin PrerenderDelayLoadPlugin 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderDelayLoadPlugin) { 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/plugin_delay_load.html", 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins are not loaded on prerendering pages when click-to-play 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is enabled. 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickToPlay) { 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable click-to-play. 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostContentSettingsMap* content_settings_map = 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_browser()->profile()->GetHostContentSettingsMap(); 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings_map->SetDefaultContentSetting( 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_click_to_play.html", 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't load a NaCl plugin when NaCl is disabled. 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderNaClPluginDisabled) { 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_disabled.html", 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run this check again. When we try to load aa ppapi plugin, the 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "loadstart" event is asynchronously posted to a message loop. 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible that earlier call could have been run before the 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the "loadstart" event was posted. 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): While this should reliably fail on regressions, the 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reliability depends on the specifics of ppapi plugin 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading. It would be great if we could avoid that. 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents, 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(DidDisplayPass())", 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &display_test_result)); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(display_test_result); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that plugins in an iframe are not loaded while a page is 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being preloaded, but are loaded when the page is displayed. 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103496 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100514 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(OS_WIN) && defined(ARCH_CPU_X86_64) 1535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(jschuh): Failing plugin tests. crbug.com/244653 1536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin \ 1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED_PrerenderIframeDelayLoadPlugin 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PrerenderIframeDelayLoadPlugin PrerenderIframeDelayLoadPlugin 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PrerenderIframeDelayLoadPlugin) { 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_iframe_plugin_delay_load.html", 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a page that contains a prerender link to a page that contains an 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe with a source that requires http authentication. This should not 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerender successfully. 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttpAuthentication) { 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 15627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectNavigateToFirst) { 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderClientRedirectNavigateToSecond) { 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects work with prerendering. 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 15847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectNavigateToSecondViaClick) { 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/prerender_page.html")); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 2); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender for an https will prevent a prerender from happening. 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects to an https page will cancel prerenders. 16077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectToHttps) { 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect(https_url.spec()), 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 16227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectInIframe) { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect( 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that client-issued redirects within an iframe in a prerendered 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page to an https page will not cancel the prerender, nor will it 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// count as an "alias" for the prerendered page. 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClientRedirectToHttpsInIframe) { 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateClientRedirect(https_url.spec()); 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 2); 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(https_url)); 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the page which issues the redirection, rather 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than the final destination page. 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToFirst) { 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection. 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecond) { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_page.html"); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects work with prerendering. 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This version navigates to the final destination page, rather than the 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page which does the redirection via a mouse click. 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectNavigateToSecondViaClick) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prerender_url = test_server()->GetURL( 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateServerRedirect("files/prerender/prerender_page.html")); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server()->GetURL( 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_page.html"); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 1); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects from an http to an https 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// location will cancel prerendering. 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderServerRedirectToHttps) { 1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect(https_url.spec()), 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page will not count as an "alias" for the prerendered page. 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect( 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/files/prerender/prerender_embedded_content.html"); 1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager( 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html")); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that server-issued redirects within an iframe in a prerendered 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page to an https page will not cancel the prerender, nor will it 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// count as an "alias" for the prerendered page. 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderServerRedirectToHttpsInIframe) { 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, net::SpawnedTestServer::kLocalhost, 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_path = CreateServerRedirect(https_url.spec()); 1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", "/" + redirect_path)); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(https_url)); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through an 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe. This should not prerender successfully. 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadIframe) { 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_iframe.html", 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Javascript changing the window.location. This should not prerender 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successfully 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadLocation) { 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/download-test1.lib"), 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerenders a page that contains an automatic download triggered through a 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// client-issued redirect. This should not prerender successfully. 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderDownloadClientRedirect) { 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_download_refresh.html", 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_DOWNLOAD, 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is set when prerendering. 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrer) { 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer.html", 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer is not set when prerendering and the source page is 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTPS. 17927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 17937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderNoSSLReferrer) { 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_use_https_src(true); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_no_referrer.html", 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that popups on a prerendered page cause cancellation. 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_popup.html", 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CREATE_NEW_WINDOW, 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that registering a protocol handler causes cancellation. 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRegisterProtocolHandler) { 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_register_protocol_handler.html", 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_REGISTER_PROTOCOL_HANDLER, 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that renderers using excessive memory will be terminated. 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderExcessiveMemory) { 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderManager()); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderManager()->mutable_config().max_bytes = 30 * 1024 * 1024; 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_excessive_memory.html", 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks shutdown code while a prerender is active. 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderQuickQuit) { 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test. 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop. 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = "files/prerender/prerender_infinite_a.html"; 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = "files/prerender/prerender_infinite_b.html"; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContents()->WaitForPendingPrerenders(1u); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next url is now in the manager 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(gavinp,sreeram): Fix http://crbug.com/145248 and deflake this test. 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we don't prerender in an infinite loop and multiple links are 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handled correctly. 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_PrerenderInfiniteLoopMultiple) { 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileA = 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_a_multiple.html"; 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileB = 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_b_multiple.html"; 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kHtmlFileC = 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_infinite_c_multiple.html"; 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is conceptually simplest if concurrency is at two, since we 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't have to worry about which of kHtmlFileB or kHtmlFileC gets evicted. 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency = 2; 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderManager()->mutable_config().max_link_concurrency_per_launcher = 2; 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_USED); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPrerenderContents()->WaitForPendingPrerenders(2u); 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next url should be in pending list but not an active entry. 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the PrerenderContents for the next urls are now in the manager 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and not pending. One and only one of the URLs (the last seen) should be the 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active entry. 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_b_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileB); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_b_is_active_prerender && url_c_is_active_prerender); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See crbug.com/131836. 189658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderTaskManager) { 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the task manager. This populates the model. 1898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::OpenTaskManager(current_browser()); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the model of task manager to start. 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskManagerBrowserTestUtil::WaitForWebResourceChange(1); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start with two resources. 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One of the resources that has a WebContents associated with it should have 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the Prerender prefix. 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 prefix = 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, string16()); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 prerender_title; 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_prerender_tabs = 0; 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 191258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TaskManagerModel* model = GetModel(); 191358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The task manager caches values. Force the titles to be fresh. 191458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model->Refresh(); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->ResourceCount(); ++i) { 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetResourceWebContents(i)) { 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_title = model->GetResourceTitle(i); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWith(prerender_title, prefix, true)) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_prerender_tabs; 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_prerender_tabs); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 prerender_page_title = prerender_title.substr(prefix.length()); 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be no tabs with the Prerender prefix. 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 tab_prefix = 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, string16()); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_prerender_tabs = 0; 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_tabs_with_prerender_page_title = 0; 193258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model->Refresh(); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->ResourceCount(); ++i) { 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (model->GetResourceWebContents(i)) { 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 tab_title = model->GetResourceTitle(i); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWith(tab_title, prefix, true)) { 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_prerender_tabs; 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWith(tab_title, tab_prefix, true)); 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The prerender tab should now be a normal tab but the title should be 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same. Depending on timing, there may be more than one of these. 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 tab_page_title = tab_title.substr(tab_prefix.length()); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prerender_page_title.compare(tab_page_title) == 0) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_tabs_with_prerender_page_title; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_prerender_tabs); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may have deleted the prerender tab, but the swapped in tab should be 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // active. 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(num_tabs_with_prerender_page_title, 1); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(num_tabs_with_prerender_page_title, 2); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering. 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Times out under AddressSanitizer, see http://crbug.com/108402 19597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderHTML5Audio) { 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio.html", 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if autoplay is set. 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Periodically fails on chrome-os. See http://crbug.com/145263 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5AudioAutoplay) { 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_autoplay.html", 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that audio loads are deferred on prerendering and played back when 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the prerender is swapped in if js starts playing. 19797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5AudioJsplay) { 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_audio_jsplay.html", 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video loads are deferred on prerendering. 19887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderHTML5Video) { 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video.html", 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that video tags inserted by javascript are deferred and played 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly on swap in. 19977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 19987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5VideoJs) { 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_script.html", 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks for correct network events by using a busy sleep the javascript. 20067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderHTML5VideoNetwork) { 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_network.html", 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that scripts can retrieve the correct window size while prerendering. 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): Widget hierarchy split causes this to fail http://crbug.com/82363 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderWindowSize) { 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowSize) { 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_size.html", 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flakily times out: http://crbug.com/171546 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerenderers will terminate when the RenderView crashes. 20307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderRendererCrash) { 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_RENDERER_CRASHED, 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to about:crash and then wait for the renderer to crash. 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GetPrerenderContents()->prerender_contents()); 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPrerenderContents()->prerender_contents()->GetController(). 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURL( 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(content::kChromeUICrashURL), 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Referrer(), 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageWithFragment) { 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html#fragment", 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when navigating to a 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fragment. 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED: http://crbug.com/84154 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderPageNavigateFragment) { 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html", 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/no_prerender_page.html#fragment"); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when we prerender a fragment 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to the main page. 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/83901 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderFragmentNavigatePage) { 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#fragment", 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/no_prerender_page.html"); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when we prerender a fragment 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but navigate to a different fragment on the same page. 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED: http://crbug.com/84154 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderFragmentNavigateFragment) { 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/no_prerender_page.html#other_fragment", 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/no_prerender_page.html#fragment"); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses a client 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh from a fragment on the same page. 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/83901 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderClientRedirectFromFragment) { 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html#fragment"), 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/no_prerender_page.html"); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses a client 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect to refresh to a fragment on the same page. 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED: http://crbug.com/84154 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderClientRedirectToFragment) { 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL( 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateClientRedirect("files/prerender/no_prerender_page.html"), 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/no_prerender_page.html#fragment"); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we correctly use a prerendered page when the page uses JS to set 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the window.location.hash to a fragment on the same page. 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderPageChangeFragmentLocationHash) { 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a PNG works correctly. 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.png", FINAL_STATUS_USED, 1); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that prerendering a JPG works correctly. 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/image.jpeg", FINAL_STATUS_USED, 1); 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a prerender of a CRX will result in a cancellation due to 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// download. 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 1); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr GET requests allow prerenders. 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrGet) { 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_get.html", 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr HEAD requests allow prerenders. 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrHead) { 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_head.html", 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr OPTIONS requests allow prerenders. 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrOptions) { 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_options.html", 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr TRACE requests allow prerenders. 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrTrace) { 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_trace.html", 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr POST requests allow prerenders. 21827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderXhrPost) { 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_post.html", 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr PUT cancels prerenders. 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrPut) { 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_put.html", 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that xhr DELETE cancels prerenders. 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) { 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_xhr_delete.html", 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_INVALID_HTTP_METHOD, 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would trigger an SSL error is canceled. 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) { 2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 2208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_ERROR, 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from a subresource does not cancel 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { 2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL error that comes from an iframe does not cancel 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page. Non-main-frame requests are simply cancelled if they run into 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an SSL problem. 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) { 2246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.server_certificate = 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; 2249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that we cancel correctly when window.print() is called. 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_print.html", 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WINDOW_PRINT, 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened in a new window by javascript and both the 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pages are in the same domain, the prerendered page is not used. 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerWindowOpen) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaWindowOpen(); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that if a page is opened due to click on a href with target="_blank" 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and both pages are in the same domain the prerendered page is not used. 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSameDomainWindowOpenerClickTarget) { 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickTarget(); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a top-level page which would normally request an SSL client 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// certificate will never be seen since it's an https top-level resource. 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertTopLevel) { 2297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 2299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 1); 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from a 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subresource will cancel the prerendered page. 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSSLClientCertSubresource) { 2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL("files/prerender/image.jpeg"); 2318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that an SSL Client Certificate request that originates from an 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iframe will cancel the prerendered page. 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertIframe) { 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::SSLOptions ssl_options; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, ssl_options, 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_server.Start()); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL https_url = https_server.GetURL( 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", https_url.spec())); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages with a safe browsing 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial. 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingTopLevel) { 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 1); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that server redirects to a malware page will cancel prerenders. 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingServerRedirect) { 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that client redirects to a malware page will cancel prerenders. 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderSafeBrowsingClientRedirect) { 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL("files/prerender/prerender_page.html"); 23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, SB_THREAT_TYPE_URL_MALWARE); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware subresource. 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL image_url = test_server()->GetURL("files/prerender/image.jpeg"); 23912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_url, SB_THREAT_TYPE_URL_MALWARE); 2393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_image.html", 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that we do not prerender pages which have a malware iframe. 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingIframe) { 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL iframe_url = test_server()->GetURL( 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_embedded_content.html"); 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iframe_url, SB_THREAT_TYPE_URL_MALWARE); 2412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text.push_back( 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::make_pair("REPLACE_WITH_URL", iframe_url.spec())); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string replacement_path; 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/prerender/prerender_with_iframe.html", 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacement_text, 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &replacement_path)); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(replacement_path, 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_SAFE_BROWSING, 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage read will not cause prerender to fail. 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageRead) { 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_read.html", 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that a local storage write will not cause prerender to fail. 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderLocalStorageWrite) { 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_localstorage_write.html", 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the favicon is properly loaded on prerender. 24447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 24457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderFavicon) { 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_favicon.html", 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestPrerenderContents* prerender_contents = GetPrerenderContents(); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(prerender_contents != NULL); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver favicon_update_watcher( 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_FAVICON_UPDATED, 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<WebContents>(prerender_contents->prerender_contents())); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_update_watcher.Wait(); 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when a prerendered page is swapped in to a referring page, the 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unload handlers on the referring page are executed. 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails about 50% on CrOS, 5-10% on linux, win, mac. http://crbug.com/128986 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderUnload) { 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_unload.html"); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 expected_title = ASCIIToUTF16("Unloaded"); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TitleWatcher title_watcher( 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(), 24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_title); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the history is cleared, prerendering is cancelled and 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is cleared. 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to clear the history, and run the message loop until it 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroys the prerender. 248190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_HISTORY)); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was cleared. 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetHistoryLength()); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that when the cache is cleared, prerenders are cancelled but 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prerendering history is not cleared. 2493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Flaky/times out on linux_aura, win, mac - http://crbug.com/270948 2494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderClearCache) { 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CACHE_OR_HISTORY_CLEARED, 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to clear the cache, and run the message loop until it 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroys the prerender. 250190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ClearBrowsingData, current_browser(), 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowsingDataRemover::REMOVE_CACHE)); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure prerender history was not cleared. Not a vital behavior, but 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used to compare with PrerenderClearHistory test. 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetHistoryLength()); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCancelAll) { 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_CANCELLED, 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a task to cancel all the prerenders. 251690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetPrerenderContents() == NULL); 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEvents) { 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CANCELLED, 1); 25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderLoadEventForLinkNumber(0)); 25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunMessageLoop(); 25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancels the prerender of a page with its own prerender. The second prerender 25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should never be started. 25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelPrerenderWithPrerender) { 25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_infinite_a.html", 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_CANCELLED, 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Post a task to cancel all the prerenders. 254690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&CancelAllPrerenders, GetPrerenderManager())); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetPrerenderContents() == NULL); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PrerenderBrowserTest.PrerenderEventsNoLoad may pass flakily on regression, 25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so please be aggressive about filing bugs when this test is failing. 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderEventsNoLoad) { 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should be canceled. 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_http_auth_container.html", 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FINAL_STATUS_AUTH_NEEDED, 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(DidReceivePrerenderStartEventForLinkNumber(0)); 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderLoadEventForLinkNumber(0)); 25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(DidReceivePrerenderStopEventForLinkNumber(0)); 25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(HadPrerenderEventErrors()); 25632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prerendering and history tests. 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prerendered page is navigated to in several ways [navigate via 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omnibox, click on link, key-modified click to open in background tab, etc], 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// followed by a navigation to another page from the prerendered page, followed 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a back navigation. 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderNavigateClickGoBack) { 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled due to timeouts on commit queue. 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/121130 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderNavigateNavigateGoBack) { 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 25947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClickClickGoBack) { 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClickToNextPageAfterPrerender(); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled due to timeouts on commit queue. 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/121130 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_PrerenderClickNavigateGoBack) { 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClick(); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToNextPageAfterPrerender(); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPrerender(); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewWindow(); 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewForegroundTab(); 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderClickNewBackgroundTab) { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page_with_link.html", 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_APP_TERMINATING, 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDestURLViaClickNewBackgroundTab(); 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToPrerenderedPageWhenDevToolsAttached) { 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableJavascriptCalls(); 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_browser()->tab_strip_model()->GetActiveWebContents(); 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetOrCreateFor( 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost())); 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager* manager = DevToolsManager::GetInstance(); 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDevToolsClientHost client_host; 2646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manager->RegisterDevToolsClientHostFor(agent.get(), &client_host); 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* url = "files/prerender/prerender_page.html"; 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1); 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToURL(url); 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->ClientHostClosing(&client_host); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that the sessionStorage namespace remains the same when swapping 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a prerendered page. 26557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 26567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderSessionStorage) { 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_session_storage.html"); 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL(GetCrossDomainTestUrl("files/prerender/prerender_page.html"), 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBackToPageBeforePrerender(); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/142535 - Times out on Chrome Mac release builder 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ControlGroup DISABLED_ControlGroup 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ControlGroup ControlGroup 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the control group works. A JS alert cannot be detected in the 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control group. 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_ControlGroup) { 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestorePrerenderMode restore_prerender_mode; 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::SetMode( 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_WOULD_HAVE_BEEN_USED, 0); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that the MatchComplete dummy works in the normal case. Once 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a prerender is cancelled because of a script, a dummy must be created to 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account for the MatchComplete case, and it must have a final status of 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FINAL_STATUS_WOULD_HAVE_BEEN_USED. 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/142912 - Times out on Chrome Mac release builder 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_MatchCompleteDummy DISABLED_MatchCompleteDummy 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_MatchCompleteDummy MatchCompleteDummy 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_MatchCompleteDummy) { 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FinalStatus> expected_final_status_queue; 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_final_status_queue, 1); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithNaCl : public PrerenderBrowserTest { 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTestWithNaCl() {} 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PrerenderBrowserTestWithNaCl() {} 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableNaCl); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that NaCl plugins work when enabled, with prerendering. 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl, 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderNaClPluginEnabled) { 2715ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 2716ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 2717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 2718ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 2719ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 2720ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_plugin_nacl_enabled.html", 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid any chance of a race, we have to let the script send its response 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_test_result = false; 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "DidDisplayReallyPass()", 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &display_test_result)); 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(display_test_result); 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering. 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReferrerPolicy) { 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that the referrer policy is used when prerendering on HTTPS. 27477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 27487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderSSLReferrerPolicy) { 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_use_https_src(true); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_loader_path("files/prerender/prerender_loader_with_referrer_policy.html"); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_referrer_policy.html", 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FINAL_STATUS_USED, 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1); 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interaction of the webNavigation and tabs API with prerender. 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderBrowserTestWithExtensions : public PrerenderBrowserTest, 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionApiTest { 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2761c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 2762c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch PrerenderBrowserTest::SetUp(); 2763c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 2764c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpCommandLine(command_line); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpInProcessBrowserTestFixture(); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::TearDownInProcessBrowserTestFixture(); 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::TearDownInProcessBrowserTestFixture(); 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderBrowserTest::SetUpOnMainThread(); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/177163 2786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, 27877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_WebNavigation) { 2788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 2792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch extensions::switches::kAllowLegacyExtensionManifests); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the extension to set itself up and return control to us. 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunExtensionSubtest("webnavigation", "test_prerender.html")) << message_; 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 281290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails often on Windows dbg bots. http://crbug.com/177163 281390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN) 281490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_TabsApi DISABLED_TabsApi 281590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else 281690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_TabsApi TabsApi 281790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // defined(OS_WIN) 281890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithExtensions, MAYBE_TabsApi) { 2819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::FrameNavigationState::set_allow_extension_scheme(true); 28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait for the extension to set itself up and return control to us. 28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(RunExtensionSubtest("tabs/on_replaced", "on_replaced.html")) 28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << message_; 28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelDestructionWatcher channel_close_watcher; 28312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_close_watcher.WatchChannel(browser()->tab_strip_model()-> 28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetActiveWebContents()->GetRenderProcessHost()); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigateToDestURL(); 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_close_watcher.WaitForChannelClose(); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the 2841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISABLED_PrerenderCancelSubresourceUnsupportedScheme) { 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = GURL("invalidscheme://www.google.com/test.jpg"); 2845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 28472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 2849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 1); 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Ensure that about:blank is permitted for any subresource. 2858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderAllowAboutBlankSubresource) { 2860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GURL image_url = GURL("about:blank"); 2861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 2862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text.push_back( 2863a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 2864a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string replacement_path; 2865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 2866a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "files/prerender/prerender_with_image.html", 2867a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) replacement_text, 2868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &replacement_path)); 2869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 2870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NavigateToDestURL(); 2871a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2872a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that non-http/https/chrome-extension subresource cancels the prerender 2874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// on redirect. 28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelSubresourceRedirectUnsupportedScheme) { 28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL image_url = test_server()->GetURL( 28782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.jpg")); 2879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text.push_back( 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string replacement_path; 2883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "files/prerender/prerender_with_image.html", 28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replacement_text, 28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &replacement_path)); 28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_UNSUPPORTED_SCHEME, 1); 28882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 28892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2891868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that chrome-extension subresource does not cancel the prerender. 2892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceExtensionScheme) { 2894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = GURL("chrome-extension://abcdefg/test.jpg"); 2895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 2896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 2897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 2898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 2899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 2900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 2901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 2902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 2903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 2904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 2905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Checks that redirect to chrome-extension subresource does not cancel the 2908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// prerender. 2909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 2910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderKeepSubresourceRedirectExtensionScheme) { 2911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GURL image_url = test_server()->GetURL( 2912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CreateServerRedirect("chrome-extension://abcdefg/test.jpg")); 2913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<net::SpawnedTestServer::StringPair> replacement_text; 2914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text.push_back( 2915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); 2916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string replacement_path; 2917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(net::SpawnedTestServer::GetFilePathWithReplacements( 2918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "files/prerender/prerender_with_image.html", 2919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) replacement_text, 2920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &replacement_path)); 2921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); 2922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NavigateToDestURL(); 2923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Checks that non-http/https main page redirects cancel the prerender. 29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderCancelMainFrameRedirectUnsupportedScheme) { 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL( 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateServerRedirect("invalidscheme://www.google.com/test.html")); 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderTestURL(url, FINAL_STATUS_UNSUPPORTED_SCHEME, 1); 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToDestURL(); 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that media source video loads are deferred on prerendering. 29367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { 29377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrerenderTestURL("files/prerender/prerender_html5_video_media_source.html", 29387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FINAL_STATUS_USED, 29397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 29407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NavigateToDestUrlAndWaitForPassTitle(); 29417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 29427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2943ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that a prerender that creates an audio stream (via a WebAudioDevice) 2944ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// is cancelled. 2945ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// http://crbug.com/261489 2946ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderWebAudioDevice) { 2947ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_web_audio_device.html", 2948ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_CREATING_AUDIO_STREAM, 1); 2949ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2950ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2951ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Checks that prerenders do not swap in to WebContents being captured. 2952ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCapturedWebContents) { 2953ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PrerenderTestURL("files/prerender/prerender_page.html", 2954ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FINAL_STATUS_PAGE_BEING_CAPTURED, 1); 2955ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* web_contents = 2956ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch current_browser()->tab_strip_model()->GetActiveWebContents(); 2957ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->IncrementCapturerCount(); 2958ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NavigateToDestURLWithDisposition(CURRENT_TAB, false); 2959ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_contents->DecrementCapturerCount(); 2960ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 2961ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 2963