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