Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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::TimeDelta first_contentful_paint) { | |
| 623 for (auto& observer : observers_) { | |
| 624 observer->OnFirstContentfulPaint(); | |
| 625 } | |
| 626 | |
| 627 PrerenderTabHelper* tab_helper = | |
| 628 PrerenderTabHelper::FromWebContents(web_contents); | |
| 629 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
| |
| 630 NOTREACHED(); | |
| 631 return; | |
| 632 } | |
| 633 base::TimeDelta perceived_delta; | |
| 634 if (tab_helper->LoadToPerceivedDelta(&perceived_delta)) { | |
| 635 histograms_->RecordPerceivedFirstContentfulPaintTime( | |
| 636 tab_helper->origin(), first_contentful_paint - perceived_delta); | |
| 637 histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(), | |
| 638 true); | |
| 639 } else { | |
| 640 histograms_->RecordPerceivedFirstContentfulPaintStatus(tab_helper->origin(), | |
| 641 false); | |
| 642 } | |
| 643 } | |
| 644 | |
| 618 // static | 645 // static |
| 619 PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() { | 646 PrerenderManager::PrerenderManagerMode PrerenderManager::GetMode() { |
| 620 return mode_; | 647 return mode_; |
| 621 } | 648 } |
| 622 | 649 |
| 623 // static | 650 // static |
| 624 void PrerenderManager::SetMode(PrerenderManagerMode mode) { | 651 void PrerenderManager::SetMode(PrerenderManagerMode mode) { |
| 625 mode_ = mode; | 652 mode_ = mode; |
| 626 } | 653 } |
| 627 | 654 |
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1124 void PrerenderManager::SetClockForTesting( | 1151 void PrerenderManager::SetClockForTesting( |
| 1125 std::unique_ptr<base::SimpleTestClock> clock) { | 1152 std::unique_ptr<base::SimpleTestClock> clock) { |
| 1126 clock_ = std::move(clock); | 1153 clock_ = std::move(clock); |
| 1127 } | 1154 } |
| 1128 | 1155 |
| 1129 void PrerenderManager::SetTickClockForTesting( | 1156 void PrerenderManager::SetTickClockForTesting( |
| 1130 std::unique_ptr<base::SimpleTestTickClock> tick_clock) { | 1157 std::unique_ptr<base::SimpleTestTickClock> tick_clock) { |
| 1131 tick_clock_ = std::move(tick_clock); | 1158 tick_clock_ = std::move(tick_clock); |
| 1132 } | 1159 } |
| 1133 | 1160 |
| 1161 void PrerenderManager::AddObserver(std::unique_ptr<Observer> 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 Loading... | |
| 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 |
| OLD | NEW |