1 // Copyright 2017 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "components/variations/variations_id_collection.h" 6 7 #include "base/bind_helpers.h" 8 #include "base/feature_list.h" 9 #include "base/metrics/field_trial_params.h" 10 #include "base/stl_util.h" 11 #include "base/time/time.h" 12 #include "components/variations/active_field_trials.h" 13 14 namespace variations { 15 VariationsIdCollection(IDCollectionKey collection_key,base::RepeatingCallback<void (VariationID)> new_id_callback)16VariationsIdCollection::VariationsIdCollection( 17 IDCollectionKey collection_key, 18 base::RepeatingCallback<void(VariationID)> new_id_callback) 19 : collection_key_(collection_key) { 20 base::FieldTrialList::AddObserver(this); 21 22 base::FieldTrial::ActiveGroups initial_groups; 23 base::FieldTrialList::GetActiveFieldTrialGroups(&initial_groups); 24 for (const base::FieldTrial::ActiveGroup& group : initial_groups) { 25 OnFieldTrialGroupFinalized(group.trial_name, group.group_name); 26 } 27 28 // Delay setting |new_id_callback_| until initialization is over. 29 new_id_callback_ = new_id_callback; 30 } 31 ~VariationsIdCollection()32VariationsIdCollection::~VariationsIdCollection() { 33 base::FieldTrialList::RemoveObserver(this); 34 } 35 OnFieldTrialGroupFinalized(const std::string & trial_name,const std::string & group_name)36void VariationsIdCollection::OnFieldTrialGroupFinalized( 37 const std::string& trial_name, 38 const std::string& group_name) { 39 const VariationID id = 40 GetGoogleVariationID(collection_key_, trial_name, group_name); 41 if (id != EMPTY_ID) { 42 bool modified = id_set_.insert(id).second; 43 if (modified && new_id_callback_) 44 new_id_callback_.Run(id); 45 } 46 } 47 GetIds()48const std::set<VariationID>& VariationsIdCollection::GetIds() { 49 return id_set_; 50 } 51 52 } // namespace variations 53