blob: 94f433798f79c9a62971013af5631c1898133675 [file] [log] [blame]
// Copyright 2020 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 "chrome/common/privacy_budget/scoped_privacy_budget_config.h"
#include "base/check.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/common/privacy_budget/field_trial_param_conversions.h"
#include "chrome/common/privacy_budget/privacy_budget_features.h"
#include "chrome/common/privacy_budget/types.h"
#include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h"
#include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"
namespace test {
// Are you happy now linker?
const int ScopedPrivacyBudgetConfig::kDefaultGeneration;
const int ScopedPrivacyBudgetConfig::kDefaultExpectedSurfaceCount;
ScopedPrivacyBudgetConfig::Parameters::Parameters() = default;
ScopedPrivacyBudgetConfig::Parameters::Parameters(const Parameters&) = default;
ScopedPrivacyBudgetConfig::Parameters::Parameters(Parameters&&) = default;
ScopedPrivacyBudgetConfig::Parameters::~Parameters() = default;
ScopedPrivacyBudgetConfig::~ScopedPrivacyBudgetConfig() {
DCHECK(applied_) << "ScopedPrivacyBudgetConfig instance created but not "
"applied. Did you forget to call Apply()?";
}
ScopedPrivacyBudgetConfig::ScopedPrivacyBudgetConfig() = default;
ScopedPrivacyBudgetConfig::ScopedPrivacyBudgetConfig(
const Parameters& parameters) {
Apply(parameters);
}
ScopedPrivacyBudgetConfig::ScopedPrivacyBudgetConfig(Presets presets) {
switch (presets) {
case kEnable:
Apply(Parameters());
break;
case kDisable: {
Parameters parameters;
parameters.enabled = false;
Apply(parameters);
break;
}
}
}
void ScopedPrivacyBudgetConfig::Apply(const Parameters& parameters) {
blink::IdentifiabilityStudySettings::ResetStateForTesting();
DCHECK(!applied_);
applied_ = true;
if (!parameters.enabled) {
scoped_feature_list_.InitAndDisableFeature(features::kIdentifiabilityStudy);
return;
}
Parameters defaults;
base::FieldTrialParams ftp;
ftp.insert({features::kIdentifiabilityStudyGeneration.name,
base::NumberToString(parameters.generation)});
if (!parameters.blocked_surfaces.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyBlockedMetrics.name,
EncodeIdentifiabilityFieldTrialParam(parameters.blocked_surfaces)});
}
if (!parameters.blocked_types.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyBlockedTypes.name,
EncodeIdentifiabilityFieldTrialParam(parameters.blocked_types)});
}
if (!parameters.allowed_random_types.empty()) {
ftp.insert({features::kIdentifiabilityStudyAllowedRandomTypes.name,
EncodeIdentifiabilityFieldTrialParam(
parameters.allowed_random_types)});
}
ftp.insert({features::kIdentifiabilityStudyExpectedSurfaceCount.name,
base::NumberToString(parameters.expected_surface_count)});
if (parameters.active_surface_budget != defaults.active_surface_budget) {
ftp.insert({features::kIdentifiabilityStudyActiveSurfaceBudget.name,
base::NumberToString(parameters.active_surface_budget)});
}
if (!parameters.per_surface_cost.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyPerHashCost.name,
EncodeIdentifiabilityFieldTrialParam(parameters.per_surface_cost)});
}
if (!parameters.per_type_cost.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyPerTypeCost.name,
EncodeIdentifiabilityFieldTrialParam(parameters.per_type_cost)});
}
if (!parameters.equivalence_classes.empty()) {
ftp.insert(
{features::kIdentifiabilityStudySurfaceEquivalenceClasses.name,
EncodeIdentifiabilityFieldTrialParam(parameters.equivalence_classes)});
}
if (!parameters.blocks.empty()) {
ftp.insert({features::kIdentifiabilityStudyBlocks.name,
EncodeIdentifiabilityFieldTrialParam(parameters.blocks)});
}
if (!parameters.block_weights.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyBlockWeights.name,
EncodeIdentifiabilityFieldTrialParam(parameters.block_weights)});
}
if (!parameters.per_surface_cost.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyPerHashCost.name,
EncodeIdentifiabilityFieldTrialParam(parameters.per_surface_cost)});
}
if (!parameters.per_type_cost.empty()) {
ftp.insert(
{features::kIdentifiabilityStudyPerTypeCost.name,
EncodeIdentifiabilityFieldTrialParam(parameters.per_type_cost)});
}
if (!parameters.equivalence_classes.empty()) {
ftp.insert(
{features::kIdentifiabilityStudySurfaceEquivalenceClasses.name,
EncodeIdentifiabilityFieldTrialParam(parameters.equivalence_classes)});
}
scoped_feature_list_.InitAndEnableFeatureWithParameters(
features::kIdentifiabilityStudy, ftp);
}
} // namespace test