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