Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <functional> 10 #include <functional>
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 168
169 PrerenderManager::PrerenderManager(Profile* profile) 169 PrerenderManager::PrerenderManager(Profile* profile)
170 : profile_(profile), 170 : profile_(profile),
171 prerender_contents_factory_(PrerenderContents::CreateFactory()), 171 prerender_contents_factory_(PrerenderContents::CreateFactory()),
172 prerender_history_(new PrerenderHistory(kHistoryLength)), 172 prerender_history_(new PrerenderHistory(kHistoryLength)),
173 histograms_(new PrerenderHistograms()), 173 histograms_(new PrerenderHistograms()),
174 profile_network_bytes_(0), 174 profile_network_bytes_(0),
175 last_recorded_profile_network_bytes_(0), 175 last_recorded_profile_network_bytes_(0),
176 clock_(new base::DefaultClock()), 176 clock_(new base::DefaultClock()),
177 tick_clock_(new base::DefaultTickClock()), 177 tick_clock_(new base::DefaultTickClock()),
178 page_load_metric_observer_disabled_(false),
178 weak_factory_(this) { 179 weak_factory_(this) {
179 DCHECK_CURRENTLY_ON(BrowserThread::UI); 180 DCHECK_CURRENTLY_ON(BrowserThread::UI);
180 181
181 last_prerender_start_time_ = 182 last_prerender_start_time_ =
182 GetCurrentTimeTicks() - 183 GetCurrentTimeTicks() -
183 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs); 184 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
184 185
185 // Certain experiments override our default config_ values. 186 // Certain experiments override our default config_ values.
186 switch (PrerenderManager::GetMode()) { 187 switch (PrerenderManager::GetMode()) {
187 case PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP: 188 case PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP:
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 // First, try to find prerender data with the correct session storage 339 // First, try to find prerender data with the correct session storage
339 // namespace. 340 // namespace.
340 // TODO(ajwong): This doesn't handle isolated apps correctly. 341 // TODO(ajwong): This doesn't handle isolated apps correctly.
341 PrerenderData* prerender_data = FindPrerenderData( 342 PrerenderData* prerender_data = FindPrerenderData(
342 url, 343 url,
343 web_contents->GetController().GetDefaultSessionStorageNamespace()); 344 web_contents->GetController().GetDefaultSessionStorageNamespace());
344 if (!prerender_data) 345 if (!prerender_data)
345 return false; 346 return false;
346 DCHECK(prerender_data->contents()); 347 DCHECK(prerender_data->contents());
347 348
348 if (prerender_data->contents()->prerender_mode() != FULL_PRERENDER) 349 if (prerender_data->contents()->prerender_mode() != FULL_PRERENDER) {
349 return false; 350 return false;
351 }
350 352
351 std::unique_ptr<WebContents> new_web_contents = SwapInternal( 353 std::unique_ptr<WebContents> new_web_contents = SwapInternal(
352 url, web_contents, prerender_data, params->should_replace_current_entry); 354 url, web_contents, prerender_data, params->should_replace_current_entry);
353 if (!new_web_contents) 355 if (!new_web_contents)
354 return false; 356 return false;
355 357
356 // Record the new target_contents for the callers. 358 // Record the new target_contents for the callers.
357 params->target_contents = new_web_contents.release(); 359 params->target_contents = new_web_contents.release();
358 return true; 360 return true;
359 } 361 }
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 is_redirect, is_no_store); 583 is_redirect, is_no_store);
582 } 584 }
583 585
584 void PrerenderManager::RecordPrefetchRedirectCount(Origin origin, 586 void PrerenderManager::RecordPrefetchRedirectCount(Origin origin,
585 bool is_main_resource, 587 bool is_main_resource,
586 int redirect_count) { 588 int redirect_count) {
587 histograms_->RecordPrefetchRedirectCount(origin, is_main_resource, 589 histograms_->RecordPrefetchRedirectCount(origin, is_main_resource,
588 redirect_count); 590 redirect_count);
589 } 591 }
590 592
591 void PrerenderManager::RecordFirstContentfulPaint(const GURL& url, 593 void PrerenderManager::RecordNoStateFirstContentfulPaint(const GURL& url,
592 bool is_no_store, 594 bool is_no_store,
593 base::TimeDelta time) { 595 base::TimeDelta time) {
594 CleanUpOldNavigations(&prefetches_, base::TimeDelta::FromMinutes(30)); 596 CleanUpOldNavigations(&prefetches_, base::TimeDelta::FromMinutes(30));
595 597
596 // Compute the prefetch age. 598 // Compute the prefetch age.
597 base::TimeDelta prefetch_age; 599 base::TimeDelta prefetch_age;
598 Origin origin = ORIGIN_NONE; 600 Origin origin = ORIGIN_NONE;
599 for (auto it = prefetches_.crbegin(); it != prefetches_.crend(); ++it) { 601 for (auto it = prefetches_.crbegin(); it != prefetches_.crend(); ++it) {
600 if (it->url == url) { 602 if (it->url == url) {
601 prefetch_age = GetCurrentTimeTicks() - it->time; 603 prefetch_age = GetCurrentTimeTicks() - it->time;
602 origin = it->origin; 604 origin = it->origin;
603 break; 605 break;
604 } 606 }
605 } 607 }
606 608
607 histograms_->RecordFirstContentfulPaint(origin, is_no_store, time, 609 histograms_->RecordNoStateFirstContentfulPaint(origin, is_no_store, time,
608 prefetch_age); 610 prefetch_age);
609 611
610 // Loading a prefetched URL resets the revalidation bypass. Remove the url 612 // Loading a prefetched URL resets the revalidation bypass. Remove the url
611 // from the prefetch list for more accurate metrics. 613 // from the prefetch list for more accurate metrics.
612 prefetches_.erase( 614 prefetches_.erase(
613 std::remove_if(prefetches_.begin(), prefetches_.end(), 615 std::remove_if(prefetches_.begin(), prefetches_.end(),
614 [url](const NavigationRecord& r) { return r.url == url; }), 616 [url](const NavigationRecord& r) { return r.url == url; }),
615 prefetches_.end()); 617 prefetches_.end());
616 } 618 }
617 619
620 void PrerenderManager::RecordPerceivedFirstContentfulPaint(
621 content::WebContents* web_contents,
622 base::TimeTicks first_contentful_paint,
623 bool was_hidden) {
624 for (auto& observer : observers_) {
625 observer->OnFirstContentfulPaint();
626 }
627
628 PrerenderTabHelper* tab_helper =
629 PrerenderTabHelper::FromWebContents(web_contents);
630 DCHECK(tab_helper);
631
632 base::TimeTicks last_swap = tab_helper->last_swap();
633 if (!last_swap.is_null() && !first_contentful_paint.is_null()) {
634 histograms_->RecordPerceivedFirstContentfulPaintTime(
635 tab_helper->origin(), first_contentful_paint - last_swap, was_hidden);
636 histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(),
637 true, was_hidden);
638 } else {
639 histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(),
640 false, was_hidden);
641 }
642 }
643
618 // static 644 // static
619 PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() { 645 PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() {
620 return mode_; 646 return mode_;
621 } 647 }
622 648
623 // static 649 // static
624 void PrerenderManager::SetMode(PrerenderManagerMode mode) { 650 void PrerenderManager::SetMode(PrerenderManagerMode mode) {
625 mode_ = mode; 651 mode_ = mode;
626 } 652 }
627 653
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 void PrerenderManager::SetClockForTesting( 1150 void PrerenderManager::SetClockForTesting(
1125 std::unique_ptr<base::SimpleTestClock> clock) { 1151 std::unique_ptr<base::SimpleTestClock> clock) {
1126 clock_ = std::move(clock); 1152 clock_ = std::move(clock);
1127 } 1153 }
1128 1154
1129 void PrerenderManager::SetTickClockForTesting( 1155 void PrerenderManager::SetTickClockForTesting(
1130 std::unique_ptr<base::SimpleTestTickClock> tick_clock) { 1156 std::unique_ptr<base::SimpleTestTickClock> tick_clock) {
1131 tick_clock_ = std::move(tick_clock); 1157 tick_clock_ = std::move(tick_clock);
1132 } 1158 }
1133 1159
1160 void PrerenderManager::AddObserver(
1161 std::unique_ptr<PrerenderManagerObserver> observer) {
1162 observers_.push_back(std::move(observer));
1163 }
1164
1134 std::unique_ptr<PrerenderContents> PrerenderManager::CreatePrerenderContents( 1165 std::unique_ptr<PrerenderContents> PrerenderManager::CreatePrerenderContents(
1135 const GURL& url, 1166 const GURL& url,
1136 const content::Referrer& referrer, 1167 const content::Referrer& referrer,
1137 Origin origin) { 1168 Origin origin) {
1138 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1169 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1139 return base::WrapUnique(prerender_contents_factory_->CreatePrerenderContents( 1170 return base::WrapUnique(prerender_contents_factory_->CreatePrerenderContents(
1140 this, profile_, url, referrer, origin)); 1171 this, profile_, url, referrer, origin));
1141 } 1172 }
1142 1173
1143 void PrerenderManager::SortActivePrerenders() { 1174 void PrerenderManager::SortActivePrerenders() {
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 DCHECK_EQ(1u, erased); 1427 DCHECK_EQ(1u, erased);
1397 } 1428 }
1398 1429
1399 void PrerenderManager::SetPrerenderContentsFactoryForTest( 1430 void PrerenderManager::SetPrerenderContentsFactoryForTest(
1400 PrerenderContents::Factory* prerender_contents_factory) { 1431 PrerenderContents::Factory* prerender_contents_factory) {
1401 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1432 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1402 prerender_contents_factory_.reset(prerender_contents_factory); 1433 prerender_contents_factory_.reset(prerender_contents_factory);
1403 } 1434 }
1404 1435
1405 } // namespace prerender 1436 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698