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

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

Issue 11316311: Make PrerenderHandle an observer of PrerenderContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix windows build 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_manager.cc
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 192f2c60af67c908476ead25f5bc850c81d0a215..d027720377140f2d94c0cd2100e22292438b7c6d 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -223,7 +223,6 @@ PrerenderManager::~PrerenderManager() {
// The earlier call to ProfileKeyedService::Shutdown() should have emptied
// these vectors already.
DCHECK(active_prerenders_.empty());
- DCHECK(pending_prerenders_.empty());
DCHECK(to_delete_prerenders_.empty());
}
@@ -238,7 +237,6 @@ void PrerenderManager::Shutdown() {
profile_ = NULL;
DCHECK(active_prerenders_.empty());
- pending_prerenders_.clear();
}
PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender(
@@ -278,11 +276,8 @@ PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender(
// Instead of prerendering from inside of a running prerender, we will defer
// this request until its launcher is made visible.
if (PrerenderContents* contents = parent_prerender_data->contents()) {
- pending_prerenders_.push_back(new PrerenderData(this));
PrerenderHandle* prerender_handle =
- new PrerenderHandle(pending_prerenders_.back());
- DCHECK(prerender_handle->IsPending());
-
+ new PrerenderHandle(static_cast<PrerenderData*>(NULL));
scoped_ptr<PrerenderContents::PendingPrerenderInfo>
pending_prerender_info(new PrerenderContents::PendingPrerenderInfo(
prerender_handle->weak_ptr_factory_.GetWeakPtr(),
@@ -855,10 +850,6 @@ struct PrerenderManager::PrerenderData::OrderByExpiryTime {
}
};
-PrerenderManager::PrerenderData::PrerenderData(PrerenderManager* manager)
- : manager_(manager), contents_(NULL), handle_count_(0) {
-}
-
PrerenderManager::PrerenderData::PrerenderData(PrerenderManager* manager,
PrerenderContents* contents,
base::TimeTicks expiry_time)
@@ -881,38 +872,30 @@ void PrerenderManager::PrerenderData::MakeIntoMatchCompleteReplacement() {
manager_->to_delete_prerenders_.push_back(to_delete);
}
-void PrerenderManager::PrerenderData::OnNewHandle() {
- DCHECK(contents_ || handle_count_ == 0) <<
- "Cannot create multiple handles to a pending prerender.";
+void PrerenderManager::PrerenderData::OnNewHandle(PrerenderHandle* handle) {
++handle_count_;
+ if (contents_)
mmenke 2012/12/06 22:22:15 contents_ can no longer be null.
gavinp 2012/12/10 17:55:10 Done.
+ contents_->AddObserver(handle);
}
-void PrerenderManager::PrerenderData::OnNavigateAwayByHandle() {
- if (!contents_) {
- DCHECK_EQ(1, handle_count_);
- // Pending prerenders are not maintained in the active_prerenders_, so they
- // will not get normal expiry. Since this prerender hasn't even been
- // launched yet, and it's held by a page that is being prerendered, we will
- // just delete it.
- manager_->DestroyPendingPrerenderData(this);
- } else {
- DCHECK_LE(0, handle_count_);
- // We intentionally don't decrement the handle count here, so that the
- // prerender won't be canceled until it times out.
- manager_->SourceNavigatedAway(this);
- }
+void PrerenderManager::PrerenderData::OnNavigateAwayByHandle(
+ PrerenderHandle* handle) {
+ DCHECK_LT(0, handle_count_);
+ // We intentionally don't decrement the handle count here, so that the
+ // prerender won't be canceled until it times out.
+ manager_->SourceNavigatedAway(this);
}
-void PrerenderManager::PrerenderData::OnCancelByHandle() {
+void PrerenderManager::PrerenderData::OnCancelByHandle(
+ PrerenderHandle* handle) {
mmenke 2012/12/06 22:22:15 Why do we need the handle here? Just for consiste
gavinp 2012/12/10 17:55:10 Just for consistency.
DCHECK_LE(1, handle_count_);
- DCHECK(contents_ || handle_count_ == 1);
+ DCHECK(contents_ || handle_count_ == 1)
+ << "Pending prerenders should never have multiple prerenders";
if (--handle_count_ == 0) {
if (contents_) {
mmenke 2012/12/06 22:22:15 contents_ can't be null.
gavinp 2012/12/10 17:55:10 Done.
// This will eventually remove this object from active_prerenders_.
contents_->Destroy(FINAL_STATUS_CANCELLED);
- } else {
- manager_->DestroyPendingPrerenderData(this);
}
}
}
@@ -937,31 +920,26 @@ void PrerenderManager::StartPendingPrerenders(
PrerenderContents::PendingPrerenderInfo* info = *it;
PrerenderHandle* existing_prerender_handle =
info->weak_prerender_handle.get();
- if (!existing_prerender_handle || !existing_prerender_handle->IsValid())
+ if (!existing_prerender_handle)
+ continue;
+ if (existing_prerender_handle->has_been_canceled())
continue;
- DCHECK(existing_prerender_handle->IsPending());
+ DCHECK(!existing_prerender_handle->IsValid());
DCHECK(process_id == -1 || session_storage_namespace);
- scoped_ptr<PrerenderHandle> swap_prerender_handle(AddPrerender(
+ scoped_ptr<PrerenderHandle> new_prerender_handle(AddPrerender(
info->origin, process_id,
info->url, info->referrer, info->size,
session_storage_namespace));
mmenke 2012/12/07 16:46:08 optional (Or feel free to think about in a later C
gavinp 2012/12/10 17:55:10 Definitely a good idea, and I'm definitely punting
- if (swap_prerender_handle.get()) {
+ if (new_prerender_handle.get()) {
mmenke 2012/12/07 16:46:08 nit: Can remove the .get() while you're here.
gavinp 2012/12/10 17:55:10 enne is Awesome! Done.
// AddPrerender has returned a new prerender handle to us. We want to make
- // |existing_prerender_handle| active, so swap the underlying
- // PrerenderData between the two handles, and delete our old handle (which
- // will release our entry in the pending_prerender_list_).
- existing_prerender_handle->SwapPrerenderDataWith(
- swap_prerender_handle.get());
- swap_prerender_handle->OnCancel();
+ // |existing_prerender_handle| active, so move the underlying
+ // PrerenderData to our new handle.
+ existing_prerender_handle->AdoptPrerenderDataFrom(
+ new_prerender_handle.get());
continue;
}
mmenke 2012/12/07 16:46:08 Random comment for the future - if a prerender is
gavinp 2012/12/13 13:38:03 I'm going to go with no. The launcher has no promi
-
- // We could not start our Prerender. Canceling the existing handle will make
- // it return false for PrerenderHandle::IsPending(), and will release the
- // PrerenderData from pending_prerender_list_.
- existing_prerender_handle->OnCancel();
}
}
@@ -980,16 +958,6 @@ void PrerenderManager::SourceNavigatedAway(PrerenderData* prerender_data) {
SortActivePrerenders();
}
-void PrerenderManager::DestroyPendingPrerenderData(
- PrerenderData* pending_prerender_data) {
- ScopedVector<PrerenderData>::iterator it =
- std::find(pending_prerenders_.begin(), pending_prerenders_.end(),
- pending_prerender_data);
- if (it == pending_prerenders_.end())
- return;
- pending_prerenders_.erase(it);
-}
-
// private
PrerenderHandle* PrerenderManager::AddPrerender(
Origin origin,

Powered by Google App Engine
This is Rietveld 408576698