blob: 26b6e3e113e9e64d2922bd1ec2e77df78ce4623c [file] [log] [blame]
// Copyright 2018 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 "content/child/field_trial.h"
#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/debug/leak_annotations.h"
#include "base/feature_list.h"
#include "base/macros.h"
#include "base/metrics/field_trial.h"
#include "build/build_config.h"
#include "content/public/common/content_switches.h"
#include "services/service_manager/embedder/descriptors.h"
namespace content {
void InitializeFieldTrialAndFeatureList() {
const base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
// Initialize statistical testing infrastructure. We set the entropy
// provider to nullptr to disallow non-browser processes from creating
// their own one-time randomized trials; they should be created in the
// browser process.
//
// This is intentionally leaked since it needs to live for the duration of the
// process and there's no benefit in cleaning it up at exit.
base::FieldTrialList* leaked_field_trial_list =
new base::FieldTrialList(nullptr);
ANNOTATE_LEAKING_OBJECT_PTR(leaked_field_trial_list);
ignore_result(leaked_field_trial_list);
// Ensure any field trials in browser are reflected into the child
// process.
#if defined(OS_WIN) || defined(OS_MACOSX)
base::FieldTrialList::CreateTrialsFromCommandLine(
command_line, switches::kFieldTrialHandle, -1);
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
// On POSIX systems that use the zygote, we get the trials from a shared
// memory segment backed by an fd instead of the command line.
base::FieldTrialList::CreateTrialsFromCommandLine(
command_line, switches::kFieldTrialHandle,
service_manager::kFieldTrialDescriptor);
#endif
std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
base::FieldTrialList::CreateFeaturesFromCommandLine(
command_line, switches::kEnableFeatures, switches::kDisableFeatures,
feature_list.get());
base::FeatureList::SetInstance(std::move(feature_list));
}
} // namespace content