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

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: clear to land 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
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_handle.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_handle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698