| 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..62bca9a8a92dd8bc119e6eb4cc0c81253ed149e4 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,30 @@ void PrerenderManager::RecordFirstContentfulPaint(const GURL& url,
|
| prefetches_.end());
|
| }
|
|
|
| +void PrerenderManager::RecordPerceivedFirstContentfulPaint(
|
| + content::WebContents* web_contents,
|
| + base::TimeTicks first_contentful_paint,
|
| + bool was_hidden) {
|
| + for (auto& observer : observers_) {
|
| + observer->OnFirstContentfulPaint();
|
| + }
|
| +
|
| + PrerenderTabHelper* tab_helper =
|
| + PrerenderTabHelper::FromWebContents(web_contents);
|
| + DCHECK(tab_helper);
|
| +
|
| + base::TimeTicks last_swap = tab_helper->last_swap();
|
| + if (!last_swap.is_null() && !first_contentful_paint.is_null()) {
|
| + histograms_->RecordPerceivedFirstContentfulPaintTime(
|
| + tab_helper->origin(), first_contentful_paint - last_swap, was_hidden);
|
| + histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(),
|
| + true, was_hidden);
|
| + } else {
|
| + histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(),
|
| + false, was_hidden);
|
| + }
|
| +}
|
| +
|
| // static
|
| PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() {
|
| return mode_;
|
| @@ -1131,6 +1157,11 @@ void PrerenderManager::SetTickClockForTesting(
|
| tick_clock_ = std::move(tick_clock);
|
| }
|
|
|
| +void PrerenderManager::AddObserver(
|
| + std::unique_ptr<PrerenderManagerObserver> observer) {
|
| + observers_.push_back(std::move(observer));
|
| +}
|
| +
|
| std::unique_ptr<PrerenderContents> PrerenderManager::CreatePrerenderContents(
|
| const GURL& url,
|
| const content::Referrer& referrer,
|
|
|