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..c951e449b1aaed5d5b710028a165d68cc7c665ed 100644 |
| --- a/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc |
| +++ b/components/ntp_snippets/remote/remote_suggestions_scheduler_impl.cc |
| @@ -33,11 +33,15 @@ namespace { |
| // 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 "startup" fetch is performed only at a moment when the user starts / |
|
markusheintz_
2017/05/15 09:35:47
Can we mention the FetchInterval names from below
jkrcal
2017/05/15 11:40:24
Rephrased (I do not want to mention all cases I wa
|
| +// switches to Chrome after the interval has elapsed (the triggers |
| +// BROWSER_FOREGROUNDED / BROWSER_COLD_START must be enabled); |
|
markusheintz_
2017/05/15 09:35:47
I don't understand the part about the triggers. Co
jkrcal
2017/05/15 11:40:24
Not needed here, removed.
|
| +// - A "shown" fetch is performed only at a moment when the suggestions |
| +// surface is shown after the interval has elapsed (the trigger NTP_OPENED |
| +// must be enabled); |
| // - a "persistent" fetch is initiated automatically by the OS after the |
| -// interval elapses. |
| +// interval elapses. |
| +// Furthermore we distinguish: |
| // - 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. |
| @@ -46,8 +50,10 @@ namespace { |
| enum class FetchingInterval { |
| PERSISTENT_FALLBACK, |
| PERSISTENT_WIFI, |
| - SOFT_FALLBACK, |
| - SOFT_WIFI, |
| + STARTUP_FALLBACK, |
| + STARTUP_WIFI, |
| + SHOWN_FALLBACK, |
| + SHOWN_WIFI, |
| COUNT |
| }; |
| @@ -57,28 +63,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/15 09:35:47
nit: remove one space before "4.0"
jkrcal
2017/05/15 11:40:24
Done.
|
| +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 +188,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 +203,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 +211,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 +332,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 +346,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 +409,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 +539,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 +557,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 +574,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 +605,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 +614,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 +641,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 |
| + : 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; |