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 dc09eb8365aa6cf03be6e0a81a023c49c3f977ab..042e24e20ffb35e2dd66396f1eb8f890431a313d 100644 |
| --- a/chrome/browser/prerender/prerender_manager.cc |
| +++ b/chrome/browser/prerender/prerender_manager.cc |
| @@ -175,6 +175,7 @@ PrerenderManager::PrerenderManager(Profile* profile) |
| last_recorded_profile_network_bytes_(0), |
| clock_(new base::DefaultClock()), |
| tick_clock_(new base::DefaultTickClock()), |
| + page_load_metric_observer_disabled_(false), |
| weak_factory_(this) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| @@ -345,8 +346,9 @@ bool PrerenderManager::MaybeUsePrerenderedPage(const GURL& url, |
| return false; |
| DCHECK(prerender_data->contents()); |
| - if (prerender_data->contents()->prerender_mode() != FULL_PRERENDER) |
| + if (prerender_data->contents()->prerender_mode() != FULL_PRERENDER) { |
| return false; |
| + } |
| std::unique_ptr<WebContents> new_web_contents = SwapInternal( |
| url, web_contents, prerender_data, params->should_replace_current_entry); |
| @@ -588,9 +590,9 @@ void PrerenderManager::RecordPrefetchRedirectCount(Origin origin, |
| redirect_count); |
| } |
| -void PrerenderManager::RecordFirstContentfulPaint(const GURL& url, |
| - bool is_no_store, |
| - base::TimeDelta time) { |
| +void PrerenderManager::RecordNoStateFirstContentfulPaint(const GURL& url, |
| + bool is_no_store, |
| + base::TimeDelta time) { |
| CleanUpOldNavigations(&prefetches_, base::TimeDelta::FromMinutes(30)); |
| // Compute the prefetch age. |
| @@ -604,8 +606,8 @@ void PrerenderManager::RecordFirstContentfulPaint(const GURL& url, |
| } |
| } |
| - histograms_->RecordFirstContentfulPaint(origin, is_no_store, time, |
| - prefetch_age); |
| + histograms_->RecordNoStateFirstContentfulPaint(origin, is_no_store, time, |
| + prefetch_age); |
| // Loading a prefetched URL resets the revalidation bypass. Remove the url |
| // from the prefetch list for more accurate metrics. |
| @@ -615,6 +617,31 @@ void PrerenderManager::RecordFirstContentfulPaint(const GURL& url, |
| prefetches_.end()); |
| } |
| +void PrerenderManager::RecordPerceivedFirstContentfulPaint( |
| + content::WebContents* web_contents, |
| + base::TimeDelta first_contentful_paint) { |
| + for (auto& observer : observers_) { |
| + observer->OnFirstContentfulPaint(); |
| + } |
| + |
| + PrerenderTabHelper* tab_helper = |
| + PrerenderTabHelper::FromWebContents(web_contents); |
| + if (!tab_helper) { |
|
pasko
2016/11/17 19:52:16
DCHECK(tab_helper) is shorter, why not use it?
mattcary
2016/11/18 09:21:11
Copied from cases like PrerenderManager::SwapInter
|
| + NOTREACHED(); |
| + return; |
| + } |
| + base::TimeDelta perceived_delta; |
| + if (tab_helper->LoadToPerceivedDelta(&perceived_delta)) { |
| + histograms_->RecordPerceivedFirstContentfulPaintTime( |
| + tab_helper->origin(), first_contentful_paint - perceived_delta); |
| + histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(), |
| + true); |
| + } else { |
| + histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(), |
| + false); |
| + } |
| +} |
| + |
| // static |
| PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() { |
| return mode_; |
| @@ -1131,6 +1158,10 @@ void PrerenderManager::SetTickClockForTesting( |
| tick_clock_ = std::move(tick_clock); |
| } |
| +void PrerenderManager::AddObserver(std::unique_ptr<Observer> observer) { |
| + observers_.push_back(std::move(observer)); |
| +} |
| + |
| std::unique_ptr<PrerenderContents> PrerenderManager::CreatePrerenderContents( |
| const GURL& url, |
| const content::Referrer& referrer, |