blob: ba95443db511859972da3f55b1aca415b8a89f70 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_VARIATIONS_VARIATIONS_SEED_PROCESSOR_H_
#define COMPONENTS_VARIATIONS_VARIATIONS_SEED_PROCESSOR_H_
#include <stdint.h>
#include <string>
#include "base/component_export.h"
#include "base/functional/callback_forward.h"
#include "components/variations/entropy_provider.h"
#include "components/variations/proto/study.pb.h"
#include "components/variations/proto/variations_seed.pb.h"
namespace base {
class FeatureList;
}
namespace variations {
namespace internal {
// The trial group selected when a study specifies a feature that is already
// associated with another trial. Exposed in the header file for testing.
COMPONENT_EXPORT(VARIATIONS)
extern const char kFeatureConflictGroupName[];
// The name of an auto-generated feature parameter for studies that have a
// non-empty google_groups filter.
COMPONENT_EXPORT(VARIATIONS)
extern const char kGoogleGroupFeatureParamName[];
// The separator between multiple Google groups in when serialized into a string
// for the feature parameter.
COMPONENT_EXPORT(VARIATIONS)
extern const char kGoogleGroupFeatureParamSeparator[];
} // namespace internal
class ProcessedStudy;
struct ClientFilterableState;
class VariationsLayers;
// Helper class to instantiate field trials from a variations seed.
class COMPONENT_EXPORT(VARIATIONS) VariationsSeedProcessor {
public:
using UIStringOverrideCallback =
base::RepeatingCallback<void(uint32_t, const std::u16string&)>;
VariationsSeedProcessor();
VariationsSeedProcessor(const VariationsSeedProcessor&) = delete;
VariationsSeedProcessor& operator=(const VariationsSeedProcessor&) = delete;
virtual ~VariationsSeedProcessor();
// Whether the experiment has a `google_web_experiment_id` or a
// `google_web_trigger_experiment_id`.
static bool HasGoogleWebExperimentId(const Study::Experiment& experiment);
// Creates field trials from the specified variations |seed|, filtered
// according to the client's |client_state|.
void CreateTrialsFromSeed(const VariationsSeed& seed,
const ClientFilterableState& client_state,
const UIStringOverrideCallback& override_callback,
const EntropyProviders& entropy_providers,
const VariationsLayers& layers,
base::FeatureList* feature_list);
private:
friend void CreateTrialFromStudyFuzzer(const Study& study);
// Check if the |study| is only associated with platform Android/iOS and
// channel dev/canary. If so, forcing flag and variation id can both be set.
// (Otherwise, forcing_flag and variation_id are mutually exclusive.)
bool AllowVariationIdWithForcingFlag(const Study& study);
// Creates and registers a field trial from the |processed_study| data.
void CreateTrialFromStudy(const ProcessedStudy& processed_study,
const UIStringOverrideCallback& override_callback,
const EntropyProviders& entropy_providers,
const VariationsLayers& layers,
base::FeatureList* feature_list);
};
} // namespace variations
#endif // COMPONENTS_VARIATIONS_VARIATIONS_SEED_PROCESSOR_H_