Index: chrome/browser/prerender/prerender_contents.cc |
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc |
index 5e133749683f54bd4fcec434f7869ed38495e0d2..2737f798b7bafa3ab1dc8124258d5f732fc40a51 100644 |
--- a/chrome/browser/prerender/prerender_contents.cc |
+++ b/chrome/browser/prerender/prerender_contents.cc |
@@ -8,7 +8,6 @@ |
#include <functional> |
#include <utility> |
-#include "base/process_util.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/history/history_tab_helper.h" |
#include "chrome/browser/history/history_types.h" |
@@ -43,33 +42,6 @@ using content::WebContents; |
namespace prerender { |
-namespace { |
- |
-// 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); |
-} |
- |
-} // namespace |
- |
class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { |
public: |
virtual PrerenderContents* CreatePrerenderContents( |
@@ -167,6 +139,15 @@ class PrerenderContents::WebContentsDelegateImpl |
PrerenderContents* prerender_contents_; |
}; |
+void PrerenderContents::Observer::OnPrerenderAddAlias( |
+ PrerenderContents* contents, |
+ const GURL& alias_url) { |
+} |
+ |
+void PrerenderContents::Observer::OnPrerenderCreatedMatchCompleteReplacement( |
+ PrerenderContents* contents, PrerenderContents* replacement) { |
+} |
+ |
PrerenderContents::Observer::Observer() { |
} |
@@ -193,7 +174,9 @@ void PrerenderContents::AddPendingPrerender( |
pending_prerenders_.push_back(pending_prerender_info.release()); |
} |
-void PrerenderContents::StartPendingPrerenders() { |
+void PrerenderContents::PrepareForUse() { |
+ NotifyPrerenderStop(); |
+ |
SessionStorageNamespace* session_storage_namespace = NULL; |
if (prerender_contents_) { |
// TODO(ajwong): This does not correctly handle storage for isolated apps. |
@@ -232,7 +215,7 @@ PrerenderContents::PrerenderContents( |
DCHECK(prerender_manager != NULL); |
} |
-PrerenderContents* PrerenderContents::CreateMatchCompleteReplacement() const { |
+PrerenderContents* PrerenderContents::CreateMatchCompleteReplacement() { |
PrerenderContents* new_contents = prerender_manager_->CreatePrerenderContents( |
prerender_url(), referrer(), origin(), experiment_id()); |
@@ -248,6 +231,7 @@ PrerenderContents* PrerenderContents::CreateMatchCompleteReplacement() const { |
new_contents->alias_urls_ = alias_urls_; |
new_contents->set_match_complete_status( |
PrerenderContents::MATCH_COMPLETE_REPLACEMENT); |
+ NotifyPrerenderCreatedMatchCompleteReplacement(new_contents); |
return new_contents; |
} |
@@ -276,9 +260,6 @@ void PrerenderContents::StartPrerendering( |
session_storage_namespace_id_ = session_storage_namespace->id(); |
size_ = size; |
- InformRenderProcessAboutPrerender(prerender_url_, true, |
- creator_child_id_); |
- |
DCHECK(load_start_time_.is_null()); |
load_start_time_ = base::TimeTicks::Now(); |
@@ -369,11 +350,6 @@ void PrerenderContents::SetFinalStatus(FinalStatus final_status) { |
DCHECK(final_status_ == FINAL_STATUS_MAX); |
final_status_ = final_status; |
- |
- if (!prerender_manager_->IsControlGroup(experiment_id()) && |
- prerendering_has_started()) { |
- NotifyPrerenderStop(); |
- } |
} |
PrerenderContents::~PrerenderContents() { |
@@ -385,14 +361,6 @@ PrerenderContents::~PrerenderContents() { |
prerender_manager_->RecordFinalStatusWithMatchCompleteStatus( |
origin(), experiment_id(), match_complete_status(), final_status()); |
- if (child_id_ != -1 && route_id_ != -1) { |
- 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 WebContents, clean up anything we need to and then |
// destroy it. |
if (prerender_contents_.get()) |
@@ -404,6 +372,10 @@ void PrerenderContents::AddObserver(Observer* observer) { |
observer_list_.AddObserver(observer); |
} |
+void PrerenderContents::RemoveObserver(Observer* observer) { |
+ observer_list_.RemoveObserver(observer); |
+} |
+ |
void PrerenderContents::Observe(int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |
@@ -500,6 +472,18 @@ void PrerenderContents::NotifyPrerenderStop() { |
observer_list_.Clear(); |
} |
+void PrerenderContents::NotifyPrerenderAddAlias(const GURL& alias_url) { |
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderAddAlias(this, |
+ alias_url)); |
+} |
+ |
+void PrerenderContents::NotifyPrerenderCreatedMatchCompleteReplacement( |
+ PrerenderContents* replacement) { |
+ FOR_EACH_OBSERVER(Observer, observer_list_, |
+ OnPrerenderCreatedMatchCompleteReplacement(this, |
+ replacement)); |
+} |
+ |
void PrerenderContents::DidUpdateFaviconURL( |
int32 page_id, |
const std::vector<content::FaviconURL>& urls) { |
@@ -534,7 +518,7 @@ bool PrerenderContents::AddAliasURL(const GURL& url) { |
} |
alias_urls_.push_back(url); |
- InformRenderProcessAboutPrerender(url, true, creator_child_id_); |
+ NotifyPrerenderAddAlias(url); |
return true; |
} |
@@ -588,6 +572,8 @@ void PrerenderContents::DidFinishLoad(int64 frame_id, |
} |
void PrerenderContents::Destroy(FinalStatus final_status) { |
+ DCHECK_NE(final_status, FINAL_STATUS_USED); |
+ |
if (prerendering_has_been_cancelled_) |
return; |
@@ -613,6 +599,12 @@ void PrerenderContents::Destroy(FinalStatus final_status) { |
prerender_manager_->AddToHistory(this); |
prerender_manager_->MoveEntryToPendingDelete(this, final_status); |
+ if (!prerender_manager_->IsControlGroup(experiment_id()) && |
+ (prerendering_has_started() || |
+ match_complete_status() == MATCH_COMPLETE_REPLACEMENT)) { |
+ NotifyPrerenderStop(); |
+ } |
+ |
// We may destroy the PrerenderContents before we have initialized the |
// RenderViewHost. Otherwise set the Observer's PrerenderContents to NULL to |
// avoid any more messages being sent. |