| Index: chrome/browser/prerender/prerender_contents.cc
|
| diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
|
| index 92ba8019972922e548ab4ccd99d1580e17e11745..93d1029633419d94c736f3f525f8113ad99a345d 100644
|
| --- a/chrome/browser/prerender/prerender_contents.cc
|
| +++ b/chrome/browser/prerender/prerender_contents.cc
|
| @@ -21,7 +21,7 @@
|
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/icon_messages.h"
|
| -#include "chrome/common/render_messages.h"
|
| +#include "chrome/common/prerender_messages.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "content/browser/renderer_host/resource_request_details.h"
|
| #include "content/public/browser/browser_child_process_host.h"
|
| @@ -59,6 +59,29 @@ struct PrerenderURLPredicate {
|
| GURL url_;
|
| };
|
|
|
| +// Tells the render process at |child_id| whether |url| is a new prerendered
|
| +// page, or whether |url| is being removed as a prerendered page. Currently
|
| +// this will only inform the render process that created the prerendered page
|
| +// with <link rel="prerender"> tags about it. This means that if the user
|
| +// clicks on a link for a prerendered URL in a different page, the prerender
|
| +// will not be swapped in.
|
| +void InformRenderProcessAboutPrerender(const GURL& url,
|
| + bool is_add,
|
| + int child_id) {
|
| + if (child_id < 0)
|
| + return;
|
| + content::RenderProcessHost* render_process_host =
|
| + content::RenderProcessHost::FromID(child_id);
|
| + if (!render_process_host)
|
| + return;
|
| + IPC::Message* message = NULL;
|
| + if (is_add)
|
| + message = new PrerenderMsg_AddPrerenderURL(url);
|
| + else
|
| + message = new PrerenderMsg_RemovePrerenderURL(url);
|
| + render_process_host->Send(message);
|
| +}
|
| +
|
| } // end namespace
|
|
|
| class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
|
| @@ -225,7 +248,8 @@ PrerenderContents::PrerenderContents(
|
| child_id_(-1),
|
| route_id_(-1),
|
| origin_(origin),
|
| - experiment_id_(experiment_id) {
|
| + experiment_id_(experiment_id),
|
| + creator_child_id_(-1) {
|
| DCHECK(prerender_manager != NULL);
|
| }
|
|
|
| @@ -246,6 +270,13 @@ void PrerenderContents::StartPrerendering(
|
| DCHECK(prerender_contents_.get() == NULL);
|
|
|
| prerendering_has_started_ = true;
|
| + DCHECK(creator_child_id_ == -1);
|
| + DCHECK(alias_urls_.size() == 1);
|
| + if (source_render_view_host)
|
| + creator_child_id_ = source_render_view_host->GetProcess()->GetID();
|
| + InformRenderProcessAboutPrerender(prerender_url_, true,
|
| + creator_child_id_);
|
| +
|
| WebContents* new_contents = WebContents::Create(
|
| profile_, NULL, MSG_ROUTING_NONE, NULL, session_storage_namespace);
|
| prerender_contents_.reset(new TabContentsWrapper(new_contents));
|
| @@ -361,8 +392,14 @@ PrerenderContents::~PrerenderContents() {
|
| match_complete_status_,
|
| final_status_);
|
|
|
| - if (child_id_ != -1 && route_id_ != -1)
|
| + if (child_id_ != -1 && route_id_ != -1) {
|
| prerender_tracker_->OnPrerenderingFinished(child_id_, route_id_);
|
| + for (std::vector<GURL>::const_iterator it = alias_urls_.begin();
|
| + it != alias_urls_.end();
|
| + ++it) {
|
| + InformRenderProcessAboutPrerender(*it, false, creator_child_id_);
|
| + }
|
| + }
|
|
|
| // If we still have a TabContents, clean up anything we need to and then
|
| // destroy it.
|
| @@ -417,7 +454,7 @@ void PrerenderContents::Observe(int type,
|
| // first navigation, so there's no need to send the message just after
|
| // the TabContents is created.
|
| new_render_view_host->Send(
|
| - new ChromeViewMsg_SetIsPrerendering(
|
| + new PrerenderMsg_SetIsPrerendering(
|
| new_render_view_host->GetRoutingID(),
|
| true));
|
|
|
| @@ -474,6 +511,7 @@ bool PrerenderContents::AddAliasURL(const GURL& url) {
|
| }
|
|
|
| alias_urls_.push_back(url);
|
| + InformRenderProcessAboutPrerender(url, true, creator_child_id_);
|
| prerender_tracker_->AddPrerenderURLOnUIThread(url);
|
| return true;
|
| }
|
|
|