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

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

Issue 573553004: Eliminate NOTIFICATION_HISTORY_LOADED notification (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 6 years, 1 month 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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(
309 profile)->resource_prefetch_tables()), 309 profile)->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
321 ResourcePrefetchPredictor::~ResourcePrefetchPredictor() { 322 ResourcePrefetchPredictor::~ResourcePrefetchPredictor() {
322 } 323 }
323 324
324 void ResourcePrefetchPredictor::RecordURLRequest( 325 void ResourcePrefetchPredictor::RecordURLRequest(
325 const URLRequestSummary& request) { 326 const URLRequestSummary& request) {
326 DCHECK_CURRENTLY_ON(BrowserThread::UI); 327 DCHECK_CURRENTLY_ON(BrowserThread::UI);
327 if (initialization_state_ != INITIALIZED) 328 if (initialization_state_ != INITIALIZED)
328 return; 329 if (!CheckForHistoryService())
sdefresne 2014/10/30 17:37:04 Question: is it really required to insert all thos
nshaik 2014/10/30 21:48:36 I was trying to be extra careful which I think is
330 return;
329 331
330 CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME); 332 CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME);
331 OnMainFrameRequest(request); 333 OnMainFrameRequest(request);
332 } 334 }
333 335
334 void ResourcePrefetchPredictor::RecordURLResponse( 336 void ResourcePrefetchPredictor::RecordURLResponse(
335 const URLRequestSummary& response) { 337 const URLRequestSummary& response) {
336 DCHECK_CURRENTLY_ON(BrowserThread::UI); 338 DCHECK_CURRENTLY_ON(BrowserThread::UI);
337 if (initialization_state_ != INITIALIZED) 339 if (initialization_state_ != INITIALIZED)
338 return; 340 if (!CheckForHistoryService())
341 return;
339 342
340 if (response.resource_type == content::RESOURCE_TYPE_MAIN_FRAME) 343 if (response.resource_type == content::RESOURCE_TYPE_MAIN_FRAME)
341 OnMainFrameResponse(response); 344 OnMainFrameResponse(response);
342 else 345 else
343 OnSubresourceResponse(response); 346 OnSubresourceResponse(response);
344 } 347 }
345 348
346 void ResourcePrefetchPredictor::RecordURLRedirect( 349 void ResourcePrefetchPredictor::RecordURLRedirect(
347 const URLRequestSummary& response) { 350 const URLRequestSummary& response) {
348 DCHECK_CURRENTLY_ON(BrowserThread::UI); 351 DCHECK_CURRENTLY_ON(BrowserThread::UI);
349 if (initialization_state_ != INITIALIZED) 352 if (initialization_state_ != INITIALIZED)
350 return; 353 if (!CheckForHistoryService())
354 return;
351 355
352 CHECK_EQ(response.resource_type, content::RESOURCE_TYPE_MAIN_FRAME); 356 CHECK_EQ(response.resource_type, content::RESOURCE_TYPE_MAIN_FRAME);
353 OnMainFrameRedirect(response); 357 OnMainFrameRedirect(response);
354 } 358 }
355 359
356 void ResourcePrefetchPredictor::RecordMainFrameLoadComplete( 360 void ResourcePrefetchPredictor::RecordMainFrameLoadComplete(
357 const NavigationID& navigation_id) { 361 const NavigationID& navigation_id) {
358 switch (initialization_state_) { 362 switch (initialization_state_) {
359 case NOT_INITIALIZED: 363 case NOT_INITIALIZED:
360 StartInitialization(); 364 StartInitialization();
(...skipping 30 matching lines...) Expand all
391 } 395 }
392 } 396 }
393 397
394 void ResourcePrefetchPredictor::Observe( 398 void ResourcePrefetchPredictor::Observe(
395 int type, 399 int type,
396 const content::NotificationSource& source, 400 const content::NotificationSource& source,
397 const content::NotificationDetails& details) { 401 const content::NotificationDetails& details) {
398 DCHECK_CURRENTLY_ON(BrowserThread::UI); 402 DCHECK_CURRENTLY_ON(BrowserThread::UI);
399 403
400 switch (type) { 404 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: { 405 case chrome::NOTIFICATION_HISTORY_URLS_DELETED: {
411 DCHECK_EQ(initialization_state_, INITIALIZED); 406 DCHECK_EQ(initialization_state_, INITIALIZED);
412 const content::Details<const history::URLsDeletedDetails> 407 const content::Details<const history::URLsDeletedDetails>
413 urls_deleted_details = 408 urls_deleted_details =
414 content::Details<const history::URLsDeletedDetails>(details); 409 content::Details<const history::URLsDeletedDetails>(details);
415 if (urls_deleted_details->all_history) { 410 if (urls_deleted_details->all_history) {
416 DeleteAllUrls(); 411 DeleteAllUrls();
417 UMA_HISTOGRAM_ENUMERATION("ResourcePrefetchPredictor.ReportingEvent", 412 UMA_HISTOGRAM_ENUMERATION("ResourcePrefetchPredictor.ReportingEvent",
418 REPORTING_EVENT_ALL_HISTORY_CLEARED, 413 REPORTING_EVENT_ALL_HISTORY_CLEARED,
419 REPORTING_EVENT_COUNT); 414 REPORTING_EVENT_COUNT);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 // New empty navigation entry. 449 // New empty navigation entry.
455 inflight_navigations_.insert(std::make_pair( 450 inflight_navigations_.insert(std::make_pair(
456 request.navigation_id, 451 request.navigation_id,
457 make_linked_ptr(new std::vector<URLRequestSummary>()))); 452 make_linked_ptr(new std::vector<URLRequestSummary>())));
458 } 453 }
459 454
460 void ResourcePrefetchPredictor::OnMainFrameResponse( 455 void ResourcePrefetchPredictor::OnMainFrameResponse(
461 const URLRequestSummary& response) { 456 const URLRequestSummary& response) {
462 DCHECK_CURRENTLY_ON(BrowserThread::UI); 457 DCHECK_CURRENTLY_ON(BrowserThread::UI);
463 if (initialization_state_ != INITIALIZED) 458 if (initialization_state_ != INITIALIZED)
464 return; 459 if (!CheckForHistoryService())
460 return;
465 461
466 RecordNavigationEvent(NAVIGATION_EVENT_RESPONSE_STARTED); 462 RecordNavigationEvent(NAVIGATION_EVENT_RESPONSE_STARTED);
467 463
468 StopPrefetching(response.navigation_id); 464 StopPrefetching(response.navigation_id);
469 } 465 }
470 466
471 void ResourcePrefetchPredictor::OnMainFrameRedirect( 467 void ResourcePrefetchPredictor::OnMainFrameRedirect(
472 const URLRequestSummary& response) { 468 const URLRequestSummary& response) {
473 DCHECK_CURRENTLY_ON(BrowserThread::UI); 469 DCHECK_CURRENTLY_ON(BrowserThread::UI);
474 470
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 DCHECK(inflight_navigations_.empty()); 683 DCHECK(inflight_navigations_.empty());
688 684
689 url_table_cache_.reset(url_data_map.release()); 685 url_table_cache_.reset(url_data_map.release());
690 host_table_cache_.reset(host_data_map.release()); 686 host_table_cache_.reset(host_data_map.release());
691 687
692 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableMainFrameUrlCount", 688 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableMainFrameUrlCount",
693 url_table_cache_->size()); 689 url_table_cache_->size());
694 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableHostCount", 690 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableHostCount",
695 host_table_cache_->size()); 691 host_table_cache_->size());
696 692
697 // Add notifications for history loading if it is not ready. 693 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 } 694 }
707 695
708 void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() { 696 void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() {
709 DCHECK_CURRENTLY_ON(BrowserThread::UI); 697 DCHECK_CURRENTLY_ON(BrowserThread::UI);
710 DCHECK_EQ(initialization_state_, INITIALIZING); 698 DCHECK_EQ(initialization_state_, INITIALIZING);
711 699
712 notification_registrar_.Add(this, 700 notification_registrar_.Add(this,
713 chrome::NOTIFICATION_HISTORY_URLS_DELETED, 701 chrome::NOTIFICATION_HISTORY_URLS_DELETED,
714 content::Source<Profile>(profile_)); 702 content::Source<Profile>(profile_));
715 703
716 // Initialize the prefetch manager only if prefetching is enabled. 704 // Initialize the prefetch manager only if prefetching is enabled.
717 if (config_.IsPrefetchingEnabled(profile_)) { 705 if (config_.IsPrefetchingEnabled(profile_)) {
718 prefetch_manager_ = new ResourcePrefetcherManager( 706 prefetch_manager_ = new ResourcePrefetcherManager(
719 this, config_, profile_->GetRequestContext()); 707 this, config_, profile_->GetRequestContext());
720 } 708 }
721 709
710 history_service_observer_.RemoveAll();
722 initialization_state_ = INITIALIZED; 711 initialization_state_ = INITIALIZED;
723 } 712 }
724 713
725 void ResourcePrefetchPredictor::CleanupAbandonedNavigations( 714 void ResourcePrefetchPredictor::CleanupAbandonedNavigations(
726 const NavigationID& navigation_id) { 715 const NavigationID& navigation_id) {
727 static const base::TimeDelta max_navigation_age = 716 static const base::TimeDelta max_navigation_age =
728 base::TimeDelta::FromSeconds(config_.max_navigation_lifetime_seconds); 717 base::TimeDelta::FromSeconds(config_.max_navigation_lifetime_seconds);
729 718
730 base::TimeTicks time_now = base::TimeTicks::Now(); 719 base::TimeTicks time_now = base::TimeTicks::Now();
731 for (NavigationMap::iterator it = inflight_navigations_.begin(); 720 for (NavigationMap::iterator it = inflight_navigations_.begin();
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 if (total_resources_fetched_from_network > 0) { 1203 if (total_resources_fetched_from_network > 0) {
1215 RPP_PREDICTED_HISTOGRAM_PERCENTAGE( 1204 RPP_PREDICTED_HISTOGRAM_PERCENTAGE(
1216 "PrefetchFromNetworkPercentOfTotalFromNetwork", 1205 "PrefetchFromNetworkPercentOfTotalFromNetwork",
1217 prefetch_network * 100.0 / total_resources_fetched_from_network); 1206 prefetch_network * 100.0 / total_resources_fetched_from_network);
1218 } 1207 }
1219 1208
1220 #undef RPP_PREDICTED_HISTOGRAM_PERCENTAGE 1209 #undef RPP_PREDICTED_HISTOGRAM_PERCENTAGE
1221 #undef RPP_PREDICTED_HISTOGRAM_COUNTS 1210 #undef RPP_PREDICTED_HISTOGRAM_COUNTS
1222 } 1211 }
1223 1212
1213 bool ResourcePrefetchPredictor::CheckForHistoryService() {
1214 if (initialization_state_ == INITIALIZED)
1215 return true;
1216
1217 // Register for HistoryServiceLoading if it is not ready.
1218 HistoryService* history_service = HistoryServiceFactory::GetForProfile(
1219 profile_, Profile::EXPLICIT_ACCESS);
1220 if (history_service && history_service->BackendLoaded()) {
1221 // HistoryService is already loaded. Continue with Initialization.
1222 OnHistoryAndCacheLoaded();
1223 return true;
1224 } else if (history_service &&
1225 !history_service_observer_.IsObserving(history_service)) {
1226 history_service_observer_.Add(history_service);
1227 }
1228 return false;
1229 }
1230
1231 void ResourcePrefetchPredictor::OnHistoryServiceLoaded(
1232 HistoryService* history_service) {
1233 OnHistoryAndCacheLoaded();
1234 history_service_observer_.Remove(history_service);
1235 }
1236
1224 } // namespace predictors 1237 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698