summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-10 02:36:54 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-10 02:36:54 +0000
commit34f8edf92df9b014b31be108c06b89bbe57a54d3 (patch)
treecbc267edeac1d846986717868c245ef5e3f41ece /chrome
parentd306614067ea03aa3f4ad627f5e6079141d99bce (diff)
downloadchromium_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
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/prerender/prerender_manager.cc14
-rw-r--r--chrome/browser/prerender/prerender_observer.cc29
-rw-r--r--chrome/browser/prerender/prerender_observer.h3
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_;