Chromium Code Reviews| Index: chrome/browser/prerender/prerender_contents.cc |
| =================================================================== |
| --- chrome/browser/prerender/prerender_contents.cc (revision 82104) |
| +++ chrome/browser/prerender/prerender_contents.cc (working copy) |
| @@ -11,6 +11,7 @@ |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/prerender/prerender_final_status.h" |
| #include "chrome/browser/prerender/prerender_manager.h" |
| +#include "chrome/browser/prerender/prerender_render_widget_host_view.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/renderer_preferences_util.h" |
| #include "chrome/browser/ui/login/login_prompt.h" |
| @@ -70,6 +71,7 @@ |
| page_id_(0), |
| has_stopped_loading_(false), |
| final_status_(FINAL_STATUS_MAX), |
| + pending_final_status_(FINAL_STATUS_MAX), |
| prerendering_has_started_(false) { |
| DCHECK(prerender_manager != NULL); |
| if (!AddAliasURL(prerender_url_)) |
| @@ -87,9 +89,12 @@ |
| return new PrerenderContentsFactoryImpl(); |
| } |
| -void PrerenderContents::StartPrerendering() { |
| +void PrerenderContents::StartPrerendering( |
| + const RenderViewHost* source_render_view_host) { |
| DCHECK(profile_ != NULL); |
| DCHECK(!prerendering_has_started_); |
| + DCHECK(source_render_view_host != NULL); |
| + DCHECK(source_render_view_host->view() != NULL); |
| prerendering_has_started_ = true; |
| SiteInstance* site_instance = SiteInstance::CreateSiteInstance(profile_); |
| render_view_host_ = new RenderViewHost(site_instance, this, MSG_ROUTING_NONE, |
| @@ -106,10 +111,13 @@ |
| // Create the RenderView, so it can receive messages. |
| render_view_host_->CreateRenderView(string16()); |
| - // Hide the RVH, so that we will run at a lower CPU priority. |
| - // Once the RVH is being swapped into a tab, we will Restore it again. |
| - render_view_host_->WasHidden(); |
| + // Give the RVH a PrerenderRenderWidgetHostView, both so its size can be set |
| + // and so that the prerender can be cancelled under certain circumstances. |
| + PrerenderRenderWidgetHostView* view = |
| + new PrerenderRenderWidgetHostView(render_view_host_, this); |
| + view->Init(source_render_view_host->view()); |
| + |
| // Register this with the ResourceDispatcherHost as a prerender |
| // RenderViewHost. This must be done before the Navigate message to catch all |
| // resource requests, but as it is on the same thread as the Navigate message |
| @@ -191,6 +199,19 @@ |
| return final_status_; |
| } |
| +void PrerenderContents::set_pending_final_status( |
| + FinalStatus pending_final_status) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(pending_final_status >= FINAL_STATUS_USED && |
| + pending_final_status < FINAL_STATUS_MAX); |
|
cbentzel
2011/04/19 17:42:41
Do you want to DCHECK_EQ(FINAL_STATUS_MAX, pending
mmenke
2011/04/19 20:00:01
It can be done multiple times. I just wait for th
|
| + |
| + pending_final_status_ = pending_final_status; |
| +} |
| + |
| +FinalStatus PrerenderContents::pending_final_status() const { |
| + return pending_final_status_; |
| +} |
| + |
| PrerenderContents::~PrerenderContents() { |
| DCHECK(final_status_ != FINAL_STATUS_MAX); |