| Index: components/doodle/doodle_service.cc
|
| diff --git a/components/doodle/doodle_service.cc b/components/doodle/doodle_service.cc
|
| index bb97e32d4175082c8a16e72e461ebe8355e1d4a3..1ee35ac295b9cff26809fe1fc2344d597eec2487 100644
|
| --- a/components/doodle/doodle_service.cc
|
| +++ b/components/doodle/doodle_service.cc
|
| @@ -8,7 +8,6 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/metrics/histogram_macros.h"
|
| -#include "base/time/time.h"
|
| #include "base/values.h"
|
| #include "components/doodle/pref_names.h"
|
| #include "components/prefs/pref_registry.h"
|
| @@ -19,8 +18,13 @@ namespace doodle {
|
|
|
| namespace {
|
|
|
| +// The maximum time-to-live we'll accept; any larger values will be clamped to
|
| +// this one. This is a last resort in case the server sends bad data.
|
| const int64_t kMaxTimeToLiveSecs = 30 * 24 * 60 * 60; // 30 days
|
|
|
| +// The default value for DoodleService::min_refresh_interval_.
|
| +const int64_t kDefaultMinRefreshIntervalSecs = 15 * 60; // 15 minutes
|
| +
|
| } // namespace
|
|
|
| // static
|
| @@ -32,16 +36,22 @@ void DoodleService::RegisterProfilePrefs(PrefRegistrySimple* pref_registry) {
|
| PrefRegistry::LOSSY_PREF);
|
| }
|
|
|
| -DoodleService::DoodleService(PrefService* pref_service,
|
| - std::unique_ptr<DoodleFetcher> fetcher,
|
| - std::unique_ptr<base::OneShotTimer> expiry_timer,
|
| - std::unique_ptr<base::Clock> clock,
|
| - std::unique_ptr<base::TickClock> tick_clock)
|
| +DoodleService::DoodleService(
|
| + PrefService* pref_service,
|
| + std::unique_ptr<DoodleFetcher> fetcher,
|
| + std::unique_ptr<base::OneShotTimer> expiry_timer,
|
| + std::unique_ptr<base::Clock> clock,
|
| + std::unique_ptr<base::TickClock> tick_clock,
|
| + base::Optional<base::TimeDelta> override_min_refresh_interval)
|
| : pref_service_(pref_service),
|
| fetcher_(std::move(fetcher)),
|
| expiry_timer_(std::move(expiry_timer)),
|
| clock_(std::move(clock)),
|
| - tick_clock_(std::move(tick_clock)) {
|
| + tick_clock_(std::move(tick_clock)),
|
| + min_refresh_interval_(
|
| + override_min_refresh_interval.has_value()
|
| + ? override_min_refresh_interval.value()
|
| + : base::TimeDelta::FromSeconds(kDefaultMinRefreshIntervalSecs)) {
|
| DCHECK(pref_service_);
|
| DCHECK(fetcher_);
|
| DCHECK(expiry_timer_);
|
| @@ -70,9 +80,16 @@ void DoodleService::RemoveObserver(Observer* observer) {
|
| }
|
|
|
| void DoodleService::Refresh() {
|
| + base::TimeTicks now_ticks = tick_clock_->NowTicks();
|
| + // Check if we have passed the minimum refresh interval.
|
| + base::TimeDelta time_since_fetch = now_ticks - last_successful_fetch_;
|
| + if (time_since_fetch < min_refresh_interval_) {
|
| + RecordDownloadMetrics(OUTCOME_REFRESH_INTERVAL_NOT_PASSED,
|
| + base::TimeDelta());
|
| + return;
|
| + }
|
| fetcher_->FetchDoodle(base::BindOnce(&DoodleService::DoodleFetched,
|
| - base::Unretained(this),
|
| - tick_clock_->NowTicks()));
|
| + base::Unretained(this), now_ticks));
|
| }
|
|
|
| // static
|
| @@ -86,6 +103,7 @@ bool DoodleService::DownloadOutcomeIsSuccess(DownloadOutcome outcome) {
|
| case OUTCOME_EXPIRED:
|
| case OUTCOME_DOWNLOAD_ERROR:
|
| case OUTCOME_PARSING_ERROR:
|
| + case OUTCOME_REFRESH_INTERVAL_NOT_PASSED:
|
| return false;
|
| case OUTCOME_COUNT:
|
| NOTREACHED();
|
| @@ -145,8 +163,12 @@ void DoodleService::DoodleFetched(
|
| DoodleState state,
|
| base::TimeDelta time_to_live,
|
| const base::Optional<DoodleConfig>& doodle_config) {
|
| - base::TimeDelta download_time = tick_clock_->NowTicks() - start_time;
|
| + base::TimeTicks now_ticks = tick_clock_->NowTicks();
|
| DownloadOutcome outcome = HandleNewConfig(state, time_to_live, doodle_config);
|
| + if (DownloadOutcomeIsSuccess(outcome)) {
|
| + last_successful_fetch_ = now_ticks;
|
| + }
|
| + base::TimeDelta download_time = now_ticks - start_time;
|
| RecordDownloadMetrics(outcome, download_time);
|
| }
|
|
|
|
|