summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender/prerender_manager.cc
diff options
context:
space:
mode:
authorgavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-15 21:45:18 +0000
committergavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-15 21:45:18 +0000
commit2610170d745f256d0316a936d0907e02b279d8bd (patch)
treead2be6594e2ae6ad54e6cb0b451716565d9f40cd /chrome/browser/prerender/prerender_manager.cc
parentaeb5ccec77fbc0691e766ee80b7c4f4efb79bd9d (diff)
downloadchromium_src-2610170d745f256d0316a936d0907e02b279d8bd.zip
chromium_src-2610170d745f256d0316a936d0907e02b279d8bd.tar.gz
chromium_src-2610170d745f256d0316a936d0907e02b279d8bd.tar.bz2
Make PrerenderHandle an observer of PrerenderContents.
The big implication of this is that PrerenderLinkManager is an observer of PrerenderHandle, and so messaging to/from the browser process about prerenders ends up mostly in the same place. Interestingly, we basically can toss out the pending_prerenders_ list in the PrerenderManager; the only thing it bought us was tracking cancelation, which is now done with a bool in PrerenderHandle, just as easily. The earlier work on the lifetime of PrerenderContents and PrerenderHandle was building up to this. This CL depends on https://codereview.chromium.org/11348357/ , and can't land until after it. R=mmenke@chromium.org BUG=None Review URL: https://chromiumcodereview.appspot.com/11316311 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173322 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender/prerender_manager.cc')
-rw-r--r--chrome/browser/prerender/prerender_manager.cc93
1 files changed, 29 insertions, 64 deletions
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index b2121cf..ab6c7aa 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,