Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4853)

Unified Diff: chrome/browser/prerender/prerender_contents.cc

Issue 11316311: Make PrerenderHandle an observer of PrerenderContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: prerender tracker test fix Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_contents.cc
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index e749a7be629f46d3de87327b35049aa8e86545fe..a8ae0b9059f36cf76dec9f227d64f0a196705e27 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::TabContentsDelegateImpl
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.
@@ -233,7 +216,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());
@@ -249,6 +232,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;
}
@@ -277,9 +261,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();
@@ -371,11 +352,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() {
@@ -387,14 +363,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())
@@ -406,6 +374,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) {
@@ -501,6 +473,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) {
@@ -535,7 +519,7 @@ bool PrerenderContents::AddAliasURL(const GURL& url) {
}
alias_urls_.push_back(url);
- InformRenderProcessAboutPrerender(url, true, creator_child_id_);
+ NotifyPrerenderAddAlias(url);
return true;
}
@@ -589,6 +573,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;
@@ -614,6 +600,11 @@ 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()) {
+ 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.

Powered by Google App Engine
This is Rietveld 408576698