Index: components/suggestions/suggestions_service_impl.cc |
diff --git a/components/suggestions/suggestions_service_impl.cc b/components/suggestions/suggestions_service_impl.cc |
index 5a013c8a58481ec29d51c111e457db7cafddd446..407ad4564cff67adc2b0a4960920c1b372b88cfd 100644 |
--- a/components/suggestions/suggestions_service_impl.cc |
+++ b/components/suggestions/suggestions_service_impl.cc |
@@ -180,6 +180,8 @@ void SuggestionsServiceImpl::GetPageThumbnailWithURL( |
bool SuggestionsServiceImpl::BlacklistURL(const GURL& candidate_url) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ // TODO(treib): Do we need to check |sync_state_| here? |
+ |
if (!blacklist_store_->BlacklistUrl(candidate_url)) |
return false; |
@@ -196,6 +198,9 @@ bool SuggestionsServiceImpl::BlacklistURL(const GURL& candidate_url) { |
bool SuggestionsServiceImpl::UndoBlacklistURL(const GURL& url) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // TODO(treib): Do we need to check |sync_state_| here? |
+ |
TimeDelta time_delta; |
if (blacklist_store_->GetTimeUntilURLReadyForUpload(url, &time_delta) && |
time_delta > TimeDelta::FromSeconds(0) && |
@@ -211,6 +216,9 @@ bool SuggestionsServiceImpl::UndoBlacklistURL(const GURL& url) { |
void SuggestionsServiceImpl::ClearBlacklist() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ // TODO(treib): Do we need to check |sync_state_| here? |
+ |
blacklist_store_->ClearBlacklist(); |
callback_list_.Notify( |
GetSuggestionsDataFromCache().value_or(SuggestionsProfile())); |
@@ -287,37 +295,49 @@ SuggestionsServiceImpl::SyncState SuggestionsServiceImpl::ComputeSyncState() |
: SYNC_OR_HISTORY_SYNC_DISABLED; |
} |
-bool SuggestionsServiceImpl::RefreshSyncState() { |
+SuggestionsServiceImpl::RefreshAction |
+SuggestionsServiceImpl::RefreshSyncState() { |
SyncState new_sync_state = ComputeSyncState(); |
if (sync_state_ == new_sync_state) { |
- return false; |
+ return NO_ACTION; |
} |
+ |
+ SyncState old_sync_state = sync_state_; |
sync_state_ = new_sync_state; |
- return true; |
+ |
+ switch (new_sync_state) { |
+ case NOT_INITIALIZED_ENABLED: |
+ break; |
+ case INITIALIZED_ENABLED_HISTORY: |
+ // If the user just signed in, we fetch suggestions, so that hopefully the |
+ // next NTP will already get them. |
+ if (old_sync_state == SYNC_OR_HISTORY_SYNC_DISABLED) { |
+ return FETCH_SUGGESTIONS; |
+ } |
+ break; |
+ case SYNC_OR_HISTORY_SYNC_DISABLED: |
+ // If the user signed out (or disabled history sync), we have to clear |
+ // everything. |
+ return CLEAR_SUGGESTIONS; |
+ } |
+ // Otherwise, there's nothing to do. |
+ return NO_ACTION; |
} |
void SuggestionsServiceImpl::OnStateChanged(syncer::SyncService* sync) { |
DCHECK(sync_service_ == sync); |
- if (!RefreshSyncState()) { |
- return; |
- } |
- |
- switch (sync_state_) { |
- case SYNC_OR_HISTORY_SYNC_DISABLED: |
+ switch (RefreshSyncState()) { |
+ case NO_ACTION: |
+ break; |
+ case CLEAR_SUGGESTIONS: |
// Cancel any ongoing request, to stop interacting with the server. |
pending_request_.reset(nullptr); |
suggestions_store_->ClearSuggestions(); |
callback_list_.Notify(SuggestionsProfile()); |
break; |
- case NOT_INITIALIZED_ENABLED: |
- // Keep the cache (if any), but don't refresh. |
- break; |
- case INITIALIZED_ENABLED_HISTORY: |
- // If we have any observers, issue a network request to refresh the |
- // suggestions in the cache. |
- if (!callback_list_.empty()) |
- IssueRequestIfNoneOngoing(BuildSuggestionsURL()); |
+ case FETCH_SUGGESTIONS: |
+ IssueRequestIfNoneOngoing(BuildSuggestionsURL()); |
break; |
} |
} |
@@ -337,6 +357,10 @@ void SuggestionsServiceImpl::SetDefaultExpiryTimestamp( |
void SuggestionsServiceImpl::IssueRequestIfNoneOngoing(const GURL& url) { |
// If there is an ongoing request, let it complete. |
+ // This will silently swallow blacklist and clearblacklist requests if a |
+ // request happens to be ongoing. |
+ // TODO(treib): Queue such requests and send them after the current one |
+ // completes. |
if (pending_request_.get()) { |
return; |
} |