diff options
Diffstat (limited to 'chrome/browser/metrics/variations_service.h')
-rw-r--r-- | chrome/browser/metrics/variations_service.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/chrome/browser/metrics/variations_service.h b/chrome/browser/metrics/variations_service.h new file mode 100644 index 0000000..76e1cb1 --- /dev/null +++ b/chrome/browser/metrics/variations_service.h @@ -0,0 +1,91 @@ +// Copyright (c) 2012 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 CHROME_BROWSER_METRICS_VARIATIONS_SERVICE_H_ +#define CHROME_BROWSER_METRICS_VARIATIONS_SERVICE_H_ +#pragma once + +#include <string> + +#include "base/compiler_specific.h" +#include "base/gtest_prod_util.h" +#include "base/time.h" +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/metrics/proto/study.pb.h" +#include "chrome/browser/metrics/proto/trials_seed.pb.h" +#include "chrome/common/chrome_version_info.h" +#include "content/public/common/url_fetcher_delegate.h" + +class PrefService; + +// Used to setup field trials based on stored variations seed data, and fetch +// new seed data from the variations server. +class VariationsService : public content::URLFetcherDelegate { + public: + VariationsService(); + virtual ~VariationsService(); + + // Creates field trials based on Variations Seed loaded from local prefs. If + // there is a problem loading the seed data, all trials specified by the seed + // may not be created. + bool CreateTrialsFromSeed(PrefService* local_prefs); + + // Starts the fetching process, where |OnURLFetchComplete| is called with the + // response. + void StartFetchingVariationsSeed(); + + // content::URLFetcherDelegate implementation: + virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; + + // Register Variations related prefs in Local State. + static void RegisterPrefs(PrefService* prefs); + + private: + FRIEND_TEST_ALL_PREFIXES(VariationsServiceTest, CheckStudyChannel); + FRIEND_TEST_ALL_PREFIXES(VariationsServiceTest, CheckStudyVersion); + FRIEND_TEST_ALL_PREFIXES(VariationsServiceTest, CheckStudyVersionWildcards); + FRIEND_TEST_ALL_PREFIXES(VariationsServiceTest, CheckStudyDate); + + // Store the given seed data to the given local prefs. Note that |seed_data| + // is assumed to be the raw serialized protobuf data stored in a string. It + // will be Base64Encoded for storage. If the string is invalid or the encoding + // fails, the |local_prefs| is left as is. + void StoreSeedData(const std::string& seed_data, PrefService* local_prefs); + + // Returns whether |study| should be added to the local field trials list + // according to its restriction parameters. + static bool ShouldAddStudy(const chrome_variations::Study& study); + + // Checks whether |study| is applicable for the given |channel|. + static bool CheckStudyChannel(const chrome_variations::Study& study, + chrome::VersionInfo::Channel channel); + + // Checks whether |study| is applicable for the given version string. + static bool CheckStudyVersion(const chrome_variations::Study& study, + const std::string& version_string); + + // Checks whether |study| is applicable for the given date/time. + static bool CheckStudyDate(const chrome_variations::Study& study, + const base::Time& date_time); + + // Loads the Variations seed data from the given local prefs into |seed|. If + // there is a problem with loading, the pref value is cleared and false is + // returned. If successful, |seed| will contain the loaded data and true is + // returned. + bool LoadTrialsSeedFromPref(PrefService* local_prefs, + chrome_variations::TrialsSeed* seed); + + void CreateTrialFromStudy(const chrome_variations::Study& study); + + // Contains the current seed request. Will only have a value while a request + // is pending, and will be reset by |OnURLFetchComplete|. + scoped_ptr<content::URLFetcher> pending_seed_request_; + + // The variations seed data being used for this session. + // TODO(jwd): This should be removed. When the seed data is loaded, it will be + // used immediately so it won't need to be stored. + chrome_variations::TrialsSeed variations_seed_; +}; + +#endif // CHROME_BROWSER_METRICS_VARIATIONS_SERVICE_H_ |