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