blob: 156518ec0b748153b10f9c931eae9e7c3f9a56c8 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/metrics/persistent_synthetic_trial_observer.h"
#include "base/task/sequenced_task_runner.h"
#include "components/metrics/persistent_system_profile.h"
#include "components/variations/synthetic_trials.h"
namespace metrics {
namespace {
void PersistSyntheticFieldTrials(
const std::vector<variations::SyntheticTrialGroup>& trials_updated,
const std::vector<variations::SyntheticTrialGroup>& trials_removed) {
// Mark all the updated synthetic field trials in the persistent profile,
// update the removed trials first, then add the updated trials.
// TODO: crbug.com/345445618 - Handle kNextLog annotation mode properly, and
// when the annotation mode changes.
for (const auto& removed : trials_removed) {
metrics::GlobalPersistentSystemProfile::GetInstance()->RemoveFieldTrial(
removed.trial_name());
}
for (const auto& updated : trials_updated) {
if (updated.annotation_mode() ==
variations::SyntheticTrialAnnotationMode::kCurrentLog) {
metrics::GlobalPersistentSystemProfile::GetInstance()->AddFieldTrial(
updated.trial_name(), updated.group_name());
}
}
}
} // namespace
PersistentSyntheticTrialObserver::PersistentSyntheticTrialObserver()
: task_runner_(base::SequencedTaskRunner::GetCurrentDefault()) {}
PersistentSyntheticTrialObserver::~PersistentSyntheticTrialObserver() = default;
void PersistentSyntheticTrialObserver::OnSyntheticTrialsChanged(
const std::vector<variations::SyntheticTrialGroup>& trials_updated,
const std::vector<variations::SyntheticTrialGroup>& trials_removed,
const std::vector<variations::SyntheticTrialGroup>& groups) {
// Synthetic trials may be registered in any task runner, so switch to correct
// task runner before storing.
if (task_runner_->RunsTasksInCurrentSequence()) {
PersistSyntheticFieldTrials(trials_updated, trials_removed);
} else {
task_runner_->PostTask(
FROM_HERE, base::BindOnce(&PersistSyntheticFieldTrials, trials_updated,
trials_removed));
}
}
} // namespace metrics