Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
| index b2121cf31a4f251fbc93786cb07e61e0971736a5..a1881ab9d62a7821cb962216c8d166c22de46581 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(), |
| @@ -429,7 +424,7 @@ bool PrerenderManager::MaybeUsePrerenderedPage(WebContents* web_contents, |
| // Start pending prerender requests from the PrerenderContents, if there are |
| // any. |
| - prerender_contents->StartPendingPrerenders(); |
| + prerender_contents->PrepareForUse(); |
| WebContents* new_web_contents = |
| prerender_contents->ReleasePrerenderContents(); |
| @@ -501,7 +496,7 @@ void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry, |
| ActuallyPrerendering()) { |
| // TODO(tburkard): I'd like to DCHECK that we are actually prerendering. |
| // However, what if new conditions are added and |
| - // NeedMatchCompleteDummyForFinalStatus, is not being updated. Not sure |
| + // NeedMatchCompleteDummyForFinalStatus is not being updated. Not sure |
| // what's the best thing to do here. For now, I will just check whether |
| // we are actually prerendering. |
| (*it)->MakeIntoMatchCompleteReplacement(); |
| @@ -511,7 +506,7 @@ void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry, |
| } |
| // Destroy the old WebContents relatively promptly to reduce resource usage, |
| - // and in the case of HTML5 media, reduce the change of playing any sound. |
| + // and in the case of HTML5 media, reduce the chance of playing any sound. |
| PostCleanupTask(); |
| } |
| @@ -851,10 +846,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) |
| @@ -862,6 +853,7 @@ PrerenderManager::PrerenderData::PrerenderData(PrerenderManager* manager, |
| contents_(contents), |
| handle_count_(0), |
| expiry_time_(expiry_time) { |
| + DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); |
| } |
| PrerenderManager::PrerenderData::~PrerenderData() { |
| @@ -877,39 +869,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) { |
| + DCHECK_NE(static_cast<PrerenderContents*>(NULL), contents_); |
| ++handle_count_; |
| + 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_); |
|
mmenke
2012/12/13 18:27:16
nit: This uses "DCHECK_LE", and the above functio
gavinp
2012/12/13 20:45:34
Done.
|
| - 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); |
| } |
| } |
| @@ -933,31 +915,24 @@ 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; |
| - 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(); |
| } |
| } |
| @@ -976,16 +951,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, |