Index: chrome/browser/prerender/prerender_manager.cc |
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
index 2b709881c6ba7e75a87d8da9b346aca3bf67bb2f..524ddb3c76ddc21359a27892292800d15c301f8a 100644 |
--- a/chrome/browser/prerender/prerender_manager.cc |
+++ b/chrome/browser/prerender/prerender_manager.cc |
@@ -224,7 +224,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()); |
} |
@@ -239,7 +238,6 @@ void PrerenderManager::Shutdown() { |
profile_ = NULL; |
DCHECK(active_prerenders_.empty()); |
- pending_prerenders_.clear(); |
} |
PrerenderHandle* PrerenderManager::AddPrerenderFromLinkRelPrerender( |
@@ -279,11 +277,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(), |
@@ -857,10 +852,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) |
@@ -883,38 +874,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_) |
+ 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) { |
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_) { |
// This will eventually remove this object from active_prerenders_. |
contents_->Destroy(FINAL_STATUS_CANCELLED); |
- } else { |
- manager_->DestroyPendingPrerenderData(this); |
} |
} |
} |
@@ -939,31 +922,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)); |
- if (swap_prerender_handle.get()) { |
+ if (new_prerender_handle.get()) { |
// 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; |
} |
- |
- // 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(); |
} |
} |
@@ -982,16 +960,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, |