| Index: components/variations/variations_http_header_provider.cc
|
| diff --git a/components/variations/variations_http_header_provider.cc b/components/variations/variations_http_header_provider.cc
|
| index 885c8908fe74a400e3ccecff5e42fa6f375899f2..5af7151403c9a614a25ce1b46406f0e88fc626f4 100644
|
| --- a/components/variations/variations_http_header_provider.cc
|
| +++ b/components/variations/variations_http_header_provider.cc
|
| @@ -26,8 +26,7 @@
|
| return base::Singleton<VariationsHttpHeaderProvider>::get();
|
| }
|
|
|
| -std::string VariationsHttpHeaderProvider::GetClientDataHeader(
|
| - bool is_signed_in) {
|
| +std::string VariationsHttpHeaderProvider::GetClientDataHeader() {
|
| // Lazily initialize the header, if not already done, before attempting to
|
| // transmit it.
|
| InitVariationIDsCacheIfNeeded();
|
| @@ -35,9 +34,7 @@
|
| std::string variation_ids_header_copy;
|
| {
|
| base::AutoLock scoped_lock(lock_);
|
| - variation_ids_header_copy = is_signed_in
|
| - ? cached_variation_ids_header_signed_in_
|
| - : cached_variation_ids_header_;
|
| + variation_ids_header_copy = variation_ids_header_;
|
| }
|
| return variation_ids_header_copy;
|
| }
|
| @@ -51,11 +48,9 @@
|
| std::string ids_string = " ";
|
| {
|
| base::AutoLock scoped_lock(lock_);
|
| - for (const VariationIDEntry& entry : GetAllVariationIds()) {
|
| - if (entry.second == GOOGLE_WEB_PROPERTIES) {
|
| - ids_string.append(base::IntToString(entry.first));
|
| - ids_string.push_back(' ');
|
| - }
|
| + for (VariationID id : GetAllVariationIds()) {
|
| + ids_string.append(base::IntToString(id));
|
| + ids_string.push_back(' ');
|
| }
|
| }
|
| return ids_string;
|
| @@ -81,12 +76,15 @@
|
| return true;
|
| }
|
|
|
| +
|
| bool VariationsHttpHeaderProvider::SetDefaultVariationIds(
|
| const std::vector<std::string>& variation_ids) {
|
| default_variation_ids_set_.clear();
|
| + default_trigger_id_set_.clear();
|
| for (const std::string& entry : variation_ids) {
|
| if (entry.empty()) {
|
| default_variation_ids_set_.clear();
|
| + default_trigger_id_set_.clear();
|
| return false;
|
| }
|
| bool trigger_id =
|
| @@ -97,11 +95,13 @@
|
| int variation_id = 0;
|
| if (!base::StringToInt(trimmed_entry, &variation_id)) {
|
| default_variation_ids_set_.clear();
|
| + default_trigger_id_set_.clear();
|
| return false;
|
| }
|
| - default_variation_ids_set_.insert(VariationIDEntry(
|
| - variation_id,
|
| - trigger_id ? GOOGLE_WEB_PROPERTIES_TRIGGER : GOOGLE_WEB_PROPERTIES));
|
| + if (trigger_id)
|
| + default_trigger_id_set_.insert(variation_id);
|
| + else
|
| + default_variation_ids_set_.insert(variation_id);
|
| }
|
| return true;
|
| }
|
| @@ -123,13 +123,20 @@
|
| void VariationsHttpHeaderProvider::OnFieldTrialGroupFinalized(
|
| const std::string& trial_name,
|
| const std::string& group_name) {
|
| - base::AutoLock scoped_lock(lock_);
|
| - const size_t old_size = variation_ids_set_.size();
|
| - CacheVariationsId(trial_name, group_name, GOOGLE_WEB_PROPERTIES);
|
| - CacheVariationsId(trial_name, group_name, GOOGLE_WEB_PROPERTIES_SIGNED_IN);
|
| - CacheVariationsId(trial_name, group_name, GOOGLE_WEB_PROPERTIES_TRIGGER);
|
| - if (variation_ids_set_.size() != old_size)
|
| - UpdateVariationIDsHeaderValue();
|
| + VariationID new_id =
|
| + GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, trial_name, group_name);
|
| + VariationID new_trigger_id = GetGoogleVariationID(
|
| + GOOGLE_WEB_PROPERTIES_TRIGGER, trial_name, group_name);
|
| + if (new_id == EMPTY_ID && new_trigger_id == EMPTY_ID)
|
| + return;
|
| +
|
| + base::AutoLock scoped_lock(lock_);
|
| + if (new_id != EMPTY_ID)
|
| + variation_ids_set_.insert(new_id);
|
| + if (new_trigger_id != EMPTY_ID)
|
| + variation_trigger_ids_set_.insert(new_trigger_id);
|
| +
|
| + UpdateVariationIDsHeaderValue();
|
| }
|
|
|
| void VariationsHttpHeaderProvider::OnSyntheticTrialsChanged(
|
| @@ -138,18 +145,10 @@
|
|
|
| synthetic_variation_ids_set_.clear();
|
| for (const SyntheticTrialGroup& group : groups) {
|
| - VariationID id =
|
| + const VariationID id =
|
| GetGoogleVariationIDFromHashes(GOOGLE_WEB_PROPERTIES, group.id);
|
| - if (id != EMPTY_ID) {
|
| - synthetic_variation_ids_set_.insert(
|
| - VariationIDEntry(id, GOOGLE_WEB_PROPERTIES));
|
| - }
|
| - id = GetGoogleVariationIDFromHashes(GOOGLE_WEB_PROPERTIES_SIGNED_IN,
|
| - group.id);
|
| - if (id != EMPTY_ID) {
|
| - synthetic_variation_ids_set_.insert(
|
| - VariationIDEntry(id, GOOGLE_WEB_PROPERTIES_SIGNED_IN));
|
| - }
|
| + if (id != EMPTY_ID)
|
| + synthetic_variation_ids_set_.insert(id);
|
| }
|
| UpdateVariationIDsHeaderValue();
|
| }
|
| @@ -170,12 +169,18 @@
|
| base::FieldTrialList::GetActiveFieldTrialGroups(&initial_groups);
|
|
|
| for (const auto& entry : initial_groups) {
|
| - CacheVariationsId(entry.trial_name, entry.group_name,
|
| - GOOGLE_WEB_PROPERTIES);
|
| - CacheVariationsId(entry.trial_name, entry.group_name,
|
| - GOOGLE_WEB_PROPERTIES_SIGNED_IN);
|
| - CacheVariationsId(entry.trial_name, entry.group_name,
|
| - GOOGLE_WEB_PROPERTIES_TRIGGER);
|
| + const VariationID id =
|
| + GetGoogleVariationID(GOOGLE_WEB_PROPERTIES, entry.trial_name,
|
| + entry.group_name);
|
| + if (id != EMPTY_ID)
|
| + variation_ids_set_.insert(id);
|
| +
|
| + const VariationID trigger_id =
|
| + GetGoogleVariationID(GOOGLE_WEB_PROPERTIES_TRIGGER, entry.trial_name,
|
| + entry.group_name);
|
| +
|
| + if (trigger_id != EMPTY_ID)
|
| + variation_trigger_ids_set_.insert(trigger_id);
|
| }
|
| UpdateVariationIDsHeaderValue();
|
|
|
| @@ -187,90 +192,61 @@
|
| variation_ids_cache_initialized_ = true;
|
| }
|
|
|
| -void VariationsHttpHeaderProvider::CacheVariationsId(
|
| - const std::string& trial_name,
|
| - const std::string& group_name,
|
| - IDCollectionKey key) {
|
| - const VariationID id = GetGoogleVariationID(key, trial_name, group_name);
|
| - if (id != EMPTY_ID)
|
| - variation_ids_set_.insert(VariationIDEntry(id, key));
|
| -}
|
| -
|
| void VariationsHttpHeaderProvider::UpdateVariationIDsHeaderValue() {
|
| lock_.AssertAcquired();
|
|
|
| // The header value is a serialized protobuffer of Variation IDs which is
|
| // base64 encoded before transmitting as a string.
|
| - cached_variation_ids_header_.clear();
|
| - cached_variation_ids_header_signed_in_.clear();
|
| -
|
| + variation_ids_header_.clear();
|
| +
|
| + if (variation_ids_set_.empty() && default_variation_ids_set_.empty() &&
|
| + variation_trigger_ids_set_.empty() && default_trigger_id_set_.empty() &&
|
| + synthetic_variation_ids_set_.empty()) {
|
| + return;
|
| + }
|
| +
|
| + // This is the bottleneck for the creation of the header, so validate the size
|
| + // here. Force a hard maximum on the ID count in case the Variations server
|
| + // returns too many IDs and DOSs receiving servers with large requests.
|
| + const size_t total_id_count =
|
| + variation_ids_set_.size() + variation_trigger_ids_set_.size();
|
| + DCHECK_LE(total_id_count, 10U);
|
| + UMA_HISTOGRAM_COUNTS_100("Variations.Headers.ExperimentCount",
|
| + total_id_count);
|
| + if (total_id_count > 20)
|
| + return;
|
| +
|
| + std::set<VariationID> all_variation_ids_set = GetAllVariationIds();
|
| + std::set<VariationID> all_trigger_ids_set = default_trigger_id_set_;
|
| + for (VariationID id : variation_trigger_ids_set_)
|
| + all_trigger_ids_set.insert(id);
|
| +
|
| + ClientVariations proto;
|
| + for (VariationID id : all_variation_ids_set)
|
| + proto.add_variation_id(id);
|
| + for (VariationID id : all_trigger_ids_set)
|
| + proto.add_trigger_variation_id(id);
|
| +
|
| + std::string serialized;
|
| + proto.SerializeToString(&serialized);
|
| +
|
| + std::string hashed;
|
| + base::Base64Encode(serialized, &hashed);
|
| // If successful, swap the header value with the new one.
|
| // Note that the list of IDs and the header could be temporarily out of sync
|
| // if IDs are added as the header is recreated. The receiving servers are OK
|
| // with such discrepancies.
|
| - cached_variation_ids_header_ = GenerateBase64EncodedProto(false);
|
| - cached_variation_ids_header_signed_in_ = GenerateBase64EncodedProto(true);
|
| -}
|
| -
|
| -std::string VariationsHttpHeaderProvider::GenerateBase64EncodedProto(
|
| - bool is_signed_in) {
|
| - std::set<VariationIDEntry> all_variation_ids_set = GetAllVariationIds();
|
| -
|
| - ClientVariations proto;
|
| - for (const VariationIDEntry& entry : all_variation_ids_set) {
|
| - switch (entry.second) {
|
| - case GOOGLE_WEB_PROPERTIES_SIGNED_IN:
|
| - if (is_signed_in)
|
| - proto.add_variation_id(entry.first);
|
| - break;
|
| - case GOOGLE_WEB_PROPERTIES:
|
| - proto.add_variation_id(entry.first);
|
| - break;
|
| - case GOOGLE_WEB_PROPERTIES_TRIGGER:
|
| - proto.add_trigger_variation_id(entry.first);
|
| - break;
|
| - case CHROME_SYNC_SERVICE:
|
| - case ID_COLLECTION_COUNT:
|
| - // These cases included to get full enum coverage for switch, so that
|
| - // new enums introduce compiler warnings. Nothing to do for these.
|
| - break;
|
| - }
|
| - }
|
| -
|
| - const size_t total_id_count =
|
| - proto.variation_id_size() + proto.trigger_variation_id_size();
|
| -
|
| - if (total_id_count == 0)
|
| - return std::string();
|
| -
|
| - // This is the bottleneck for the creation of the header, so validate the size
|
| - // here. Force a hard maximum on the ID count in case the Variations server
|
| - // returns too many IDs and DOSs receiving servers with large requests.
|
| - DCHECK_LE(total_id_count, 10U);
|
| - UMA_HISTOGRAM_COUNTS_100("Variations.Headers.ExperimentCount",
|
| - total_id_count);
|
| - if (total_id_count > 20)
|
| - return std::string();
|
| -
|
| - std::string serialized;
|
| - proto.SerializeToString(&serialized);
|
| -
|
| - std::string hashed;
|
| - base::Base64Encode(serialized, &hashed);
|
| - return hashed;
|
| -}
|
| -
|
| -std::set<VariationsHttpHeaderProvider::VariationIDEntry>
|
| -VariationsHttpHeaderProvider::GetAllVariationIds() {
|
| + variation_ids_header_ = hashed;
|
| +}
|
| +
|
| +std::set<VariationID> VariationsHttpHeaderProvider::GetAllVariationIds() {
|
| lock_.AssertAcquired();
|
|
|
| - std::set<VariationIDEntry> all_variation_ids_set = default_variation_ids_set_;
|
| - for (const VariationIDEntry& entry : variation_ids_set_) {
|
| - all_variation_ids_set.insert(entry);
|
| - }
|
| - for (const VariationIDEntry& entry : synthetic_variation_ids_set_) {
|
| - all_variation_ids_set.insert(entry);
|
| - }
|
| + std::set<VariationID> all_variation_ids_set = default_variation_ids_set_;
|
| + for (VariationID id : variation_ids_set_)
|
| + all_variation_ids_set.insert(id);
|
| + for (VariationID id : synthetic_variation_ids_set_)
|
| + all_variation_ids_set.insert(id);
|
| return all_variation_ids_set;
|
| }
|
|
|
|
|