123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // Copyright (c) 2013 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/variations/variations_request_scheduler.h"
- #include <stddef.h>
- #include "base/strings/string_number_conversions.h"
- #include "build/build_config.h"
- #include "components/variations/variations_associated_data.h"
- #include "components/variations/variations_switches.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- namespace variations {
- namespace {
- // The minimum time between consecutive variations seed fetches.
- constexpr base::TimeDelta kVariationsSeedFetchIntervalMinimum =
- base::Minutes(1);
- // Returns the variations seed fetch interval specified through the
- // |kVariationsSeedFetchInterval| switch. The value returned is subject to a
- // minimum value, |kVariationsSeedFetchIntervalMinimum|. If no overridden value
- // is specified, or if it is malformed, an empty optional is returned.
- absl::optional<base::TimeDelta> GetOverriddenFetchPeriod() {
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- const std::string switch_value =
- command_line->GetSwitchValueASCII(switches::kVariationsSeedFetchInterval);
- if (switch_value.empty())
- return absl::nullopt;
- int overridden_period;
- if (!base::StringToInt(switch_value, &overridden_period)) {
- LOG(DFATAL) << "Malformed value for --"
- << switches::kVariationsSeedFetchInterval << ". "
- << "Expected int, got: " << switch_value;
- return absl::nullopt;
- }
- return std::max(base::Minutes(overridden_period),
- kVariationsSeedFetchIntervalMinimum);
- }
- } // namespace
- VariationsRequestScheduler::VariationsRequestScheduler(
- const base::RepeatingClosure& task)
- : task_(task) {}
- VariationsRequestScheduler::~VariationsRequestScheduler() = default;
- void VariationsRequestScheduler::Start() {
- task_.Run();
- timer_.Start(FROM_HERE, GetFetchPeriod(), task_);
- }
- void VariationsRequestScheduler::Reset() {
- if (timer_.IsRunning())
- timer_.Reset();
- one_shot_timer_.Stop();
- }
- void VariationsRequestScheduler::ScheduleFetchShortly() {
- // Reset the regular timer to avoid it triggering soon after.
- Reset();
- // The delay before attempting a fetch shortly.
- base::TimeDelta fetch_shortly_delay = base::Minutes(5);
- // If there is a fetch interval specified in the command line, and it is
- // shorter than |fetch_shortly_delay|, use it instead.
- absl::optional<base::TimeDelta> overridden_period =
- GetOverriddenFetchPeriod();
- if (overridden_period.has_value()) {
- fetch_shortly_delay =
- std::min(fetch_shortly_delay, overridden_period.value());
- }
- one_shot_timer_.Start(FROM_HERE, fetch_shortly_delay, task_);
- }
- void VariationsRequestScheduler::OnAppEnterForeground() {
- NOTREACHED() << "Attempted to OnAppEnterForeground on non-mobile device";
- }
- base::TimeDelta VariationsRequestScheduler::GetFetchPeriod() const {
- // The fetch interval can be overridden through the command line.
- absl::optional<base::TimeDelta> overridden_period =
- GetOverriddenFetchPeriod();
- if (overridden_period.has_value())
- return overridden_period.value();
- // The fetch interval can be overridden by a variation param.
- std::string period_min_str =
- GetVariationParamValue("VariationsServiceControl", "fetch_period_min");
- size_t period_min;
- if (base::StringToSizeT(period_min_str, &period_min))
- return base::Minutes(period_min);
- // The default fetch interval is every 30 minutes.
- return base::Minutes(30);
- }
- base::RepeatingClosure VariationsRequestScheduler::task() const {
- return task_;
- }
- #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
- // static
- VariationsRequestScheduler* VariationsRequestScheduler::Create(
- const base::RepeatingClosure& task,
- PrefService* local_state) {
- return new VariationsRequestScheduler(task);
- }
- #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
- } // namespace variations
|