blob: 5855f7a07f23a84354808a00b1b467084dabde74 [file] [log] [blame]
// Copyright 2017 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.
#ifndef COMPONENTS_VARIATIONS_SERVICE_SAFE_SEED_MANAGER_H_
#define COMPONENTS_VARIATIONS_SERVICE_SAFE_SEED_MANAGER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/time/time.h"
class PrefRegistrySimple;
class PrefService;
namespace variations {
struct ClientFilterableState;
class VariationsSeedStore;
// The primary class that encapsulates state for managing the safe seed.
class SafeSeedManager {
public:
// Creates a SafeSeedManager instance, and updates safe mode prefs for
// bookkeeping.
SafeSeedManager(bool did_previous_session_exit_cleanly,
PrefService* local_state);
virtual ~SafeSeedManager();
// Register safe mode prefs in Local State.
static void RegisterPrefs(PrefRegistrySimple* registry);
// Returns true iff the client should use the safe seed for variations state.
// Virtual for testing.
virtual bool ShouldRunInSafeMode() const;
// Stores the combined server and client state that control the active
// variations state. Must be called at most once per launch of the Chrome app.
// As an optimization, should not be called when running in safe mode.
// Virtual for testing.
virtual void SetActiveSeedState(
const std::string& seed_data,
const std::string& base64_seed_signature,
std::unique_ptr<ClientFilterableState> client_filterable_state,
base::Time seed_fetch_time);
// Records that a fetch has started: pessimistically increments the
// corresponding failure streak for safe mode.
void RecordFetchStarted();
// Records a successful fetch: resets the failure streaks for safe mode.
// Writes the currently active seed to the |seed_store| as a safe seed, if
// appropriate.
void RecordSuccessfulFetch(VariationsSeedStore* seed_store);
private:
// The combined server and client state needed to save an active seed as a
// safe seed. Not set when running in safe mode.
struct ActiveSeedState {
ActiveSeedState(
const std::string& seed_data,
const std::string& base64_seed_signature,
std::unique_ptr<ClientFilterableState> client_filterable_state,
base::Time seed_fetch_time);
~ActiveSeedState();
// The serialized variations seed data.
const std::string seed_data;
// The base64-encoded signature for the seed data.
const std::string base64_seed_signature;
// The client state which is used for filtering studies.
const std::unique_ptr<ClientFilterableState> client_filterable_state;
// The latest timestamp at which this seed was fetched. This is always a
// client-side timestamp, never a server-provided timestamp.
const base::Time seed_fetch_time;
};
std::unique_ptr<ActiveSeedState> active_seed_state_;
// The active seed state must never be set more than once.
bool has_set_active_seed_state_ = false;
// The pref service used to store persist the variations seed. Weak reference;
// must outlive |this| instance.
PrefService* local_state_;
DISALLOW_COPY_AND_ASSIGN(SafeSeedManager);
};
} // namespace variations
#endif // COMPONENTS_VARIATIONS_SERVICE_SAFE_SEED_MANAGER_H_