Chromium Code Reviews| Index: chrome/browser/predictors/resource_prefetch_predictor.cc |
| diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc |
| index 878113d3faa552f34d35eb178acd072970c99778..ea1bd3e1732b0320b9e22f5e247d5911a081b585 100644 |
| --- a/chrome/browser/predictors/resource_prefetch_predictor.cc |
| +++ b/chrome/browser/predictors/resource_prefetch_predictor.cc |
| @@ -307,7 +307,8 @@ ResourcePrefetchPredictor::ResourcePrefetchPredictor( |
| initialization_state_(NOT_INITIALIZED), |
| tables_(PredictorDatabaseFactory::GetForProfile( |
| profile)->resource_prefetch_tables()), |
| - results_map_deleter_(&results_map_) { |
| + results_map_deleter_(&results_map_), |
| + history_service_observer_(this) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| // Some form of learning has to be enabled. |
| @@ -325,7 +326,8 @@ void ResourcePrefetchPredictor::RecordURLRequest( |
| const URLRequestSummary& request) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| if (initialization_state_ != INITIALIZED) |
| - return; |
| + 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
|
| + return; |
| CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME); |
| OnMainFrameRequest(request); |
| @@ -335,7 +337,8 @@ void ResourcePrefetchPredictor::RecordURLResponse( |
| const URLRequestSummary& response) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| if (initialization_state_ != INITIALIZED) |
| - return; |
| + if (!CheckForHistoryService()) |
| + return; |
| if (response.resource_type == content::RESOURCE_TYPE_MAIN_FRAME) |
| OnMainFrameResponse(response); |
| @@ -347,7 +350,8 @@ void ResourcePrefetchPredictor::RecordURLRedirect( |
| const URLRequestSummary& response) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| if (initialization_state_ != INITIALIZED) |
| - return; |
| + if (!CheckForHistoryService()) |
| + return; |
| CHECK_EQ(response.resource_type, content::RESOURCE_TYPE_MAIN_FRAME); |
| OnMainFrameRedirect(response); |
| @@ -398,15 +402,6 @@ void ResourcePrefetchPredictor::Observe( |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| switch (type) { |
| - case chrome::NOTIFICATION_HISTORY_LOADED: { |
| - DCHECK_EQ(initialization_state_, INITIALIZING); |
| - notification_registrar_.Remove(this, |
| - chrome::NOTIFICATION_HISTORY_LOADED, |
| - content::Source<Profile>(profile_)); |
| - OnHistoryAndCacheLoaded(); |
| - break; |
| - } |
| - |
| case chrome::NOTIFICATION_HISTORY_URLS_DELETED: { |
| DCHECK_EQ(initialization_state_, INITIALIZED); |
| const content::Details<const history::URLsDeletedDetails> |
| @@ -461,7 +456,8 @@ void ResourcePrefetchPredictor::OnMainFrameResponse( |
| const URLRequestSummary& response) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| if (initialization_state_ != INITIALIZED) |
| - return; |
| + if (!CheckForHistoryService()) |
| + return; |
| RecordNavigationEvent(NAVIGATION_EVENT_RESPONSE_STARTED); |
| @@ -694,15 +690,7 @@ void ResourcePrefetchPredictor::CreateCaches( |
| UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableHostCount", |
| host_table_cache_->size()); |
| - // Add notifications for history loading if it is not ready. |
| - HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
| - profile_, Profile::EXPLICIT_ACCESS); |
| - if (!history_service) { |
| - notification_registrar_.Add(this, chrome::NOTIFICATION_HISTORY_LOADED, |
| - content::Source<Profile>(profile_)); |
| - } else { |
| - OnHistoryAndCacheLoaded(); |
| - } |
| + CheckForHistoryService(); |
| } |
| void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() { |
| @@ -719,6 +707,7 @@ void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() { |
| this, config_, profile_->GetRequestContext()); |
| } |
| + history_service_observer_.RemoveAll(); |
| initialization_state_ = INITIALIZED; |
| } |
| @@ -1221,4 +1210,28 @@ void ResourcePrefetchPredictor::ReportPredictedAccuracyStatsHelper( |
| #undef RPP_PREDICTED_HISTOGRAM_COUNTS |
| } |
| +bool ResourcePrefetchPredictor::CheckForHistoryService() { |
| + if (initialization_state_ == INITIALIZED) |
| + return true; |
| + |
| + // Register for HistoryServiceLoading if it is not ready. |
| + HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
| + profile_, Profile::EXPLICIT_ACCESS); |
| + if (history_service && history_service->BackendLoaded()) { |
| + // HistoryService is already loaded. Continue with Initialization. |
| + OnHistoryAndCacheLoaded(); |
| + return true; |
| + } else if (history_service && |
| + !history_service_observer_.IsObserving(history_service)) { |
| + history_service_observer_.Add(history_service); |
| + } |
| + return false; |
| +} |
| + |
| +void ResourcePrefetchPredictor::OnHistoryServiceLoaded( |
| + HistoryService* history_service) { |
| + OnHistoryAndCacheLoaded(); |
| + history_service_observer_.Remove(history_service); |
| +} |
| + |
| } // namespace predictors |