172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be 321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file. 421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prerender/prerender_contents.h" 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/process_util.h" 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/task.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/background_contents_service.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/browser_process.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/prerender/prerender_final_status.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prerender/prerender_manager.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/renderer_preferences_util.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/login/login_prompt.h" 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/extensions/extension_constants.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/icon_messages.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/render_messages.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_messages.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/url_constants.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/view_types.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browsing_instance.h" 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/resource_request_details.h" 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/site_instance.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h" 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_MACOSX) 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/mach_broker_mac.h" 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace prerender { 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid AddChildRoutePair(ResourceDispatcherHost* rdh, 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int child_id, int route_id) { 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen rdh->AddPrerenderChildRoutePair(child_id, route_id); 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid RemoveChildRoutePair(ResourceDispatcherHost* rdh, 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int child_id, int route_id) { 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen rdh->RemovePrerenderChildRoutePair(child_id, route_id); 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass PrerenderContentsFactoryImpl : public PrerenderContents::Factory { 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual PrerenderContents* CreatePrerenderContents( 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrerenderManager* prerender_manager, Profile* profile, const GURL& url, 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<GURL>& alias_urls, const GURL& referrer) { 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return new PrerenderContents(prerender_manager, profile, url, alias_urls, 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen referrer); 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrerenderContents::PrerenderContents(PrerenderManager* prerender_manager, 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Profile* profile, 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& url, 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<GURL>& alias_urls, 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& referrer) 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen : prerender_manager_(prerender_manager), 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen render_view_host_(NULL), 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prerender_url_(url), 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen referrer_(referrer), 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile_(profile), 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen page_id_(0), 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen has_stopped_loading_(false), 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen final_status_(FINAL_STATUS_MAX), 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prerendering_has_started_(false) { 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DCHECK(prerender_manager != NULL); 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!AddAliasURL(prerender_url_)) 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOG(DFATAL) << "PrerenderContents given invalid URL " << prerender_url_; 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (std::vector<GURL>::const_iterator it = alias_urls.begin(); 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen it != alias_urls.end(); 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ++it) { 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!AddAliasURL(*it)) 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOG(DFATAL) << "PrerenderContents given invalid URL " << prerender_url_; 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// static 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrerenderContents::Factory* PrerenderContents::CreateFactory() { 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new PrerenderContentsFactoryImpl(); 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::StartPrerendering() { 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DCHECK(profile_ != NULL); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!prerendering_has_started_); 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen prerendering_has_started_ = true; 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SiteInstance* site_instance = SiteInstance::CreateSiteInstance(profile_); 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen render_view_host_ = new RenderViewHost(site_instance, this, MSG_ROUTING_NONE, 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NULL); 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int process_id = render_view_host_->process()->id(); 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int view_id = render_view_host_->routing_id(); 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::pair<int, int> process_view_pair = std::make_pair(process_id, view_id); 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::current()->Notify( 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::PRERENDER_CONTENTS_STARTED, 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<std::pair<int, int> >(&process_view_pair), 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::NoDetails()); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create the RenderView, so it can receive messages. 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->CreateRenderView(string16()); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Hide the RVH, so that we will run at a lower CPU priority. 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Once the RVH is being swapped into a tab, we will Restore it again. 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen render_view_host_->WasHidden(); 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Register this with the ResourceDispatcherHost as a prerender 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // RenderViewHost. This must be done before the Navigate message to catch all 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // resource requests, but as it is on the same thread as the Navigate message 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // (IO) there is no race condition. 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ResourceDispatcherHost* rdh = g_browser_process->resource_dispatcher_host(); 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NewRunnableFunction(&AddChildRoutePair, rdh, 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen process_id, view_id)); 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Close ourselves when the application is shutting down. 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen registrar_.Add(this, NotificationType::APP_TERMINATING, 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationService::AllSources()); 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Register for our parent profile to shutdown, so we can shut ourselves down 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // as well (should only be called for OTR profiles, as we should receive 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // APP_TERMINATING before non-OTR profiles are destroyed). 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // TODO(tburkard): figure out if this is needed. 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen registrar_.Add(this, NotificationType::PROFILE_DESTROYED, 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Source<Profile>(profile_)); 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Register to cancel if Authentication is required. 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen registrar_.Add(this, NotificationType::AUTH_NEEDED, 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationService::AllSources()); 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen registrar_.Add(this, NotificationType::AUTH_CANCELLED, 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationService::AllSources()); 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Register all responses to see if we should cancel. 142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen registrar_.Add(this, NotificationType::DOWNLOAD_INITIATED, 143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationService::AllSources()); 144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Register for redirect notifications sourced from |this|. 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registrar_.Add(this, NotificationType::RESOURCE_RECEIVED_REDIRECT, 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<RenderViewHostDelegate>(this)); 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(load_start_time_.is_null()); 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen load_start_time_ = base::TimeTicks::Now(); 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ViewMsg_Navigate_Params params; 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.page_id = -1; 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.pending_history_list_offset = -1; 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.current_history_list_offset = -1; 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.current_history_list_length = 0; 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.url = prerender_url_; 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.transition = PageTransition::LINK; 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.navigation_type = ViewMsg_Navigate_Type::PRERENDER; 160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.referrer = referrer_; 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_host_->Navigate(params); 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool PrerenderContents::GetChildId(int* child_id) const { 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(child_id); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (render_view_host_) { 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *child_id = render_view_host_->process()->id(); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool PrerenderContents::GetRouteId(int* route_id) const { 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(route_id); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (render_view_host_) { 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *route_id = render_view_host_->routing_id(); 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrerenderContents::set_final_status(FinalStatus final_status) { 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX); 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK_EQ(FINAL_STATUS_MAX, final_status_); 186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen final_status_ = final_status; 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 190dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenFinalStatus PrerenderContents::final_status() const { 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return final_status_; 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenPrerenderContents::~PrerenderContents() { 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(final_status_ != FINAL_STATUS_MAX); 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If we haven't even started prerendering, we were just in the control 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // group, which means we do not want to record the status. 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (prerendering_has_started()) 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RecordFinalStatus(final_status_); 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!render_view_host_) // Will be null for unit tests. 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int process_id = render_view_host_->process()->id(); 206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int view_id = render_view_host_->routing_id(); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::pair<int, int> process_view_pair = std::make_pair(process_id, view_id); 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::current()->Notify( 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::PRERENDER_CONTENTS_DESTROYED, 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<std::pair<int, int> >(&process_view_pair), 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::NoDetails()); 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ResourceDispatcherHost* rdh = g_browser_process->resource_dispatcher_host(); 214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NewRunnableFunction(&RemoveChildRoutePair, rdh, 216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen process_id, view_id)); 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen render_view_host_->Shutdown(); // deletes render_view_host 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenRenderViewHostDelegate::View* PrerenderContents::GetViewDelegate() { 22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return this; 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst GURL& PrerenderContents::GetURL() const { 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return url_; 22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenViewType::Type PrerenderContents::GetRenderViewType() const { 22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return ViewType::BACKGROUND_CONTENTS; 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenint PrerenderContents::GetBrowserWindowID() const { 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return extension_misc::kUnknownWindowId; 23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::DidNavigate( 23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen RenderViewHost* render_view_host, 23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const ViewHostMsg_FrameNavigate_Params& params) { 23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // We only care when the outer frame changes. 24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!PageTransition::IsMainFrame(params.transition)) 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Store the navigation params. 24421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ViewHostMsg_FrameNavigate_Params* p = new ViewHostMsg_FrameNavigate_Params(); 24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *p = params; 24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen navigate_params_.reset(p); 24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!AddAliasURL(params.url)) { 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(FINAL_STATUS_HTTPS); 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen url_ = params.url; 25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::UpdateTitle(RenderViewHost* render_view_host, 25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int32 page_id, 25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::wstring& title) { 25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (title.empty()) { 26021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen title_ = WideToUTF16Hack(title); 26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen page_id_ = page_id; 26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::RunJavaScriptMessage( 26821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::wstring& message, 26921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::wstring& default_prompt, 27021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const GURL& frame_url, 27121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const int flags, 27221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC::Message* reply_msg, 27321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool* did_suppress_message) { 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Always suppress JavaScript messages if they're triggered by a page being 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // prerendered. 27621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *did_suppress_message = true; 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We still want to show the user the message when they navigate to this 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // page, so cancel this prerender. 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Destroy(FINAL_STATUS_JAVASCRIPT_ALERT); 28021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 28121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 28221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool PrerenderContents::PreHandleKeyboardEvent( 28321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NativeWebKeyboardEvent& event, 28421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool* is_keyboard_shortcut) { 28521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 28621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 28721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 28821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::Observe(NotificationType type, 28921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NotificationSource& source, 29021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NotificationDetails& details) { 29121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen switch (type.value) { 29221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen case NotificationType::PROFILE_DESTROYED: 29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Destroy(FINAL_STATUS_PROFILE_DESTROYED); 29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case NotificationType::APP_TERMINATING: 29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Destroy(FINAL_STATUS_APP_TERMINATING); 29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case NotificationType::AUTH_NEEDED: 30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case NotificationType::AUTH_CANCELLED: { 30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Prerendered pages have a NULL controller and the login handler should 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // be referencing us as the render view host delegate. 30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NavigationController* controller = 30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<NavigationController>(source).ptr(); 30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoginNotificationDetails* details_ptr = 30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Details<LoginNotificationDetails>(details).ptr(); 30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen LoginHandler* handler = details_ptr->handler(); 30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(handler != NULL); 31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderViewHostDelegate* delegate = handler->GetRenderViewHostDelegate(); 311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (controller == NULL && delegate == this) { 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Destroy(FINAL_STATUS_AUTH_NEEDED); 313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen break; 316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen case NotificationType::DOWNLOAD_INITIATED: { 319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // If the download is started from a RenderViewHost that we are 320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // delegating, kill the prerender. This cancels any pending requests 321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // though the download never actually started thanks to the 322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // DownloadRequestLimiter. 323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(NotificationService::NoDetails() == details); 324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RenderViewHost* rvh = Source<RenderViewHost>(source).ptr(); 325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CHECK(rvh != NULL); 326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (rvh->delegate() == this) { 327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(FINAL_STATUS_DOWNLOAD); 328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 33021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen break; 33121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen case NotificationType::RESOURCE_RECEIVED_REDIRECT: { 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // RESOURCE_RECEIVED_REDIRECT can come for any resource on a page. 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If it's a redirect on the top-level resource, the name needs 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to be remembered for future matching, and if it redirects to 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // an https resource, it needs to be canceled. If a subresource 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // is redirected, nothing changes. 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(Source<RenderViewHostDelegate>(source).ptr() == this); 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceRedirectDetails* resource_redirect_details = 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Details<ResourceRedirectDetails>(details).ptr(); 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(resource_redirect_details); 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (resource_redirect_details->resource_type() == 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceType::MAIN_FRAME) { 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAliasURL(resource_redirect_details->new_url())) 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Destroy(FINAL_STATUS_HTTPS); 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen break; 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 35121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen default: 35221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTREACHED() << "Unexpected notification sent."; 35321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen break; 35421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 35521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 35621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 35721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::OnMessageBoxClosed(IPC::Message* reply_msg, 35821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool success, 35921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::wstring& prompt) { 36021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen render_view_host_->JavaScriptMessageBoxClosed(reply_msg, success, prompt); 36121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 36321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsengfx::NativeWindow PrerenderContents::GetMessageBoxRootWindow() { 36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTIMPLEMENTED(); 36521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return NULL; 36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 36721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTabContents* PrerenderContents::AsTabContents() { 36921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return NULL; 37021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 37121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 37221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenExtensionHost* PrerenderContents::AsExtensionHost() { 37321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return NULL; 37421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 37521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 37621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::UpdateInspectorSetting(const std::string& key, 37721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::string& value) { 37821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen RenderViewHostDelegateHelper::UpdateInspectorSetting(profile_, key, value); 37921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 38021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::ClearInspectorSettings() { 38221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen RenderViewHostDelegateHelper::ClearInspectorSettings(profile_); 38321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 38421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 38521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::Close(RenderViewHost* render_view_host) { 38672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Destroy(FINAL_STATUS_CLOSED); 38721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 38821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 38921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenRendererPreferences PrerenderContents::GetRendererPrefs( 39021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Profile* profile) const { 39121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen RendererPreferences preferences; 39221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen renderer_preferences_util::UpdateFromSystemSettings(&preferences, profile); 39321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return preferences; 39421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 39521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 39621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenWebPreferences PrerenderContents::GetWebkitPrefs() { 39721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return RenderViewHostDelegateHelper::GetWebkitPrefs(profile_, 398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen false); // is_web_ui 39921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 40021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 40121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::CreateNewWindow( 40221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int route_id, 40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const ViewHostMsg_CreateWindow_Params& params) { 40421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Since we don't want to permit child windows that would have a 40521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // window.opener property, terminate prerendering. 40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Destroy(FINAL_STATUS_CREATE_NEW_WINDOW); 40721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 40821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 40921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::CreateNewWidget(int route_id, 41021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebPopupType popup_type) { 41121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTREACHED(); 41221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 41321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrerenderContents::CreateNewFullscreenWidget(int route_id) { 41521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTREACHED(); 41621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 41721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 41821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::ShowCreatedWindow(int route_id, 41921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WindowOpenDisposition disposition, 42021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const gfx::Rect& initial_pos, 42121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool user_gesture) { 42221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // TODO(tburkard): need to figure out what the correct behavior here is 42321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTIMPLEMENTED(); 42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 42521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 42621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::ShowCreatedWidget(int route_id, 42721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const gfx::Rect& initial_pos) { 42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTIMPLEMENTED(); 42921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 43021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 43121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid PrerenderContents::ShowCreatedFullscreenWidget(int route_id) { 43221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTIMPLEMENTED(); 43321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool PrerenderContents::OnMessageReceived(const IPC::Message& message) { 43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool handled = true; 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool message_is_ok = true; 43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_BEGIN_MESSAGE_MAP_EX(PrerenderContents, message, message_is_ok) 43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_DidStartProvisionalLoadForFrame, 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OnDidStartProvisionalLoadForFrame) 441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(IconHostMsg_UpdateFaviconURL, OnUpdateFaviconURL) 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(ViewHostMsg_MaybeCancelPrerenderForHTML5Media, 443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen OnMaybeCancelPrerenderForHTML5Media) 44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_MESSAGE_UNHANDLED(handled = false) 44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IPC_END_MESSAGE_MAP_EX() 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return handled; 44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrerenderContents::OnDidStartProvisionalLoadForFrame(int64 frame_id, 45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool is_main_frame, 45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const GURL& url) { 453dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (is_main_frame) { 454dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!AddAliasURL(url)) { 455dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(FINAL_STATUS_HTTPS); 456dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Usually, this event fires if the user clicks or enters a new URL. 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Neither of these can happen in the case of an invisible prerender. 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // So the cause is: Some JavaScript caused a new URL to be loaded. In that 462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // case, the spinner would start again in the browser, so we must reset 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // has_stopped_loading_ so that the spinner won't be stopped. 464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_stopped_loading_ = false; 465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PrerenderContents::OnUpdateFaviconURL( 469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int32 page_id, 470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<FaviconURL>& urls) { 471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(INFO) << "PrerenderContents::OnUpdateFaviconURL" << icon_url_; 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<FaviconURL>::const_iterator i = urls.begin(); 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen i != urls.end(); ++i) { 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (i->icon_type == FaviconURL::FAVICON) { 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_url_ = i->icon_url; 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(INFO) << icon_url_; 477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 48172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid PrerenderContents::OnMaybeCancelPrerenderForHTML5Media() { 483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Destroy(FINAL_STATUS_HTML5_MEDIA); 48472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 486dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool PrerenderContents::AddAliasURL(const GURL& url) { 487dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!url.SchemeIs("http")) 488dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen alias_urls_.push_back(url); 490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool PrerenderContents::MatchesURL(const GURL& url) const { 49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return std::find(alias_urls_.begin(), alias_urls_.end(), url) 49572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen != alias_urls_.end(); 49672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 49772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 49872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrerenderContents::DidStopLoading() { 49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen has_stopped_loading_ = true; 50072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 50172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrerenderContents::Destroy(FinalStatus final_status) { 50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen prerender_manager_->RemoveEntry(this); 50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen set_final_status(final_status); 50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delete this; 50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 508dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrerenderContents::OnJSOutOfMemory() { 509dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(FINAL_STATUS_JS_OUT_OF_MEMORY); 510dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 511dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 512dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrerenderContents::RendererUnresponsive(RenderViewHost* render_view_host, 513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_during_unload) { 514dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(FINAL_STATUS_RENDERER_UNRESPONSIVE); 515dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 516dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 517dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbase::ProcessMetrics* PrerenderContents::MaybeGetProcessMetrics() { 519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (process_metrics_.get() == NULL) { 520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If a PrenderContents hasn't started prerending, don't be fully formed. 521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!render_view_host_ || !render_view_host_->process()) 522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NULL; 523dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::ProcessHandle handle = render_view_host_->process()->GetHandle(); 524dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (handle == base::kNullProcessHandle) 525dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return NULL; 526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if !defined(OS_MACOSX) 527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen process_metrics_.reset(base::ProcessMetrics::CreateProcessMetrics(handle)); 528dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else 529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen process_metrics_.reset(base::ProcessMetrics::CreateProcessMetrics( 530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen handle, 531dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen MachBroker::GetInstance())); 532dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 533dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 534dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 535dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return process_metrics_.get(); 536dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 537dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 538dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrerenderContents::DestroyWhenUsingTooManyResources() { 539dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::ProcessMetrics* metrics = MaybeGetProcessMetrics(); 540dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (metrics == NULL) 541dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 542dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 543dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t private_bytes, shared_bytes; 544dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (metrics->GetMemoryBytes(&private_bytes, &shared_bytes)) { 545dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (private_bytes > kMaxPrerenderPrivateMB * 1024 * 1024) 546dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Destroy(FINAL_STATUS_MEMORY_LIMIT_EXCEEDED); 547dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 548dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 549dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 550dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace prerender 551