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

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

Issue 11348357: Add observer interface to PrerenderContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: final review remediation, clear to land version 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_manager.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 54cfdb199c0aacd06f477ae7ee8500577ae6fcb8..7823fe8deca1f0a1fb69e31b154f9573cc619359 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -73,10 +73,10 @@ void InformRenderProcessAboutPrerender(const GURL& url,
class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
public:
virtual PrerenderContents* CreatePrerenderContents(
- PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker,
- Profile* profile, const GURL& url, const content::Referrer& referrer,
+ PrerenderManager* prerender_manager, Profile* profile,
+ const GURL& url, const content::Referrer& referrer,
Origin origin, uint8 experiment_id) OVERRIDE {
- return new PrerenderContents(prerender_manager, prerender_tracker, profile,
+ return new PrerenderContents(prerender_manager, profile,
url, referrer, origin, experiment_id);
}
};
@@ -167,6 +167,12 @@ class PrerenderContents::TabContentsDelegateImpl
PrerenderContents* prerender_contents_;
};
+PrerenderContents::Observer::Observer() {
+}
+
+PrerenderContents::Observer::~Observer() {
+}
+
PrerenderContents::PendingPrerenderInfo::PendingPrerenderInfo(
base::WeakPtr<PrerenderHandle> weak_prerender_handle,
Origin origin,
@@ -202,7 +208,6 @@ void PrerenderContents::StartPendingPrerenders() {
PrerenderContents::PrerenderContents(
PrerenderManager* prerender_manager,
- PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
const content::Referrer& referrer,
@@ -210,7 +215,6 @@ PrerenderContents::PrerenderContents(
uint8 experiment_id)
: prerendering_has_started_(false),
prerender_manager_(prerender_manager),
- prerender_tracker_(prerender_tracker),
prerender_url_(url),
referrer_(referrer),
profile_(profile),
@@ -260,8 +264,7 @@ PrerenderContents::Factory* PrerenderContents::CreateFactory() {
void PrerenderContents::StartPrerendering(
int creator_child_id,
const gfx::Size& size,
- SessionStorageNamespace* session_storage_namespace,
- bool is_control_group) {
+ SessionStorageNamespace* session_storage_namespace) {
DCHECK(profile_ != NULL);
DCHECK(!size.IsEmpty());
DCHECK(!prerendering_has_started_);
@@ -283,7 +286,7 @@ void PrerenderContents::StartPrerendering(
// Everything after this point sets up the WebContents object and associated
// RenderView for the prerender page. Don't do this for members of the
// control group.
- if (is_control_group)
+ if (prerender_manager_->IsControlGroup(experiment_id()))
return;
prerendering_has_started_ = true;
@@ -309,10 +312,8 @@ void PrerenderContents::StartPrerendering(
// 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
// (IO) there is no race condition.
- prerender_tracker_->OnPrerenderingStarted(
- child_id_,
- route_id_,
- prerender_manager_);
+ AddObserver(prerender_manager()->prerender_tracker());
+ NotifyPrerenderStart();
// Close ourselves when the application is shutting down.
notification_registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
@@ -365,27 +366,28 @@ bool PrerenderContents::GetRouteId(int* route_id) const {
return route_id_ != -1;
}
-void PrerenderContents::set_final_status(FinalStatus final_status) {
+void PrerenderContents::SetFinalStatus(FinalStatus final_status) {
DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX);
DCHECK(final_status_ == FINAL_STATUS_MAX);
final_status_ = final_status;
+
+ if (!prerender_manager_->IsControlGroup(experiment_id()) &&
+ prerendering_has_started()) {
+ NotifyPrerenderStop();
+ }
}
PrerenderContents::~PrerenderContents() {
- DCHECK(final_status_ != FINAL_STATUS_MAX);
- DCHECK(prerendering_has_been_cancelled_ ||
- final_status_ == FINAL_STATUS_USED);
- DCHECK(origin_ != ORIGIN_MAX);
+ DCHECK_NE(FINAL_STATUS_MAX, final_status());
+ DCHECK(
+ prerendering_has_been_cancelled() || final_status() == FINAL_STATUS_USED);
+ DCHECK_NE(ORIGIN_MAX, origin());
prerender_manager_->RecordFinalStatusWithMatchCompleteStatus(
- origin_,
- experiment_id_,
- match_complete_status_,
- final_status_);
+ origin(), experiment_id(), match_complete_status(), final_status());
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) {
@@ -399,6 +401,11 @@ PrerenderContents::~PrerenderContents() {
delete ReleasePrerenderContents();
}
+void PrerenderContents::AddObserver(Observer* observer) {
+ DCHECK_EQ(FINAL_STATUS_MAX, final_status_);
+ observer_list_.AddObserver(observer);
+}
+
void PrerenderContents::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
@@ -483,6 +490,17 @@ WebContents* PrerenderContents::CreateWebContents(
profile_, NULL, MSG_ROUTING_NONE, NULL, session_storage_namespace_map);
}
+void PrerenderContents::NotifyPrerenderStart() {
+ DCHECK_EQ(FINAL_STATUS_MAX, final_status_);
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStart(this));
+}
+
+void PrerenderContents::NotifyPrerenderStop() {
+ DCHECK_NE(FINAL_STATUS_MAX, final_status_);
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnPrerenderStop(this));
+ observer_list_.Clear();
+}
+
void PrerenderContents::DidUpdateFaviconURL(
int32 page_id,
const std::vector<content::FaviconURL>& urls) {
@@ -579,18 +597,18 @@ void PrerenderContents::Destroy(FinalStatus final_status) {
// because destroy may be called directly from the UI thread without calling
// TryCancel(). This is difficult to completely avoid, since prerendering
// can be cancelled before a RenderView is created.
- bool is_cancelled = prerender_tracker_->TryCancel(
+ bool is_cancelled = prerender_manager()->prerender_tracker()->TryCancel(
child_id_, route_id_, final_status);
CHECK(is_cancelled);
// A different final status may have been set already from another thread.
// If so, use it instead.
- if (!prerender_tracker_->GetFinalStatus(child_id_, route_id_,
- &final_status)) {
+ if (!prerender_manager()->prerender_tracker()->
+ GetFinalStatus(child_id_, route_id_, &final_status)) {
NOTREACHED();
}
}
- set_final_status(final_status);
+ SetFinalStatus(final_status);
prerendering_has_been_cancelled_ = true;
prerender_manager_->AddToHistory(this);
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698