Index: base/metrics/field_trial.h |
=================================================================== |
--- base/metrics/field_trial.h (revision 152812) |
+++ base/metrics/field_trial.h (working copy) |
@@ -95,6 +95,18 @@ |
public: |
typedef int Probability; // Probability type for being selected in a trial. |
+ // EntropyProvider is an interface for providing entropy for one-time |
+ // randomized (persistent) field trials. |
+ class BASE_EXPORT EntropyProvider { |
+ public: |
+ virtual ~EntropyProvider(); |
+ |
+ // Returns a double in the range of [0, 1) based on |trial_name| that will |
+ // be used for the dice roll for the specified field trial. A given instance |
+ // should always return the same value given the same input |trial_name|. |
+ virtual double GetEntropyForTrial(const std::string& trial_name) const = 0; |
+ }; |
+ |
// A pair representing a Field Trial and its selected group. |
struct SelectedGroup { |
std::string trial; |
@@ -203,12 +215,6 @@ |
// Returns the group_name. A winner need not have been chosen. |
std::string group_name_internal() const { return group_name_; } |
- // Calculates a uniformly-distributed double between [0.0, 1.0) given |
- // a |client_id| and a |trial_name| (the latter is used as salt to avoid |
- // separate one-time randomized trials from all having the same results). |
- static double HashClientId(const std::string& client_id, |
- const std::string& trial_name); |
- |
// The name of the field trial, as can be found via the FieldTrialList. |
const std::string name_; |
@@ -274,16 +280,17 @@ |
const std::string& group_name) = 0; |
protected: |
- virtual ~Observer() {} |
+ virtual ~Observer(); |
}; |
// This singleton holds the global list of registered FieldTrials. |
// |
- // |client_id| should be an opaque, diverse ID for this client that does not |
- // change between sessions, to enable one-time randomized trials. The empty |
- // string may be provided, in which case one-time randomized trials will |
- // not be available. |
- explicit FieldTrialList(const std::string& client_id); |
+ // To support one-time randomized field trials, specify a non-NULL |
+ // |entropy_provider| which should be a source of uniformly distributed |
+ // entropy values. Takes ownership of |entropy_provider|. If one time |
+ // randomization is not desired, pass in NULL for |entropy_provider|. |
+ explicit FieldTrialList(const FieldTrial::EntropyProvider* entropy_provider); |
+ |
// Destructor Release()'s references to all registered FieldTrial instances. |
~FieldTrialList(); |
@@ -389,17 +396,16 @@ |
// Return the number of active field trials. |
static size_t GetFieldTrialCount(); |
+ // If one-time randomization is enabled, returns a weak pointer to the |
+ // corresponding EntropyProvider. Otherwise, returns NULL. |
+ static const FieldTrial::EntropyProvider* |
+ GetEntropyProviderForOneTimeRandomization(); |
+ |
// Returns true if you can call |FieldTrial::UseOneTimeRandomization()| |
- // without error, i.e. if a non-empty string was provided as the client_id |
- // when constructing the FieldTrialList singleton. |
+ // without error, i.e. if a non-NULL entropy provider was specified when |
+ // constructing the FieldTrialList singleton. |
static bool IsOneTimeRandomizationEnabled(); |
- // Returns an opaque, diverse ID for this client that does not change |
- // between sessions. |
- // |
- // Returns the empty string if one-time randomization is not enabled. |
- static const std::string& client_id(); |
- |
private: |
// A map from FieldTrial names to the actual instances. |
typedef std::map<std::string, FieldTrial*> RegistrationList; |
@@ -429,9 +435,9 @@ |
base::Lock lock_; |
RegistrationList registered_; |
- // An opaque, diverse ID for this client that does not change |
- // between sessions, or the empty string if not initialized. |
- std::string client_id_; |
+ // Entropy provider to be used for one-time randomized field trials. If NULL, |
+ // one-time randomization is not supported. |
+ scoped_ptr<const FieldTrial::EntropyProvider> entropy_provider_; |
// List of observers to be notified when a group is selected for a FieldTrial. |
scoped_refptr<ObserverListThreadSafe<Observer> > observer_list_; |