From 7b2ffa587235a47d4094787d72f38102089f402a Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 31 Jul 2019 15:50:41 +0200 Subject: BASELINE: Update Chromium to 76.0.3809.94 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647 Reviewed-by: Michael BrĂ¼ning --- chromium/components/variations/BUILD.gn | 3 - .../variations/firstrun/VariationsSeedFetcher.java | 21 +-- .../variations/entropy_provider_unittest.cc | 36 ++--- .../field_trial_testing_config_schema.json | 12 ++ .../field_trial_config/field_trial_util.cc | 52 +++++-- .../field_trial_config/field_trial_util.h | 15 +- .../field_trial_util_unittest.cc | 166 +++++++++++++++++---- chromium/components/variations/pref_names.cc | 6 - chromium/components/variations/pref_names.h | 1 - chromium/components/variations/service/BUILD.gn | 1 - chromium/components/variations/service/DEPS | 1 - .../service/generate_ui_string_overrider.py | 4 +- .../service/variations_field_trial_creator.cc | 7 +- .../variations/service/variations_service.cc | 4 - .../service/variations_service_unittest.cc | 20 +-- chromium/components/variations/study_filtering.h | 2 +- .../variations_associated_data_unittest.cc | 3 +- .../variations/variations_seed_processor.cc | 3 +- .../variations_seed_processor_unittest.cc | 4 +- 19 files changed, 236 insertions(+), 125 deletions(-) (limited to 'chromium/components/variations') diff --git a/chromium/components/variations/BUILD.gn b/chromium/components/variations/BUILD.gn index 917a73cbe5c..6349f454f93 100644 --- a/chromium/components/variations/BUILD.gn +++ b/chromium/components/variations/BUILD.gn @@ -30,9 +30,6 @@ static_library("variations") { "pref_names.h", "processed_study.cc", "processed_study.h", - "proto/client_variations.proto", - "proto/study.proto", - "proto/variations_seed.proto", "seed_response.cc", "seed_response.h", "study_filtering.cc", diff --git a/chromium/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java b/chromium/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java index 01054b79c19..12314097269 100644 --- a/chromium/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java +++ b/chromium/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java @@ -9,13 +9,13 @@ import android.os.SystemClock; import android.support.annotation.IntDef; import org.chromium.base.ContextUtils; +import org.chromium.base.FileUtils; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.CachedMetrics.SparseHistogramSample; import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Retention; @@ -47,7 +47,6 @@ public class VariationsSeedFetcher { private static final String VARIATIONS_SERVER_URL = "https://clientservices.googleapis.com/chrome-variations/seed?osname="; - private static final int BUFFER_SIZE = 4096; private static final int READ_TIMEOUT = 3000; // time in ms private static final int REQUEST_TIMEOUT = 1000; // time in ms @@ -272,22 +271,6 @@ public class VariationsSeedFetcher { } } - /** - * Convert a input stream into a byte array. - * @param inputStream the input stream - * @return the byte array which holds the data from the input stream - * @throws IOException if I/O error occurs when reading data from the input stream - */ - public static byte[] convertInputStreamToByteArray(InputStream inputStream) throws IOException { - ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); - byte[] buffer = new byte[BUFFER_SIZE]; - int charactersReadCount = 0; - while ((charactersReadCount = inputStream.read(buffer)) != -1) { - byteBuffer.write(buffer, 0, charactersReadCount); - } - return byteBuffer.toByteArray(); - } - private String getHeaderFieldOrEmpty(HttpURLConnection connection, String name) { String headerField = connection.getHeaderField(name); if (headerField == null) { @@ -300,7 +283,7 @@ public class VariationsSeedFetcher { InputStream inputStream = null; try { inputStream = connection.getInputStream(); - return convertInputStreamToByteArray(inputStream); + return FileUtils.readStream(inputStream); } finally { if (inputStream != null) { inputStream.close(); diff --git a/chromium/components/variations/entropy_provider_unittest.cc b/chromium/components/variations/entropy_provider_unittest.cc index 79040f40cf3..121bc0903d8 100644 --- a/chromium/components/variations/entropy_provider_unittest.cc +++ b/chromium/components/variations/entropy_provider_unittest.cc @@ -185,14 +185,13 @@ TEST(EntropyProviderTest, UseOneTimeRandomizationSHA1) { // particular client_id we use for unit tests they won't. base::FieldTrialList field_trial_list( std::make_unique("client_id")); - const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; scoped_refptr trials[] = { base::FieldTrialList::FactoryGetFieldTrial( - "one", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, nullptr), + "one", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + nullptr), base::FieldTrialList::FactoryGetFieldTrial( - "two", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, nullptr), + "two", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + nullptr), }; for (size_t i = 0; i < base::size(trials); ++i) { @@ -216,14 +215,13 @@ TEST(EntropyProviderTest, UseOneTimeRandomizationNormalizedMurmurHash) { base::FieldTrialList field_trial_list( std::make_unique( 1234, kMaxLowEntropySize)); - const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; scoped_refptr trials[] = { base::FieldTrialList::FactoryGetFieldTrial( - "one", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, nullptr), + "one", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + nullptr), base::FieldTrialList::FactoryGetFieldTrial( - "two", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, nullptr), + "two", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + nullptr), }; for (size_t i = 0; i < base::size(trials); ++i) { @@ -242,15 +240,14 @@ TEST(EntropyProviderTest, UseOneTimeRandomizationWithCustomSeedSHA1) { // for one time randomization produce the same group assignments. base::FieldTrialList field_trial_list( std::make_unique("client_id")); - const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; const uint32_t kCustomSeed = 9001; scoped_refptr trials[] = { base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( - "one", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, kCustomSeed, nullptr, nullptr), + "one", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + kCustomSeed, nullptr, nullptr), base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( - "two", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, kCustomSeed, nullptr, nullptr), + "two", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + kCustomSeed, nullptr, nullptr), }; for (size_t i = 0; i < base::size(trials); ++i) { @@ -271,15 +268,14 @@ TEST(EntropyProviderTest, base::FieldTrialList field_trial_list( std::make_unique( 1234, kMaxLowEntropySize)); - const int kNoExpirationYear = base::FieldTrialList::kNoExpirationYear; const uint32_t kCustomSeed = 9001; scoped_refptr trials[] = { base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( - "one", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, kCustomSeed, nullptr, nullptr), + "one", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + kCustomSeed, nullptr, nullptr), base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( - "two", 100, "default", kNoExpirationYear, 1, 1, - base::FieldTrial::ONE_TIME_RANDOMIZED, kCustomSeed, nullptr, nullptr), + "two", 100, "default", base::FieldTrial::ONE_TIME_RANDOMIZED, + kCustomSeed, nullptr, nullptr), }; for (size_t i = 0; i < base::size(trials); ++i) { diff --git a/chromium/components/variations/field_trial_config/field_trial_testing_config_schema.json b/chromium/components/variations/field_trial_config/field_trial_testing_config_schema.json index 2d115d0b861..16f5380bae5 100644 --- a/chromium/components/variations/field_trial_config/field_trial_testing_config_schema.json +++ b/chromium/components/variations/field_trial_config/field_trial_testing_config_schema.json @@ -63,6 +63,18 @@ { "field": "forcing_flag", "type": "string" + }, + { + "field": "override_ui_string", + "type": "array", + "contents": { + "type_name": "OverrideUIString", + "type": "struct", + "fields": [ + {"field": "name_hash", "type": "int"}, + {"field": "value", "type": "string"} + ] + } } ] } diff --git a/chromium/components/variations/field_trial_config/field_trial_util.cc b/chromium/components/variations/field_trial_config/field_trial_util.cc index ca28fb0148d..43f914a4112 100644 --- a/chromium/components/variations/field_trial_config/field_trial_util.cc +++ b/chromium/components/variations/field_trial_config/field_trial_util.cc @@ -17,9 +17,11 @@ #include "base/metrics/field_trial.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" #include "components/variations/field_trial_config/fieldtrial_testing_config.h" #include "components/variations/variations_associated_data.h" +#include "components/variations/variations_seed_processor.h" #include "net/base/escape.h" #include "ui/base/device_form_factor.h" @@ -71,9 +73,20 @@ bool HasFormFactor(const FieldTrialTestingExperiment& experiment) { return experiment.form_factors_size == 0; } +// Records the override ui string config. Mainly used for testing. +void ApplyUIStringOverrides( + const FieldTrialTestingExperiment& experiment, + const VariationsSeedProcessor::UIStringOverrideCallback& callback) { + for (size_t i = 0; i < experiment.override_ui_string_size; ++i) { + callback.Run(experiment.override_ui_string[i].name_hash, + base::UTF8ToUTF16(experiment.override_ui_string[i].value)); + } +} + void AssociateParamsFromExperiment( const std::string& study_name, const FieldTrialTestingExperiment& experiment, + const VariationsSeedProcessor::UIStringOverrideCallback& callback, base::FeatureList* feature_list) { if (experiment.params_size != 0) { std::map params; @@ -103,6 +116,8 @@ void AssociateParamsFromExperiment( experiment.disable_features[i], base::FeatureList::OVERRIDE_DISABLE_FEATURE, trial); } + + ApplyUIStringOverrides(experiment, callback); } // Choose an experiment to associate. The rules are: @@ -115,9 +130,11 @@ void AssociateParamsFromExperiment( // a different experiment group for non low_end_device then pick that. // - Otherwise, select the first experiment. // - If no experiments match this platform, do not associate any of them. -void ChooseExperiment(const FieldTrialTestingStudy& study, - base::FeatureList* feature_list, - Study::Platform platform) { +void ChooseExperiment( + const FieldTrialTestingStudy& study, + const VariationsSeedProcessor::UIStringOverrideCallback& callback, + Study::Platform platform, + base::FeatureList* feature_list) { const auto& command_line = *base::CommandLine::ForCurrentProcess(); const FieldTrialTestingExperiment* chosen_experiment = nullptr; for (size_t i = 0; i < study.experiments_size; ++i) { @@ -125,8 +142,9 @@ void ChooseExperiment(const FieldTrialTestingStudy& study, if (HasPlatform(*experiment, platform)) { if (!chosen_experiment && !HasDeviceLevelMismatch(*experiment) && - HasFormFactor(*experiment)) + HasFormFactor(*experiment)) { chosen_experiment = experiment; + } if (experiment->forcing_flag && command_line.HasSwitch(experiment->forcing_flag)) { @@ -135,8 +153,10 @@ void ChooseExperiment(const FieldTrialTestingStudy& study, } } } - if (chosen_experiment) - AssociateParamsFromExperiment(study.name, *chosen_experiment, feature_list); + if (chosen_experiment) { + AssociateParamsFromExperiment(study.name, *chosen_experiment, callback, + feature_list); + } } } // namespace @@ -219,23 +239,27 @@ bool AssociateParamsFromString(const std::string& varations_string) { return true; } -void AssociateParamsFromFieldTrialConfig(const FieldTrialTestingConfig& config, - base::FeatureList* feature_list, - Study::Platform platform) { +void AssociateParamsFromFieldTrialConfig( + const FieldTrialTestingConfig& config, + const VariationsSeedProcessor::UIStringOverrideCallback& callback, + Study::Platform platform, + base::FeatureList* feature_list) { for (size_t i = 0; i < config.studies_size; ++i) { const FieldTrialTestingStudy& study = config.studies[i]; if (study.experiments_size > 0) { - ChooseExperiment(study, feature_list, platform); + ChooseExperiment(study, callback, platform, feature_list); } else { DLOG(ERROR) << "Unexpected empty study: " << study.name; } } } -void AssociateDefaultFieldTrialConfig(base::FeatureList* feature_list, - Study::Platform platform) { - AssociateParamsFromFieldTrialConfig(kFieldTrialConfig, feature_list, - platform); +void AssociateDefaultFieldTrialConfig( + const VariationsSeedProcessor::UIStringOverrideCallback& callback, + Study::Platform platform, + base::FeatureList* feature_list) { + AssociateParamsFromFieldTrialConfig(kFieldTrialConfig, callback, platform, + feature_list); } } // namespace variations diff --git a/chromium/components/variations/field_trial_config/field_trial_util.h b/chromium/components/variations/field_trial_config/field_trial_util.h index 1cbbb39afed..9b518afc266 100644 --- a/chromium/components/variations/field_trial_config/field_trial_util.h +++ b/chromium/components/variations/field_trial_config/field_trial_util.h @@ -8,6 +8,7 @@ #include #include "components/variations/proto/study.pb.h" +#include "components/variations/variations_seed_processor.h" namespace base { class FeatureList; @@ -34,15 +35,19 @@ bool AssociateParamsFromString(const std::string& variations_string); // multiple groups with the |config| struct. This will also force the selection // of FieldTrial groups specified in the |config|. Registers features associated // with default field trials with |feature_list|. -void AssociateParamsFromFieldTrialConfig(const FieldTrialTestingConfig& config, - base::FeatureList* feature_list, - Study::Platform platform); +void AssociateParamsFromFieldTrialConfig( + const FieldTrialTestingConfig& config, + const VariationsSeedProcessor::UIStringOverrideCallback& callback, + Study::Platform platform, + base::FeatureList* feature_list); // Associates params and features to FieldTrial groups and forces the selection // of groups specified in testing/variations/fieldtrial_testing_config.json. // Registers features associated with default field trials with |feature_list|. -void AssociateDefaultFieldTrialConfig(base::FeatureList* feature_list, - Study::Platform platform); +void AssociateDefaultFieldTrialConfig( + const VariationsSeedProcessor::UIStringOverrideCallback& callback, + Study::Platform platform, + base::FeatureList* feature_list); } // namespace variations diff --git a/chromium/components/variations/field_trial_config/field_trial_util_unittest.cc b/chromium/components/variations/field_trial_config/field_trial_util_unittest.cc index 9e2372d61dd..47f14c4942f 100644 --- a/chromium/components/variations/field_trial_config/field_trial_util_unittest.cc +++ b/chromium/components/variations/field_trial_config/field_trial_util_unittest.cc @@ -13,14 +13,43 @@ #include "base/metrics/field_trial.h" #include "base/stl_util.h" #include "base/test/scoped_feature_list.h" +#include "base/strings/utf_string_conversions.h" #include "components/variations/field_trial_config/fieldtrial_testing_config.h" #include "components/variations/variations_associated_data.h" +#include "components/variations/variations_seed_processor.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/device_form_factor.h" namespace variations { namespace { +class TestOverrideStringCallback { + public: + typedef std::map OverrideMap; + + TestOverrideStringCallback() + : callback_(base::BindRepeating(&TestOverrideStringCallback::Override, + base::Unretained(this))) {} + + virtual ~TestOverrideStringCallback() {} + + const VariationsSeedProcessor::UIStringOverrideCallback& callback() const { + return callback_; + } + + const OverrideMap& overrides() const { return overrides_; } + + private: + void Override(uint32_t hash, const base::string16& string) { + overrides_[hash] = string; + } + + VariationsSeedProcessor::UIStringOverrideCallback callback_; + OverrideMap overrides_; + + DISALLOW_COPY_AND_ASSIGN(TestOverrideStringCallback); +}; + class FieldTrialUtilTest : public ::testing::Test { public: FieldTrialUtilTest() : field_trial_list_(nullptr) {} @@ -45,8 +74,9 @@ class FieldTrialUtilTest : public ::testing::Test { } } - private: + protected: base::FieldTrialList field_trial_list_; + TestOverrideStringCallback override_callback_; DISALLOW_COPY_AND_ASSIGN(FieldTrialUtilTest); }; @@ -83,15 +113,18 @@ TEST_F(FieldTrialUtilTest, AssociateParamsFromFieldTrialConfig) { {{"x", "1"}, {"y", "2"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = { {"TestGroup1", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params_0, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params_0, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, }; const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params_1[] = {{"x", "3"}, {"y", "4"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = { {"TestGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params_0, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params_0, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, {"TestGroup2-2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params_1, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params_1, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { {"TestTrial1", array_kFieldTrialConfig_experiments_0, 1}, @@ -102,7 +135,10 @@ TEST_F(FieldTrialUtilTest, AssociateParamsFromFieldTrialConfig) { }; base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, platform); + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + &feature_list); EXPECT_EQ("1", GetVariationParamValue("TestTrial1", "x")); EXPECT_EQ("2", GetVariationParamValue("TestTrial1", "y")); @@ -141,7 +177,8 @@ TEST_F(FieldTrialUtilTest, const Study::Platform platform = all_platforms[i]; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { {"TestGroup", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { {"TestTrial", array_kFieldTrialConfig_experiments, 1} @@ -151,7 +188,10 @@ TEST_F(FieldTrialUtilTest, }; base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, platform); + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + &feature_list); EXPECT_EQ("1", GetVariationParamValue("TestTrial", "x")); EXPECT_EQ("2", GetVariationParamValue("TestTrial", "y")); @@ -173,7 +213,8 @@ TEST_F(FieldTrialUtilTest, {{"x", "1"}, {"y", "2"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { {"TestGroup", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {{"TestTrial", array_kFieldTrialConfig_experiments, 1}}; @@ -182,8 +223,9 @@ TEST_F(FieldTrialUtilTest, // The platforms don't match, so trial shouldn't be added. base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, - Study::PLATFORM_ANDROID_WEBVIEW); + AssociateParamsFromFieldTrialConfig(kConfig, override_callback_.callback(), + Study::PLATFORM_ANDROID_WEBVIEW, + &feature_list); EXPECT_EQ("", GetVariationParamValue("TestTrial", "x")); EXPECT_EQ("", GetVariationParamValue("TestTrial", "y")); @@ -202,7 +244,8 @@ TEST_F(FieldTrialUtilTest, {{"x", "1"}, {"y", "2"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { {"TestGroup", platforms, 2, {}, 0, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {{"TestTrial", array_kFieldTrialConfig_experiments, 1}}; @@ -211,8 +254,9 @@ TEST_F(FieldTrialUtilTest, // One of the platforms matches, so trial should be added. base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, - Study::PLATFORM_ANDROID_WEBVIEW); + AssociateParamsFromFieldTrialConfig(kConfig, override_callback_.callback(), + Study::PLATFORM_ANDROID_WEBVIEW, + &feature_list); EXPECT_EQ("1", GetVariationParamValue("TestTrial", "x")); EXPECT_EQ("2", GetVariationParamValue("TestTrial", "y")); @@ -235,7 +279,8 @@ TEST_F(FieldTrialUtilTest, {{"x", "1"}, {"y", "2"}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { {"TestGroup", &platform, 1, form_factors, 4, Study::OPTIONAL_BOOL_MISSING, - array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr}, + array_kFieldTrialConfig_params, 2, nullptr, 0, nullptr, 0, nullptr, + nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {{"TestTrial", array_kFieldTrialConfig_experiments, 1}}; @@ -244,7 +289,10 @@ TEST_F(FieldTrialUtilTest, // One of the form_factors matches, so trial should be added. base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, platform); + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + &feature_list); EXPECT_EQ("1", GetVariationParamValue("TestTrial", "x")); EXPECT_EQ("2", GetVariationParamValue("TestTrial", "y")); @@ -267,7 +315,7 @@ TEST_F(FieldTrialUtilTest, const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { {"TestGroup", &platform, 1, &form_factor, 1, Study::OPTIONAL_BOOL_MISSING, array_kFieldTrialConfig_params, 2, - nullptr, 0, nullptr, 0, nullptr}, + nullptr, 0, nullptr, 0, nullptr, nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { {"TestTrial", array_kFieldTrialConfig_experiments, 1} @@ -278,7 +326,10 @@ TEST_F(FieldTrialUtilTest, // One of the form_factors matches, so trial should be added. base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, platform); + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + &feature_list); EXPECT_EQ("1", GetVariationParamValue("TestTrial", "x")); EXPECT_EQ("2", GetVariationParamValue("TestTrial", "y")); @@ -307,7 +358,7 @@ TEST_F(FieldTrialUtilTest, const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { {"TestGroup", &platform, 1, &form_factor, 1, Study::OPTIONAL_BOOL_MISSING, array_kFieldTrialConfig_params, 2, - nullptr, 0, nullptr, 0, nullptr}, + nullptr, 0, nullptr, 0, nullptr, nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {{"TestTrial", array_kFieldTrialConfig_experiments, 1}}; @@ -316,8 +367,9 @@ TEST_F(FieldTrialUtilTest, // The form factor don't match, so trial shouldn't be added. base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, - Study::PLATFORM_ANDROID_WEBVIEW); + AssociateParamsFromFieldTrialConfig(kConfig, override_callback_.callback(), + Study::PLATFORM_ANDROID_WEBVIEW, + &feature_list); EXPECT_EQ("", GetVariationParamValue("TestTrial", "x")); EXPECT_EQ("", GetVariationParamValue("TestTrial", "y")); @@ -341,13 +393,13 @@ TEST_F(FieldTrialUtilTest, AssociateFeaturesFromFieldTrialConfig) { const Study::Platform platform = Study::PLATFORM_LINUX; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = { {"TestGroup1", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr, - 0, enable_features, 2, nullptr, 0, nullptr}, + 0, enable_features, 2, nullptr, 0, nullptr, nullptr, 0}, }; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = { {"TestGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr, - 0, nullptr, 0, disable_features, 2, nullptr}, + 0, nullptr, 0, disable_features, 2, nullptr, nullptr, 0}, {"TestGroup2-2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - nullptr, 0, nullptr, 0, nullptr, 0, nullptr}, + nullptr, 0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { @@ -360,7 +412,10 @@ TEST_F(FieldTrialUtilTest, AssociateFeaturesFromFieldTrialConfig) { }; std::unique_ptr feature_list(new base::FeatureList); - AssociateParamsFromFieldTrialConfig(kConfig, feature_list.get(), platform); + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + feature_list.get()); base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitWithFeatureList(std::move(feature_list)); @@ -381,20 +436,20 @@ TEST_F(FieldTrialUtilTest, AssociateForcingFlagsFromFieldTrialConfig) { const Study::Platform platform = Study::PLATFORM_LINUX; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = { {"TestGroup1", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr}}; + 0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0}}; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = { {"TestGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr}, + 0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0}, {"ForcedGroup2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - nullptr, 0, nullptr, 0, nullptr, 0, "flag-2"}, + nullptr, 0, nullptr, 0, nullptr, 0, "flag-2", nullptr, 0}, }; const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_2[] = { {"TestGroup3", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr}, + 0, nullptr, 0, nullptr, 0, nullptr, nullptr, 0}, {"ForcedGroup3", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - nullptr, 0, nullptr, 0, nullptr, 0, "flag-3"}, + nullptr, 0, nullptr, 0, nullptr, 0, "flag-3", nullptr, 0}, {"ForcedGroup3-2", &platform, 1, {}, 0, Study::OPTIONAL_BOOL_MISSING, - nullptr, 0, nullptr, 0, nullptr, 0, "flag-3-2"}, + nullptr, 0, nullptr, 0, nullptr, 0, "flag-3-2", nullptr, 0}, }; const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { {"TestTrial1", array_kFieldTrialConfig_experiments_0, 1}, @@ -409,13 +464,62 @@ TEST_F(FieldTrialUtilTest, AssociateForcingFlagsFromFieldTrialConfig) { base::CommandLine::ForCurrentProcess()->AppendSwitch("flag-3"); base::FeatureList feature_list; - AssociateParamsFromFieldTrialConfig(kConfig, &feature_list, platform); + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + &feature_list); EXPECT_EQ("TestGroup1", base::FieldTrialList::FindFullName("TestTrial1")); EXPECT_EQ("ForcedGroup2", base::FieldTrialList::FindFullName("TestTrial2")); EXPECT_EQ("ForcedGroup3", base::FieldTrialList::FindFullName("TestTrial3")); } +TEST_F(FieldTrialUtilTest, + AssociateParamsFromFieldTrialConfigWithUIStringOverrides) { + const Study::Platform platform = Study::PLATFORM_WINDOWS; + const FieldTrialTestingExperimentParams array_kFieldTrialConfig_params[] = + {{"x", "1"}, {"y", "2"}}; + const OverrideUIString array_kFieldTrialConfig_override_ui_string[] = + {{1234, "test1"}, {5678, "test2"}}; + const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = { + {"TestGroup", &platform, 1, nullptr, 0, + Study::OPTIONAL_BOOL_MISSING, array_kFieldTrialConfig_params, 2, + nullptr, 0, nullptr, 0, nullptr, + array_kFieldTrialConfig_override_ui_string, 2}, + }; + const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = { + {"TestTrial", array_kFieldTrialConfig_experiments, 1} + }; + const FieldTrialTestingConfig kConfig = { + array_kFieldTrialConfig_studies, 1 + }; + + // One of the form_factors matches, so trial should be added. + base::FeatureList feature_list; + AssociateParamsFromFieldTrialConfig(kConfig, + override_callback_.callback(), + platform, + &feature_list); + + EXPECT_EQ("1", GetVariationParamValue("TestTrial", "x")); + EXPECT_EQ("2", GetVariationParamValue("TestTrial", "y")); + + std::map params; + EXPECT_TRUE(GetVariationParams("TestTrial", ¶ms)); + EXPECT_EQ(2U, params.size()); + EXPECT_EQ("1", params["x"]); + EXPECT_EQ("2", params["y"]); + + EXPECT_EQ("TestGroup", base::FieldTrialList::FindFullName("TestTrial")); + const TestOverrideStringCallback::OverrideMap& overrides = + override_callback_.overrides(); + EXPECT_EQ(2u, overrides.size()); + auto it = overrides.find(1234); + EXPECT_EQ(base::ASCIIToUTF16("test1"), it->second); + it = overrides.find(5678); + EXPECT_EQ(base::ASCIIToUTF16("test2"), it->second); +} + TEST_F(FieldTrialUtilTest, TestEscapeValue) { std::string str = "trail.:/,*"; std::string escaped_str = EscapeValue(str); diff --git a/chromium/components/variations/pref_names.cc b/chromium/components/variations/pref_names.cc index 0a90905d9ae..2c950993043 100644 --- a/chromium/components/variations/pref_names.cc +++ b/chromium/components/variations/pref_names.cc @@ -33,12 +33,6 @@ const char kVariationsLastFetchTime[] = "variations_last_fetch_time"; const char kVariationsPermanentConsistencyCountry[] = "variations_permanent_consistency_country"; -// Previously used by CachingPermutedEntropyProvider, which has been replaced by -// NormalizedMurmurHashEntropyProvider. Deleted on startup. -// TODO(crbug/912368): Remove this after it's been deleted from most installs. -const char kVariationsPermutedEntropyCache[] = - "user_experience_metrics.permuted_entropy_cache"; - // String for the restrict parameter to be appended to the variations URL. const char kVariationsRestrictParameter[] = "variations_restrict_parameter"; diff --git a/chromium/components/variations/pref_names.h b/chromium/components/variations/pref_names.h index a058a544387..2b86485e707 100644 --- a/chromium/components/variations/pref_names.h +++ b/chromium/components/variations/pref_names.h @@ -17,7 +17,6 @@ extern const char kVariationsCrashStreak[]; extern const char kVariationsFailedToFetchSeedStreak[]; extern const char kVariationsLastFetchTime[]; extern const char kVariationsPermanentConsistencyCountry[]; -extern const char kVariationsPermutedEntropyCache[]; extern const char kVariationsRestrictParameter[]; extern const char kVariationsSafeCompressedSeed[]; extern const char kVariationsSafeSeedDate[]; diff --git a/chromium/components/variations/service/BUILD.gn b/chromium/components/variations/service/BUILD.gn index bdabd37ad8d..341c18e7744 100644 --- a/chromium/components/variations/service/BUILD.gn +++ b/chromium/components/variations/service/BUILD.gn @@ -38,7 +38,6 @@ static_library("service") { deps = [ ":buildflags", "//base", - "//components/data_use_measurement/core", "//components/encrypted_messages", "//components/language/core/browser", "//components/metrics", diff --git a/chromium/components/variations/service/DEPS b/chromium/components/variations/service/DEPS index 4ccdcd65e4c..0604104a317 100644 --- a/chromium/components/variations/service/DEPS +++ b/chromium/components/variations/service/DEPS @@ -1,5 +1,4 @@ include_rules = [ - "+components/data_use_measurement/core", "+components/encrypted_messages", "+components/language/core/browser", "+components/metrics", diff --git a/chromium/components/variations/service/generate_ui_string_overrider.py b/chromium/components/variations/service/generate_ui_string_overrider.py index 7be44c21c96..0b75bea1911 100755 --- a/chromium/components/variations/service/generate_ui_string_overrider.py +++ b/chromium/components/variations/service/generate_ui_string_overrider.py @@ -33,7 +33,7 @@ class HashCollisionError(Error): Resource = collections.namedtuple("Resource", ['hash', 'name', 'index']) -def _HashName(name): +def HashName(name): """Returns the hash id for a name. Args: @@ -76,7 +76,7 @@ def _GetResourceListFromString(resources_content): Returns: A sorted list of |Resource| objects. """ - resources = [Resource(_HashName(name), name, index) for name, index in + resources = [Resource(HashName(name), name, index) for name, index in _GetNameIndexPairsIter(resources_content)] # Deduplicate resources. Some name-index pairs appear in both chromium_ and diff --git a/chromium/components/variations/service/variations_field_trial_creator.cc b/chromium/components/variations/service/variations_field_trial_creator.cc index d91740aa25f..7c6a2a7e733 100644 --- a/chromium/components/variations/service/variations_field_trial_creator.cc +++ b/chromium/components/variations/service/variations_field_trial_creator.cc @@ -530,7 +530,12 @@ bool VariationsFieldTrialCreator::SetupFieldTrials( if (!command_line->HasSwitch(switches::kDisableFieldTrialTestingConfig) && !command_line->HasSwitch(::switches::kForceFieldTrials) && !command_line->HasSwitch(switches::kVariationsServerURL)) { - AssociateDefaultFieldTrialConfig(feature_list.get(), GetPlatform()); + // Note that passing base::Unretained(this) below is safe because the + // callback is executed synchronously. + AssociateDefaultFieldTrialConfig( + base::BindRepeating(&VariationsFieldTrialCreator::OverrideUIString, + base::Unretained(this)), + GetPlatform(), feature_list.get()); used_testing_config = true; } #endif // BUILDFLAG(FIELDTRIAL_TESTING_ENABLED) diff --git a/chromium/components/variations/service/variations_service.cc b/chromium/components/variations/service/variations_service.cc index c2807a85ec8..2066c217372 100644 --- a/chromium/components/variations/service/variations_service.cc +++ b/chromium/components/variations/service/variations_service.cc @@ -29,7 +29,6 @@ #include "base/values.h" #include "base/version.h" #include "build/build_config.h" -#include "components/data_use_measurement/core/data_use_user_data.h" #include "components/encrypted_messages/encrypted_message.pb.h" #include "components/encrypted_messages/message_encrypter.h" #include "components/metrics/clean_exit_beacon.h" @@ -554,9 +553,6 @@ bool VariationsService::DoFetchFromURL(const GURL& url, bool is_http_retry) { const char* supported_im = enable_deltas ? "x-bm,gzip" : "gzip"; resource_request->headers.SetHeader("A-IM", supported_im); - // TODO(https://crbug.com/808498): Re-add data use measurement once - // SimpleURLLoader supports it. - // ID=data_use_measurement::DataUseUserData::VARIATIONS pending_seed_request_ = network::SimpleURLLoader::Create( std::move(resource_request), traffic_annotation); // Ensure our callback is called even with "304 Not Modified" responses. diff --git a/chromium/components/variations/service/variations_service_unittest.cc b/chromium/components/variations/service/variations_service_unittest.cc index b7cc43fa64c..ace3b64bd14 100644 --- a/chromium/components/variations/service/variations_service_unittest.cc +++ b/chromium/components/variations/service/variations_service_unittest.cc @@ -557,8 +557,8 @@ TEST_F(VariationsServiceTest, InstanceManipulations) { std::string headers("HTTP/1.1 200 OK\n\n"); network::ResourceResponseHead head; - head.headers = new net::HttpResponseHeaders( - net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size())); + head.headers = base::MakeRefCounted( + net::HttpUtil::AssembleRawHeaders(headers)); if (!cases[i].im.empty()) head.headers->AddHeader(cases[i].im); network::URLLoaderCompletionStatus status; @@ -587,8 +587,8 @@ TEST_F(VariationsServiceTest, CountryHeader) { std::string headers("HTTP/1.1 200 OK\n\n"); network::ResourceResponseHead head; - head.headers = new net::HttpResponseHeaders( - net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size())); + head.headers = base::MakeRefCounted( + net::HttpUtil::AssembleRawHeaders(headers)); head.headers->AddHeader("X-Country: test"); network::URLLoaderCompletionStatus status; status.decoded_body_length = serialized_seed.size(); @@ -849,8 +849,8 @@ TEST_F(VariationsServiceTest, SafeMode_SuccessfulFetchClearsFailureStreaks) { std::string headers("HTTP/1.1 200 OK\n\n"); network::ResourceResponseHead head; - head.headers = new net::HttpResponseHeaders( - net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size())); + head.headers = base::MakeRefCounted( + net::HttpUtil::AssembleRawHeaders(headers)); head.headers->AddHeader(seed_signature_header); network::URLLoaderCompletionStatus status; status.decoded_body_length = response.size(); @@ -879,8 +879,8 @@ TEST_F(VariationsServiceTest, SafeMode_NotModifiedFetchClearsFailureStreaks) { std::string headers("HTTP/1.1 304 Not Modified\n\n"); network::ResourceResponseHead head; - head.headers = new net::HttpResponseHeaders( - net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size())); + head.headers = base::MakeRefCounted( + net::HttpUtil::AssembleRawHeaders(headers)); network::URLLoaderCompletionStatus status; service.test_url_loader_factory()->AddResponse(service.interception_url(), head, "", status); @@ -1019,8 +1019,8 @@ TEST_F(VariationsServiceTest, NullResponseReceivedWithHTTPOk) { std::string headers("HTTP/1.1 200 OK\n\n"); network::ResourceResponseHead head; - head.headers = new net::HttpResponseHeaders( - net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size())); + head.headers = base::MakeRefCounted( + net::HttpUtil::AssembleRawHeaders(headers)); EXPECT_EQ(net::HTTP_OK, head.headers->response_code()); head.headers->AddHeader(seed_signature_header); // Set ERR_FAILED status code despite the 200 response code. diff --git a/chromium/components/variations/study_filtering.h b/chromium/components/variations/study_filtering.h index 0448f121d0d..f062544a269 100644 --- a/chromium/components/variations/study_filtering.h +++ b/chromium/components/variations/study_filtering.h @@ -57,7 +57,7 @@ bool CheckStudyEndDate(const Study::Filter& filter, bool CheckStudyVersion(const Study::Filter& filter, const base::Version& version); -// checks whether a study is applicable for the given OS version per |filter|. +// Checks whether a study is applicable for the given OS version per |filter|. bool CheckStudyOSVersion(const Study::Filter& filter, const base::Version& os_version); diff --git a/chromium/components/variations/variations_associated_data_unittest.cc b/chromium/components/variations/variations_associated_data_unittest.cc index 71602a8fdc0..6a91b69443c 100644 --- a/chromium/components/variations/variations_associated_data_unittest.cc +++ b/chromium/components/variations/variations_associated_data_unittest.cc @@ -21,7 +21,7 @@ VariationID GetIDForTrial(IDCollectionKey key, base::FieldTrial* trial) { return GetGoogleVariationID(key, trial->trial_name(), trial->group_name()); } -// Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date. +// Call FieldTrialList::FactoryGetFieldTrial(). scoped_refptr CreateFieldTrial( const std::string& trial_name, int total_probability, @@ -29,7 +29,6 @@ scoped_refptr CreateFieldTrial( int* default_group_number) { return base::FieldTrialList::FactoryGetFieldTrial( trial_name, total_probability, default_group_name, - base::FieldTrialList::kNoExpirationYear, 1, 1, base::FieldTrial::SESSION_RANDOMIZED, default_group_number); } diff --git a/chromium/components/variations/variations_seed_processor.cc b/chromium/components/variations/variations_seed_processor.cc index 653cf2977ef..2a61928beaa 100644 --- a/chromium/components/variations/variations_seed_processor.cc +++ b/chromium/components/variations/variations_seed_processor.cc @@ -253,8 +253,7 @@ void VariationsSeedProcessor::CreateTrialFromStudy( scoped_refptr trial( base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed( study.name(), processed_study.total_probability(), - processed_study.GetDefaultExperimentName(), - base::FieldTrialList::kNoExpirationYear, 1, 1, randomization_type, + processed_study.GetDefaultExperimentName(), randomization_type, randomization_seed, nullptr, ShouldStudyUseLowEntropy(study) ? low_entropy_provider : nullptr)); diff --git a/chromium/components/variations/variations_seed_processor_unittest.cc b/chromium/components/variations/variations_seed_processor_unittest.cc index f41d36ecc39..5a6e7bbde82 100644 --- a/chromium/components/variations/variations_seed_processor_unittest.cc +++ b/chromium/components/variations/variations_seed_processor_unittest.cc @@ -896,8 +896,8 @@ TEST_F(VariationsSeedProcessorTest, ExistingFieldTrial_ExpiredByConfig) { // group than the study config, which is expired. This tests that we don't // crash in such a case. auto* trial = base::FieldTrialList::FactoryGetFieldTrial( - "Study1", 100, "ExistingDefault", base::FieldTrialList::kNoExpirationYear, - 1, 1, base::FieldTrial::SESSION_RANDOMIZED, nullptr); + "Study1", 100, "ExistingDefault", base::FieldTrial::SESSION_RANDOMIZED, + nullptr); trial->AppendGroup("A", 100); trial->SetForced(); -- cgit v1.2.1