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..13d2e34895c76fa961c6f139e72cbd2a877ebf4b 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(), |
@@ -431,7 +426,7 @@ bool PrerenderManager::MaybeUsePrerenderedPage(WebContents* web_contents, |
// Start pending prerender requests from the PrerenderContents, if there are |
// any. |
- prerender_contents->StartPendingPrerenders(); |
+ prerender_contents->PrepareForUse(); |
TabContents* new_tab_contents = |
prerender_contents->ReleasePrerenderContents(); |
@@ -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,39 +874,29 @@ 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::OnHandleCreated(PrerenderHandle* handle) { |
++handle_count_; |
+ DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); |
mmenke
2012/12/12 16:54:12
nit: DCHECKs are generally put at the start of fu
mmenke
2012/12/12 16:54:12
May want to put one of these in the constructor as
gavinp
2012/12/13 13:38:03
Done & 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::OnHandleNavigatedAway( |
+ PrerenderHandle* handle) { |
+ DCHECK_LT(0, handle_count_); |
+ DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); |
+ // 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::OnHandleCanceled( |
+ PrerenderHandle* handle) { |
DCHECK_LE(1, handle_count_); |
- DCHECK(contents_ || handle_count_ == 1); |
+ DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); |
if (--handle_count_ == 0) { |
- if (contents_) { |
- // This will eventually remove this object from active_prerenders_. |
- contents_->Destroy(FINAL_STATUS_CANCELLED); |
- } else { |
- manager_->DestroyPendingPrerenderData(this); |
- } |
+ // This will eventually remove this object from active_prerenders_. |
+ contents_->Destroy(FINAL_STATUS_CANCELLED); |
} |
} |
@@ -939,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()) |
mmenke
2012/12/12 16:54:12
Since we delete handles when cancelled, and don't
gavinp
2012/12/13 13:38:03
I think that's a good idea. It simplifies the hand
|
continue; |
- DCHECK(existing_prerender_handle->IsPending()); |
+ DCHECK(!existing_prerender_handle->IsPrerendering()); |
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) { |
// 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 +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, |