| 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..ab6c7aa5c08181cffe232bd2f9c047132f159192 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() {
|
| - DCHECK_LE(1, handle_count_);
|
| - DCHECK(contents_ || handle_count_ == 1);
|
| +void PrerenderManager::PrerenderData::OnHandleCanceled(
|
| + PrerenderHandle* handle) {
|
| + DCHECK_LT(0, handle_count_);
|
| + 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,
|
|
|