Chromium Code Reviews| Index: components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc |
| diff --git a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc |
| index 4b5a0e10b420a73bc834ea12d68efcf182a5c50e..1d0bd9f48627fe5d1114e9c40d6bc87c5fa4fe50 100644 |
| --- a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc |
| +++ b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc |
| @@ -31,23 +31,27 @@ namespace { |
| // The FetchingInterval enum specifies overlapping time intervals that are used |
| // for scheduling the next remote suggestion fetch. Therefore a timer is created |
| // for each interval. Initially all the timers are started at the same time. |
| -// Fetches are only performed when conditions associated with the intervals are |
| -// met: |
| -// - A "soft" fetch is performed only at a moment when the user actively uses |
| -// Chrome after the interval has elapsed and causes a trigger that is currently |
| -// enabled while |
| -// - a "persistent" fetch is initiated automatically by the OS after the |
| -// interval elapses. |
| -// - A "wifi" fetch is performed only when the user is on a connection that |
| -// the OS classifies as unmetered while |
| -// - a "fallback" fetch happens on any connection. |
| +// A fetch for a given interval is only performed at the moment (after the |
| +// interval has elapsed) when the combination of two conditions associated with |
| +// the interval is met. |
| +// 1. Trigger contidion: |
| +// - STARTUP_*: the user starts / switches to Chrome; |
| +// - SHOWN_*: the suggestions surface is shown to the user; |
| +// - PERSISTENT_*: the OS initiates the scheduled fetching task (which has |
| +// been scheduled according to this interval). |
| +// 2. Connectivity condition: |
| +// - *_WIFI: the user is on a connection that the OS classifies as unmetered; |
| +// - *_FALLBACK: holds for any functional internet connection. |
| +// |
| // If a fetch failed, then only the corresponding timer is reset. The other |
| // timers are not touched. |
| enum class FetchingInterval { |
| PERSISTENT_FALLBACK, |
| PERSISTENT_WIFI, |
| - SOFT_FALLBACK, |
| - SOFT_WIFI, |
| + STARTUP_FALLBACK, |
| + STARTUP_WIFI, |
| + SHOWN_FALLBACK, |
| + SHOWN_WIFI, |
| COUNT |
| }; |
| @@ -57,28 +61,36 @@ enum class FetchingInterval { |
| // The values of each array specify a default time interval for the intervals |
| // defined by the enum FetchingInterval. The default time intervals defined in |
| // the arrays can be overridden using different variation parameters. |
| -const double kDefaultFetchingIntervalHoursRareNtpUser[] = {48.0, 24.0, 8.0, |
| - 4.0}; |
| -const double kDefaultFetchingIntervalHoursActiveNtpUser[] = {24.0, 8.0, 6.0, |
| - 3.0}; |
| +const double kDefaultFetchingIntervalHoursRareNtpUser[] = {48.0, 24.0, 48.0, |
| + 24.0, 8.0, 4.0}; |
|
markusheintz_
2017/05/16 12:04:57
Please remove the space before te 4.0
jkrcal
2017/05/16 12:31:02
Huh, I am surprised that I haven't fixed it last t
|
| +const double kDefaultFetchingIntervalHoursActiveNtpUser[] = {24.0, 8.0, 24.0, |
| + 8.0, 6.0, 3.0}; |
| const double kDefaultFetchingIntervalHoursActiveSuggestionsConsumer[] = { |
| - 24.0, 6.0, 2.0, 1.0}; |
| + 24.0, 6.0, 24.0, 6.0, 2.0, 1.0}; |
| // Variation parameters than can be used to override the default fetching |
| -// intervals. |
| +// intervals. For backwards compatibility, we do not rename |
| +// - the "fetching_" params (should be "persistent_fetching_"); |
| +// - the "soft_" params (should be "shown_"). |
| const char* kFetchingIntervalParamNameRareNtpUser[] = { |
| "fetching_interval_hours-fallback-rare_ntp_user", |
| "fetching_interval_hours-wifi-rare_ntp_user", |
| + "startup_fetching_interval_hours-fallback-rare_ntp_user", |
| + "startup_fetching_interval_hours-wifi-rare_ntp_user", |
| "soft_fetching_interval_hours-fallback-rare_ntp_user", |
| "soft_fetching_interval_hours-wifi-rare_ntp_user"}; |
| const char* kFetchingIntervalParamNameActiveNtpUser[] = { |
| "fetching_interval_hours-fallback-active_ntp_user", |
| "fetching_interval_hours-wifi-active_ntp_user", |
| + "startup_fetching_interval_hours-fallback-active_ntp_user", |
| + "startup_fetching_interval_hours-wifi-active_ntp_user", |
| "soft_fetching_interval_hours-fallback-active_ntp_user", |
| "soft_fetching_interval_hours-wifi-active_ntp_user"}; |
| const char* kFetchingIntervalParamNameActiveSuggestionsConsumer[] = { |
| "fetching_interval_hours-fallback-active_suggestions_consumer", |
| "fetching_interval_hours-wifi-active_suggestions_consumer", |
| + "startup_fetching_interval_hours-fallback-active_suggestions_consumer", |
| + "startup_fetching_interval_hours-wifi-active_suggestions_consumer", |
| "soft_fetching_interval_hours-fallback-active_suggestions_consumer", |
| "soft_fetching_interval_hours-wifi-active_suggestions_consumer"}; |
| @@ -174,14 +186,14 @@ void ReportTimeUntilFirstSoftTrigger(UserClassifier::UserClass user_class, |
| } |
| } |
| -void ReportTimeUntilSoftFetch(UserClassifier::UserClass user_class, |
| - base::TimeDelta time_until_soft_fetch) { |
| +void ReportTimeUntilShownFetch(UserClassifier::UserClass user_class, |
| + base::TimeDelta time_until_shown_fetch) { |
| switch (user_class) { |
| case UserClassifier::UserClass::RARE_NTP_USER: |
| UMA_HISTOGRAM_CUSTOM_TIMES( |
| "NewTabPage.ContentSuggestions.TimeUntilSoftFetch." |
| "RareNTPUser", |
| - time_until_soft_fetch, base::TimeDelta::FromSeconds(1), |
| + time_until_shown_fetch, base::TimeDelta::FromSeconds(1), |
| base::TimeDelta::FromDays(7), |
| /*bucket_count=*/50); |
| break; |
| @@ -189,7 +201,7 @@ void ReportTimeUntilSoftFetch(UserClassifier::UserClass user_class, |
| UMA_HISTOGRAM_CUSTOM_TIMES( |
| "NewTabPage.ContentSuggestions.TimeUntilSoftFetch." |
| "ActiveNTPUser", |
| - time_until_soft_fetch, base::TimeDelta::FromSeconds(1), |
| + time_until_shown_fetch, base::TimeDelta::FromSeconds(1), |
| base::TimeDelta::FromDays(7), |
| /*bucket_count=*/50); |
| break; |
| @@ -197,7 +209,37 @@ void ReportTimeUntilSoftFetch(UserClassifier::UserClass user_class, |
| UMA_HISTOGRAM_CUSTOM_TIMES( |
| "NewTabPage.ContentSuggestions.TimeUntilSoftFetch." |
| "ActiveSuggestionsConsumer", |
| - time_until_soft_fetch, base::TimeDelta::FromSeconds(1), |
| + time_until_shown_fetch, base::TimeDelta::FromSeconds(1), |
| + base::TimeDelta::FromDays(7), |
| + /*bucket_count=*/50); |
| + break; |
| + } |
| +} |
| + |
| +void ReportTimeUntilStartupFetch(UserClassifier::UserClass user_class, |
| + base::TimeDelta time_until_startup_fetch) { |
| + switch (user_class) { |
| + case UserClassifier::UserClass::RARE_NTP_USER: |
| + UMA_HISTOGRAM_CUSTOM_TIMES( |
| + "NewTabPage.ContentSuggestions.TimeUntilStartupFetch." |
| + "RareNTPUser", |
| + time_until_startup_fetch, base::TimeDelta::FromSeconds(1), |
| + base::TimeDelta::FromDays(7), |
| + /*bucket_count=*/50); |
| + break; |
| + case UserClassifier::UserClass::ACTIVE_NTP_USER: |
| + UMA_HISTOGRAM_CUSTOM_TIMES( |
| + "NewTabPage.ContentSuggestions.TimeUntilStartupFetch." |
| + "ActiveNTPUser", |
| + time_until_startup_fetch, base::TimeDelta::FromSeconds(1), |
| + base::TimeDelta::FromDays(7), |
| + /*bucket_count=*/50); |
| + break; |
| + case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER: |
| + UMA_HISTOGRAM_CUSTOM_TIMES( |
| + "NewTabPage.ContentSuggestions.TimeUntilStartupFetch." |
| + "ActiveSuggestionsConsumer", |
| + time_until_startup_fetch, base::TimeDelta::FromSeconds(1), |
| base::TimeDelta::FromDays(7), |
| /*bucket_count=*/50); |
| break; |
| @@ -288,8 +330,10 @@ bool RemoteSuggestionsSchedulerImpl::FetchingSchedule::operator==( |
| const FetchingSchedule& other) const { |
| return interval_persistent_wifi == other.interval_persistent_wifi && |
| interval_persistent_fallback == other.interval_persistent_fallback && |
| - interval_soft_wifi == other.interval_soft_wifi && |
| - interval_soft_fallback == other.interval_soft_fallback; |
| + interval_startup_wifi == other.interval_startup_wifi && |
| + interval_startup_fallback == other.interval_startup_fallback && |
| + interval_shown_wifi == other.interval_shown_wifi && |
| + interval_shown_fallback == other.interval_shown_fallback; |
| } |
| bool RemoteSuggestionsSchedulerImpl::FetchingSchedule::operator!=( |
| @@ -300,7 +344,9 @@ bool RemoteSuggestionsSchedulerImpl::FetchingSchedule::operator!=( |
| bool RemoteSuggestionsSchedulerImpl::FetchingSchedule::is_empty() const { |
| return interval_persistent_wifi.is_zero() && |
| interval_persistent_fallback.is_zero() && |
| - interval_soft_wifi.is_zero() && interval_soft_fallback.is_zero(); |
| + interval_startup_wifi.is_zero() && |
| + interval_startup_fallback.is_zero() && interval_shown_wifi.is_zero() && |
| + interval_shown_fallback.is_zero(); |
| } |
| // The TriggerType enum specifies values for the events that can trigger |
| @@ -361,8 +407,11 @@ void RemoteSuggestionsSchedulerImpl::RegisterProfilePrefs( |
| registry->RegisterInt64Pref(prefs::kSnippetPersistentFetchingIntervalWifi, 0); |
| registry->RegisterInt64Pref(prefs::kSnippetPersistentFetchingIntervalFallback, |
| 0); |
| - registry->RegisterInt64Pref(prefs::kSnippetSoftFetchingIntervalWifi, 0); |
| - registry->RegisterInt64Pref(prefs::kSnippetSoftFetchingIntervalFallback, 0); |
| + registry->RegisterInt64Pref(prefs::kSnippetStartupFetchingIntervalWifi, 0); |
| + registry->RegisterInt64Pref(prefs::kSnippetStartupFetchingIntervalFallback, |
| + 0); |
| + registry->RegisterInt64Pref(prefs::kSnippetShownFetchingIntervalWifi, 0); |
| + registry->RegisterInt64Pref(prefs::kSnippetShownFetchingIntervalFallback, 0); |
| registry->RegisterInt64Pref(prefs::kSnippetLastFetchAttempt, 0); |
| // Cleanup procedure in M59. Remove for M62. |
| @@ -488,10 +537,14 @@ RemoteSuggestionsSchedulerImpl::GetDesiredFetchingSchedule() const { |
| GetDesiredFetchingInterval(FetchingInterval::PERSISTENT_WIFI, user_class); |
| schedule.interval_persistent_fallback = GetDesiredFetchingInterval( |
| FetchingInterval::PERSISTENT_FALLBACK, user_class); |
| - schedule.interval_soft_wifi = |
| - GetDesiredFetchingInterval(FetchingInterval::SOFT_WIFI, user_class); |
| - schedule.interval_soft_fallback = |
| - GetDesiredFetchingInterval(FetchingInterval::SOFT_FALLBACK, user_class); |
| + schedule.interval_startup_wifi = |
| + GetDesiredFetchingInterval(FetchingInterval::STARTUP_WIFI, user_class); |
| + schedule.interval_startup_fallback = GetDesiredFetchingInterval( |
| + FetchingInterval::STARTUP_FALLBACK, user_class); |
| + schedule.interval_shown_wifi = |
| + GetDesiredFetchingInterval(FetchingInterval::SHOWN_WIFI, user_class); |
| + schedule.interval_shown_fallback = |
| + GetDesiredFetchingInterval(FetchingInterval::SHOWN_FALLBACK, user_class); |
| return schedule; |
| } |
| @@ -502,10 +555,14 @@ void RemoteSuggestionsSchedulerImpl::LoadLastFetchingSchedule() { |
| schedule_.interval_persistent_fallback = |
| base::TimeDelta::FromInternalValue(profile_prefs_->GetInt64( |
| prefs::kSnippetPersistentFetchingIntervalFallback)); |
| - schedule_.interval_soft_wifi = base::TimeDelta::FromInternalValue( |
| - profile_prefs_->GetInt64(prefs::kSnippetSoftFetchingIntervalWifi)); |
| - schedule_.interval_soft_fallback = base::TimeDelta::FromInternalValue( |
| - profile_prefs_->GetInt64(prefs::kSnippetSoftFetchingIntervalFallback)); |
| + schedule_.interval_startup_wifi = base::TimeDelta::FromInternalValue( |
| + profile_prefs_->GetInt64(prefs::kSnippetStartupFetchingIntervalWifi)); |
| + schedule_.interval_startup_fallback = base::TimeDelta::FromInternalValue( |
| + profile_prefs_->GetInt64(prefs::kSnippetStartupFetchingIntervalFallback)); |
| + schedule_.interval_shown_wifi = base::TimeDelta::FromInternalValue( |
| + profile_prefs_->GetInt64(prefs::kSnippetShownFetchingIntervalWifi)); |
| + schedule_.interval_shown_fallback = base::TimeDelta::FromInternalValue( |
| + profile_prefs_->GetInt64(prefs::kSnippetShownFetchingIntervalFallback)); |
| } |
| void RemoteSuggestionsSchedulerImpl::StoreFetchingSchedule() { |
| @@ -515,10 +572,15 @@ void RemoteSuggestionsSchedulerImpl::StoreFetchingSchedule() { |
| profile_prefs_->SetInt64( |
| prefs::kSnippetPersistentFetchingIntervalFallback, |
| schedule_.interval_persistent_fallback.ToInternalValue()); |
| - profile_prefs_->SetInt64(prefs::kSnippetSoftFetchingIntervalWifi, |
| - schedule_.interval_soft_wifi.ToInternalValue()); |
| - profile_prefs_->SetInt64(prefs::kSnippetSoftFetchingIntervalFallback, |
| - schedule_.interval_soft_fallback.ToInternalValue()); |
| + profile_prefs_->SetInt64(prefs::kSnippetStartupFetchingIntervalWifi, |
| + schedule_.interval_startup_wifi.ToInternalValue()); |
| + profile_prefs_->SetInt64( |
| + prefs::kSnippetStartupFetchingIntervalFallback, |
| + schedule_.interval_startup_fallback.ToInternalValue()); |
| + profile_prefs_->SetInt64(prefs::kSnippetShownFetchingIntervalWifi, |
| + schedule_.interval_shown_wifi.ToInternalValue()); |
| + profile_prefs_->SetInt64(prefs::kSnippetShownFetchingIntervalFallback, |
| + schedule_.interval_shown_fallback.ToInternalValue()); |
| } |
| void RemoteSuggestionsSchedulerImpl::RefetchInTheBackgroundIfAppropriate( |
| @@ -541,7 +603,8 @@ void RemoteSuggestionsSchedulerImpl::RefetchInTheBackgroundIfAppropriate( |
| clock_->Now() - last_fetch_attempt_time); |
| } |
| - if (is_soft && !ShouldRefetchInTheBackgroundNow(last_fetch_attempt_time)) { |
| + if (is_soft && |
| + !ShouldRefetchInTheBackgroundNow(last_fetch_attempt_time, trigger)) { |
| return; |
| } |
| @@ -549,12 +612,20 @@ void RemoteSuggestionsSchedulerImpl::RefetchInTheBackgroundIfAppropriate( |
| return; |
| } |
| - if (is_soft) { |
| - ReportTimeUntilSoftFetch(user_classifier_->GetUserClass(), |
| - clock_->Now() - last_fetch_attempt_time); |
| - } else { |
| - ReportTimeUntilPersistentFetch(user_classifier_->GetUserClass(), |
| - clock_->Now() - last_fetch_attempt_time); |
| + base::TimeDelta diff = clock_->Now() - last_fetch_attempt_time; |
| + switch (trigger) { |
| + case TriggerType::PERSISTENT_SCHEDULER_WAKE_UP: |
| + ReportTimeUntilPersistentFetch(user_classifier_->GetUserClass(), diff); |
| + break; |
| + case TriggerType::NTP_OPENED: |
| + ReportTimeUntilShownFetch(user_classifier_->GetUserClass(), diff); |
| + break; |
| + case TriggerType::BROWSER_FOREGROUNDED: |
| + case TriggerType::BROWSER_COLD_START: |
| + ReportTimeUntilStartupFetch(user_classifier_->GetUserClass(), diff); |
| + break; |
| + case TriggerType::COUNT: |
| + NOTREACHED(); |
| } |
| UMA_HISTOGRAM_ENUMERATION( |
| @@ -568,16 +639,23 @@ void RemoteSuggestionsSchedulerImpl::RefetchInTheBackgroundIfAppropriate( |
| } |
| bool RemoteSuggestionsSchedulerImpl::ShouldRefetchInTheBackgroundNow( |
| - base::Time last_fetch_attempt_time) { |
| + base::Time last_fetch_attempt_time, |
| + TriggerType trigger) { |
| // If we have no persistent scheduler to ask, err on the side of caution. |
| bool wifi = false; |
| if (persistent_scheduler_) { |
| wifi = persistent_scheduler_->IsOnUnmeteredConnection(); |
| } |
| - base::Time first_allowed_fetch_time = |
| - last_fetch_attempt_time + |
| - (wifi ? schedule_.interval_soft_wifi : schedule_.interval_soft_fallback); |
| + base::Time first_allowed_fetch_time = last_fetch_attempt_time; |
| + if (trigger == TriggerType::NTP_OPENED) { |
| + first_allowed_fetch_time += (wifi ? schedule_.interval_shown_wifi |
|
markusheintz_
2017/05/16 12:04:57
optional: I'm not the biggest fan of the ternary o
jkrcal
2017/05/16 12:31:02
I'll keep the ternary one. I really cannot see the
|
| + : schedule_.interval_shown_fallback); |
| + } else { |
| + first_allowed_fetch_time += (wifi ? schedule_.interval_startup_wifi |
| + : schedule_.interval_startup_fallback); |
| + } |
| + |
| base::Time now = clock_->Now(); |
| return background_fetches_allowed_after_ <= now && |
| first_allowed_fetch_time <= now; |