OLD | NEW |
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 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 | 298 |
299 //////////////////////////////////////////////////////////////////////////////// | 299 //////////////////////////////////////////////////////////////////////////////// |
300 // ResourcePrefetchPredictor. | 300 // ResourcePrefetchPredictor. |
301 | 301 |
302 ResourcePrefetchPredictor::ResourcePrefetchPredictor( | 302 ResourcePrefetchPredictor::ResourcePrefetchPredictor( |
303 const ResourcePrefetchPredictorConfig& config, | 303 const ResourcePrefetchPredictorConfig& config, |
304 Profile* profile) | 304 Profile* profile) |
305 : profile_(profile), | 305 : profile_(profile), |
306 config_(config), | 306 config_(config), |
307 initialization_state_(NOT_INITIALIZED), | 307 initialization_state_(NOT_INITIALIZED), |
308 tables_(PredictorDatabaseFactory::GetForProfile( | 308 tables_(PredictorDatabaseFactory::GetForProfile(profile) |
309 profile)->resource_prefetch_tables()), | 309 ->resource_prefetch_tables()), |
310 results_map_deleter_(&results_map_) { | 310 results_map_deleter_(&results_map_), |
| 311 history_service_observer_(this) { |
311 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 312 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
312 | 313 |
313 // Some form of learning has to be enabled. | 314 // Some form of learning has to be enabled. |
314 DCHECK(config_.IsLearningEnabled()); | 315 DCHECK(config_.IsLearningEnabled()); |
315 if (config_.IsURLPrefetchingEnabled(profile_)) | 316 if (config_.IsURLPrefetchingEnabled(profile_)) |
316 DCHECK(config_.IsURLLearningEnabled()); | 317 DCHECK(config_.IsURLLearningEnabled()); |
317 if (config_.IsHostPrefetchingEnabled(profile_)) | 318 if (config_.IsHostPrefetchingEnabled(profile_)) |
318 DCHECK(config_.IsHostLearningEnabled()); | 319 DCHECK(config_.IsHostLearningEnabled()); |
319 } | 320 } |
320 | 321 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 } | 392 } |
392 } | 393 } |
393 | 394 |
394 void ResourcePrefetchPredictor::Observe( | 395 void ResourcePrefetchPredictor::Observe( |
395 int type, | 396 int type, |
396 const content::NotificationSource& source, | 397 const content::NotificationSource& source, |
397 const content::NotificationDetails& details) { | 398 const content::NotificationDetails& details) { |
398 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 399 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
399 | 400 |
400 switch (type) { | 401 switch (type) { |
401 case chrome::NOTIFICATION_HISTORY_LOADED: { | |
402 DCHECK_EQ(initialization_state_, INITIALIZING); | |
403 notification_registrar_.Remove(this, | |
404 chrome::NOTIFICATION_HISTORY_LOADED, | |
405 content::Source<Profile>(profile_)); | |
406 OnHistoryAndCacheLoaded(); | |
407 break; | |
408 } | |
409 | |
410 case chrome::NOTIFICATION_HISTORY_URLS_DELETED: { | 402 case chrome::NOTIFICATION_HISTORY_URLS_DELETED: { |
411 DCHECK_EQ(initialization_state_, INITIALIZED); | 403 DCHECK_EQ(initialization_state_, INITIALIZED); |
412 const content::Details<const history::URLsDeletedDetails> | 404 const content::Details<const history::URLsDeletedDetails> |
413 urls_deleted_details = | 405 urls_deleted_details = |
414 content::Details<const history::URLsDeletedDetails>(details); | 406 content::Details<const history::URLsDeletedDetails>(details); |
415 if (urls_deleted_details->all_history) { | 407 if (urls_deleted_details->all_history) { |
416 DeleteAllUrls(); | 408 DeleteAllUrls(); |
417 UMA_HISTOGRAM_ENUMERATION("ResourcePrefetchPredictor.ReportingEvent", | 409 UMA_HISTOGRAM_ENUMERATION("ResourcePrefetchPredictor.ReportingEvent", |
418 REPORTING_EVENT_ALL_HISTORY_CLEARED, | 410 REPORTING_EVENT_ALL_HISTORY_CLEARED, |
419 REPORTING_EVENT_COUNT); | 411 REPORTING_EVENT_COUNT); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 DCHECK(inflight_navigations_.empty()); | 679 DCHECK(inflight_navigations_.empty()); |
688 | 680 |
689 url_table_cache_.reset(url_data_map.release()); | 681 url_table_cache_.reset(url_data_map.release()); |
690 host_table_cache_.reset(host_data_map.release()); | 682 host_table_cache_.reset(host_data_map.release()); |
691 | 683 |
692 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableMainFrameUrlCount", | 684 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableMainFrameUrlCount", |
693 url_table_cache_->size()); | 685 url_table_cache_->size()); |
694 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableHostCount", | 686 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableHostCount", |
695 host_table_cache_->size()); | 687 host_table_cache_->size()); |
696 | 688 |
697 // Add notifications for history loading if it is not ready. | 689 CheckForHistoryService(); |
698 HistoryService* history_service = HistoryServiceFactory::GetForProfile( | |
699 profile_, Profile::EXPLICIT_ACCESS); | |
700 if (!history_service) { | |
701 notification_registrar_.Add(this, chrome::NOTIFICATION_HISTORY_LOADED, | |
702 content::Source<Profile>(profile_)); | |
703 } else { | |
704 OnHistoryAndCacheLoaded(); | |
705 } | |
706 } | 690 } |
707 | 691 |
708 void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() { | 692 void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() { |
709 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 693 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
710 DCHECK_EQ(initialization_state_, INITIALIZING); | 694 DCHECK_EQ(initialization_state_, INITIALIZING); |
711 | 695 |
712 notification_registrar_.Add(this, | 696 notification_registrar_.Add(this, |
713 chrome::NOTIFICATION_HISTORY_URLS_DELETED, | 697 chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
714 content::Source<Profile>(profile_)); | 698 content::Source<Profile>(profile_)); |
715 | 699 |
716 // Initialize the prefetch manager only if prefetching is enabled. | 700 // Initialize the prefetch manager only if prefetching is enabled. |
717 if (config_.IsPrefetchingEnabled(profile_)) { | 701 if (config_.IsPrefetchingEnabled(profile_)) { |
718 prefetch_manager_ = new ResourcePrefetcherManager( | 702 prefetch_manager_ = new ResourcePrefetcherManager( |
719 this, config_, profile_->GetRequestContext()); | 703 this, config_, profile_->GetRequestContext()); |
720 } | 704 } |
721 | 705 |
| 706 history_service_observer_.RemoveAll(); |
722 initialization_state_ = INITIALIZED; | 707 initialization_state_ = INITIALIZED; |
723 } | 708 } |
724 | 709 |
725 void ResourcePrefetchPredictor::CleanupAbandonedNavigations( | 710 void ResourcePrefetchPredictor::CleanupAbandonedNavigations( |
726 const NavigationID& navigation_id) { | 711 const NavigationID& navigation_id) { |
727 static const base::TimeDelta max_navigation_age = | 712 static const base::TimeDelta max_navigation_age = |
728 base::TimeDelta::FromSeconds(config_.max_navigation_lifetime_seconds); | 713 base::TimeDelta::FromSeconds(config_.max_navigation_lifetime_seconds); |
729 | 714 |
730 base::TimeTicks time_now = base::TimeTicks::Now(); | 715 base::TimeTicks time_now = base::TimeTicks::Now(); |
731 for (NavigationMap::iterator it = inflight_navigations_.begin(); | 716 for (NavigationMap::iterator it = inflight_navigations_.begin(); |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1214 if (total_resources_fetched_from_network > 0) { | 1199 if (total_resources_fetched_from_network > 0) { |
1215 RPP_PREDICTED_HISTOGRAM_PERCENTAGE( | 1200 RPP_PREDICTED_HISTOGRAM_PERCENTAGE( |
1216 "PrefetchFromNetworkPercentOfTotalFromNetwork", | 1201 "PrefetchFromNetworkPercentOfTotalFromNetwork", |
1217 prefetch_network * 100.0 / total_resources_fetched_from_network); | 1202 prefetch_network * 100.0 / total_resources_fetched_from_network); |
1218 } | 1203 } |
1219 | 1204 |
1220 #undef RPP_PREDICTED_HISTOGRAM_PERCENTAGE | 1205 #undef RPP_PREDICTED_HISTOGRAM_PERCENTAGE |
1221 #undef RPP_PREDICTED_HISTOGRAM_COUNTS | 1206 #undef RPP_PREDICTED_HISTOGRAM_COUNTS |
1222 } | 1207 } |
1223 | 1208 |
| 1209 void ResourcePrefetchPredictor::CheckForHistoryService() { |
| 1210 // Register for HistoryServiceLoading if it is not ready. |
| 1211 HistoryService* history_service = |
| 1212 HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS); |
| 1213 if (!history_service) |
| 1214 return; |
| 1215 if (history_service->BackendLoaded()) { |
| 1216 // HistoryService is already loaded. Continue with Initialization. |
| 1217 OnHistoryAndCacheLoaded(); |
| 1218 return; |
| 1219 } |
| 1220 DCHECK(!history_service_observer_.IsObserving(history_service)); |
| 1221 history_service_observer_.Add(history_service); |
| 1222 return; |
| 1223 } |
| 1224 |
| 1225 void ResourcePrefetchPredictor::OnHistoryServiceLoaded( |
| 1226 HistoryService* history_service) { |
| 1227 OnHistoryAndCacheLoaded(); |
| 1228 history_service_observer_.Remove(history_service); |
| 1229 } |
| 1230 |
1224 } // namespace predictors | 1231 } // namespace predictors |
OLD | NEW |