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

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor.cc

Issue 2887133003: predictors: Refactor resource_prefetch_predictor triggering. (Closed)
Patch Set: . Created 3 years, 7 months 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/predictors/resource_prefetch_predictor.h" 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 const base::TimeTicks& first_contentful_paint) { 661 const base::TimeTicks& first_contentful_paint) {
662 DCHECK_CURRENTLY_ON(BrowserThread::UI); 662 DCHECK_CURRENTLY_ON(BrowserThread::UI);
663 if (initialization_state_ != INITIALIZED) 663 if (initialization_state_ != INITIALIZED)
664 return; 664 return;
665 665
666 NavigationMap::iterator nav_it = inflight_navigations_.find(navigation_id); 666 NavigationMap::iterator nav_it = inflight_navigations_.find(navigation_id);
667 if (nav_it != inflight_navigations_.end()) 667 if (nav_it != inflight_navigations_.end())
668 nav_it->second->first_contentful_paint = first_contentful_paint; 668 nav_it->second->first_contentful_paint = first_contentful_paint;
669 } 669 }
670 670
671 void ResourcePrefetchPredictor::StartPrefetching(const GURL& url,
alexilin 2017/05/23 11:01:39 Why moving code?
672 HintOrigin origin) {
673 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StartPrefetching", "url",
674 url.spec());
675 // Save prefetch start time to report prefetching duration.
676 if (inflight_prefetches_.find(url) == inflight_prefetches_.end() &&
677 IsUrlPrefetchable(url)) {
678 inflight_prefetches_.insert(std::make_pair(url, base::TimeTicks::Now()));
679 }
680
681 if (!prefetch_manager_.get()) // Prefetching not enabled.
682 return;
683 if (!config_.IsPrefetchingEnabledForOrigin(profile_, origin))
684 return;
685
686 ResourcePrefetchPredictor::Prediction prediction;
687 if (!GetPrefetchData(url, &prediction))
688 return;
689
690 BrowserThread::PostTask(
691 BrowserThread::IO, FROM_HERE,
692 base::BindOnce(&ResourcePrefetcherManager::MaybeAddPrefetch,
693 prefetch_manager_, url, prediction.subresource_urls));
694
695 if (observer_)
696 observer_->OnPrefetchingStarted(url);
697 }
698
699 void ResourcePrefetchPredictor::StopPrefetching(const GURL& url) {
700 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StopPrefetching", "url",
701 url.spec());
702 auto it = inflight_prefetches_.find(url);
703 if (it != inflight_prefetches_.end()) {
704 UMA_HISTOGRAM_TIMES(
705 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram,
706 base::TimeTicks::Now() - it->second);
707 inflight_prefetches_.erase(it);
708 }
709 if (!prefetch_manager_.get()) // Not enabled.
710 return;
711
712 BrowserThread::PostTask(
713 BrowserThread::IO, FROM_HERE,
714 base::BindOnce(&ResourcePrefetcherManager::MaybeRemovePrefetch,
715 prefetch_manager_, url));
716
717 if (observer_)
718 observer_->OnPrefetchingStopped(url);
719 }
720
721 void ResourcePrefetchPredictor::OnPrefetchingFinished( 671 void ResourcePrefetchPredictor::OnPrefetchingFinished(
722 const GURL& main_frame_url, 672 const GURL& main_frame_url,
723 std::unique_ptr<ResourcePrefetcher::PrefetcherStats> stats) { 673 std::unique_ptr<ResourcePrefetcher::PrefetcherStats> stats) {
724 if (observer_) 674 if (observer_)
725 observer_->OnPrefetchingFinished(main_frame_url); 675 observer_->OnPrefetchingFinished(main_frame_url);
726 676
727 prefetcher_stats_.insert(std::make_pair(main_frame_url, std::move(stats))); 677 prefetcher_stats_.insert(std::make_pair(main_frame_url, std::move(stats)));
728 } 678 }
729 679
730 bool ResourcePrefetchPredictor::IsUrlPrefetchable(const GURL& main_frame_url) { 680 bool ResourcePrefetchPredictor::IsUrlPrefetchable(
681 const GURL& main_frame_url) const {
731 DCHECK_CURRENTLY_ON(BrowserThread::UI); 682 DCHECK_CURRENTLY_ON(BrowserThread::UI);
732 if (initialization_state_ != INITIALIZED) 683 if (initialization_state_ != INITIALIZED)
733 return false; 684 return false;
734 685
735 return GetPrefetchData(main_frame_url, nullptr); 686 return GetPrefetchData(main_frame_url, nullptr);
736 } 687 }
737 688
738 bool ResourcePrefetchPredictor::IsResourcePrefetchable( 689 bool ResourcePrefetchPredictor::IsResourcePrefetchable(
739 const ResourceData& resource) const { 690 const ResourceData& resource) const {
740 float confidence = static_cast<float>(resource.number_of_hits()) / 691 float confidence = static_cast<float>(resource.number_of_hits()) /
(...skipping 13 matching lines...) Expand all
754 prefetch_manager_ = NULL; 705 prefetch_manager_ = NULL;
755 } 706 }
756 history_service_observer_.RemoveAll(); 707 history_service_observer_.RemoveAll();
757 } 708 }
758 709
759 void ResourcePrefetchPredictor::OnMainFrameRequest( 710 void ResourcePrefetchPredictor::OnMainFrameRequest(
760 const URLRequestSummary& request) { 711 const URLRequestSummary& request) {
761 DCHECK_CURRENTLY_ON(BrowserThread::UI); 712 DCHECK_CURRENTLY_ON(BrowserThread::UI);
762 DCHECK_EQ(INITIALIZED, initialization_state_); 713 DCHECK_EQ(INITIALIZED, initialization_state_);
763 714
764 const GURL& main_frame_url = request.navigation_id.main_frame_url;
765 StartPrefetching(main_frame_url, HintOrigin::NAVIGATION);
766
767 CleanupAbandonedNavigations(request.navigation_id); 715 CleanupAbandonedNavigations(request.navigation_id);
768 716
769 // New empty navigation entry. 717 // New empty navigation entry.
770 inflight_navigations_.insert( 718 const GURL& main_frame_url = request.navigation_id.main_frame_url;
771 std::make_pair(request.navigation_id, 719 inflight_navigations_.emplace(
772 base::MakeUnique<PageRequestSummary>(main_frame_url))); 720 request.navigation_id,
721 base::MakeUnique<PageRequestSummary>(main_frame_url));
773 } 722 }
774 723
775 void ResourcePrefetchPredictor::OnMainFrameResponse( 724 void ResourcePrefetchPredictor::OnMainFrameResponse(
776 const URLRequestSummary& response) { 725 const URLRequestSummary& response) {
777 DCHECK_CURRENTLY_ON(BrowserThread::UI); 726 DCHECK_CURRENTLY_ON(BrowserThread::UI);
778 DCHECK_EQ(INITIALIZED, initialization_state_); 727 DCHECK_EQ(INITIALIZED, initialization_state_);
779 728
780 NavigationMap::iterator nav_it = 729 auto nav_it = inflight_navigations_.find(response.navigation_id);
781 inflight_navigations_.find(response.navigation_id);
782 if (nav_it != inflight_navigations_.end()) { 730 if (nav_it != inflight_navigations_.end()) {
783 // To match an URL in StartPrefetching(). 731 // To match a URL in StartPrefetching().
784 StopPrefetching(nav_it->second->initial_url); 732 StopPrefetching(nav_it->second->initial_url);
alexilin 2017/05/23 11:01:39 Shouldn't we move StopPrefetching outside of Resou
Benoit L 2017/05/29 16:45:14 The unfortunate part is that without navigation tr
alexilin 2017/05/30 11:55:27 Answered in other comment. TL;DR Expose navigation
785 } else { 733 } else {
786 StopPrefetching(response.navigation_id.main_frame_url); 734 StopPrefetching(response.navigation_id.main_frame_url);
787 } 735 }
788 } 736 }
789 737
790 void ResourcePrefetchPredictor::OnMainFrameRedirect( 738 void ResourcePrefetchPredictor::OnMainFrameRedirect(
791 const URLRequestSummary& response) { 739 const URLRequestSummary& response) {
792 DCHECK_CURRENTLY_ON(BrowserThread::UI); 740 DCHECK_CURRENTLY_ON(BrowserThread::UI);
793 DCHECK_EQ(INITIALIZED, initialization_state_); 741 DCHECK_EQ(INITIALIZED, initialization_state_);
794 742
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 if (!history_service) 1786 if (!history_service)
1839 return; 1787 return;
1840 DCHECK(!history_service_observer_.IsObserving(history_service)); 1788 DCHECK(!history_service_observer_.IsObserving(history_service));
1841 history_service_observer_.Add(history_service); 1789 history_service_observer_.Add(history_service);
1842 if (history_service->BackendLoaded()) { 1790 if (history_service->BackendLoaded()) {
1843 // HistoryService is already loaded. Continue with Initialization. 1791 // HistoryService is already loaded. Continue with Initialization.
1844 OnHistoryAndCacheLoaded(); 1792 OnHistoryAndCacheLoaded();
1845 } 1793 }
1846 } 1794 }
1847 1795
1796 bool ResourcePrefetchPredictor::CanPrefetchUrlForOrigin(
1797 const GURL& url,
1798 HintOrigin origin) const {
1799 return prefetch_manager_.get() && // Prefetching not enabled.
1800 config_.IsPrefetchingEnabledForOrigin(profile_, origin) &&
alexilin 2017/05/23 11:01:38 I think the second condition is always true if the
Benoit L 2017/05/29 16:45:14 Nope, the first one is true if prefetching is enab
alexilin 2017/05/30 11:55:27 Yup, you're right. The following paragraph is jus
1801 IsUrlPrefetchable(url);
alexilin 2017/05/23 11:01:39 TODO: Look at the cost of IsUrlPrefetchable() meth
1802 }
1803
1804 void ResourcePrefetchPredictor::StartPrefetching(const GURL& url,
1805 HintOrigin origin) {
1806 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StartPrefetching", "url",
1807 url.spec());
1808 DCHECK(CanPrefetchUrlForOrigin(url, origin));
1809
1810 // Save prefetch start time to report prefetching duration.
1811 if (inflight_prefetches_.find(url) == inflight_prefetches_.end())
1812 inflight_prefetches_.emplace(url, base::TimeTicks::Now());
1813
1814 ResourcePrefetchPredictor::Prediction prediction;
1815 bool has_data = GetPrefetchData(url, &prediction);
1816 DCHECK(has_data);
1817
1818 BrowserThread::PostTask(
1819 BrowserThread::IO, FROM_HERE,
1820 base::BindOnce(&ResourcePrefetcherManager::MaybeAddPrefetch,
1821 prefetch_manager_, url, prediction.subresource_urls));
1822
1823 if (observer_)
1824 observer_->OnPrefetchingStarted(url);
1825 }
1826
1827 void ResourcePrefetchPredictor::StopPrefetching(const GURL& url) {
1828 TRACE_EVENT1("browser", "ResourcePrefetchPredictor::StopPrefetching", "url",
1829 url.spec());
1830 auto it = inflight_prefetches_.find(url);
1831 if (it != inflight_prefetches_.end()) {
1832 UMA_HISTOGRAM_TIMES(
1833 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram,
1834 base::TimeTicks::Now() - it->second);
1835 inflight_prefetches_.erase(it);
1836 }
1837 if (!prefetch_manager_.get()) // Not enabled.
1838 return;
1839
1840 BrowserThread::PostTask(
1841 BrowserThread::IO, FROM_HERE,
1842 base::BindOnce(&ResourcePrefetcherManager::MaybeRemovePrefetch,
1843 prefetch_manager_, url));
1844
1845 if (observer_)
1846 observer_->OnPrefetchingStopped(url);
1847 }
1848
1848 //////////////////////////////////////////////////////////////////////////////// 1849 ////////////////////////////////////////////////////////////////////////////////
1849 // TestObserver. 1850 // TestObserver.
1850 1851
1851 TestObserver::~TestObserver() { 1852 TestObserver::~TestObserver() {
1852 predictor_->SetObserverForTesting(nullptr); 1853 predictor_->SetObserverForTesting(nullptr);
1853 } 1854 }
1854 1855
1855 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) 1856 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor)
1856 : predictor_(predictor) { 1857 : predictor_(predictor) {
1857 predictor_->SetObserverForTesting(this); 1858 predictor_->SetObserverForTesting(this);
1858 } 1859 }
1859 1860
1860 } // namespace predictors 1861 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698