diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-10 02:36:54 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-10 02:36:54 +0000 |
commit | 34f8edf92df9b014b31be108c06b89bbe57a54d3 (patch) | |
tree | cbc267edeac1d846986717868c245ef5e3f41ece | |
parent | d306614067ea03aa3f4ad627f5e6079141d99bce (diff) | |
download | chromium_src-34f8edf92df9b014b31be108c06b89bbe57a54d3.zip chromium_src-34f8edf92df9b014b31be108c06b89bbe57a54d3.tar.gz chromium_src-34f8edf92df9b014b31be108c06b89bbe57a54d3.tar.bz2 |
PrerenderObserver knows whether it's currently attached to a prerendering URL.
PrerenderObserver's methods only make sense on non-prerendering TabContents. However,
it may dynamically change since the same TabContentsWrapper will be swapped in.
BUG=None
TEST=PrerenderRedirectToHttps
Review URL: http://codereview.chromium.org/6975005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84744 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 14 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_observer.cc | 29 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_observer.h | 3 |
3 files changed, 41 insertions, 5 deletions
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc index f76ae79..9aa02fd 100644 --- a/chrome/browser/prerender/prerender_manager.cc +++ b/chrome/browser/prerender/prerender_manager.cc @@ -554,7 +554,6 @@ bool PrerenderManager::MaybeUsePreloadedPage(TabContents* tab_contents, old_tab_contents->delegate()->SwapTabContents(old_tab_contents, new_tab_contents); - MarkTabContentsAsPrerendered(tab_contents); // See if we have any pending prerender requests for this routing id and start @@ -864,6 +863,19 @@ bool PrerenderManager::IsTabContentsPrerendering( prerender_tab_contents_wrapper->tab_contents() == tab_contents) return true; } + + // Also look through the pending-deletion list. + for (std::list<PrerenderContentsData>::const_iterator it = + pending_delete_list_.begin(); + it != pending_delete_list_.end(); + ++it) { + TabContentsWrapper* prerender_tab_contents_wrapper = + it->contents_->prerender_contents(); + if (prerender_tab_contents_wrapper && + prerender_tab_contents_wrapper->tab_contents() == tab_contents) + return true; + } + return false; } diff --git a/chrome/browser/prerender/prerender_observer.cc b/chrome/browser/prerender/prerender_observer.cc index 52d377a..30a1248 100644 --- a/chrome/browser/prerender/prerender_observer.cc +++ b/chrome/browser/prerender/prerender_observer.cc @@ -22,8 +22,11 @@ PrerenderObserver::~PrerenderObserver() { void PrerenderObserver::ProvisionalChangeToMainFrameUrl(const GURL& url) { PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); - if (prerender_manager) - prerender_manager->MarkTabContentsAsNotPrerendered(tab_contents()); + if (!prerender_manager) + return; + if (prerender_manager->IsTabContentsPrerendering(tab_contents())) + return; + prerender_manager->MarkTabContentsAsNotPrerendered(tab_contents()); MaybeUsePreloadedPage(url); } @@ -38,6 +41,10 @@ bool PrerenderObserver::OnMessageReceived(const IPC::Message& message) { void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id, bool is_main_frame, const GURL& url) { + // Don't include prerendered pages in the PPLT metric until after they are + // swapped in. + if (IsPrerendering()) + return; if (is_main_frame) { // Record the beginning of a new PPLT navigation. pplt_load_start_ = base::TimeTicks::Now(); @@ -45,6 +52,11 @@ void PrerenderObserver::OnDidStartProvisionalLoadForFrame(int64 frame_id, } void PrerenderObserver::DidStopLoading() { + // Don't include prerendered pages in the PPLT metric until after they are + // swapped in. + if (IsPrerendering()) + return; + // Compute the PPLT metric and report it in a histogram, if needed. if (!pplt_load_start_.is_null()) { PrerenderManager::RecordPerceivedPageLoadTime( @@ -61,10 +73,19 @@ PrerenderManager* PrerenderObserver::MaybeGetPrerenderManager() { bool PrerenderObserver::MaybeUsePreloadedPage(const GURL& url) { PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); - if (prerender_manager && - prerender_manager->MaybeUsePreloadedPage(tab_contents(), url)) + if (!prerender_manager) + return false; + DCHECK(!prerender_manager->IsTabContentsPrerendering(tab_contents())); + if (prerender_manager->MaybeUsePreloadedPage(tab_contents(), url)) return true; return false; } +bool PrerenderObserver::IsPrerendering() { + PrerenderManager* prerender_manager = MaybeGetPrerenderManager(); + if (!prerender_manager) + return false; + return prerender_manager->IsTabContentsPrerendering(tab_contents()); +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_observer.h b/chrome/browser/prerender/prerender_observer.h index eb7d112..f2ec018 100644 --- a/chrome/browser/prerender/prerender_observer.h +++ b/chrome/browser/prerender/prerender_observer.h @@ -48,6 +48,9 @@ class PrerenderObserver : public TabContentsObserver { // object. bool MaybeUsePreloadedPage(const GURL& url); + // Returns whether the TabContents being observed is currently prerendering. + bool IsPrerendering(); + // System time at which the current load was started for the purpose of // the perceived page load time (PPLT). base::TimeTicks pplt_load_start_; |