|  | // Copyright (c) 2012 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. | 
|  |  | 
|  | #ifndef CHROME_BROWSER_METRICS_FIELD_TRIAL_SYNCHRONIZER_H_ | 
|  | #define CHROME_BROWSER_METRICS_FIELD_TRIAL_SYNCHRONIZER_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/basictypes.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/metrics/field_trial.h" | 
|  |  | 
|  | // This class is used by the browser process to communicate FieldTrial setting | 
|  | // (field trial name and group) to any previously started renderers. | 
|  | // | 
|  | // This class registers itself as an observer of FieldTrialList. FieldTrialList | 
|  | // notifies this class by calling it's OnFieldTrialGroupFinalized method when a | 
|  | // group is selected (finalized) for a FieldTrial and OnFieldTrialGroupFinalized | 
|  | // method sends the FieldTrial's name and the group to all renderer processes. | 
|  | // Each renderer process creates the FieldTrial, and by using a 100% probability | 
|  | // for the FieldTrial, forces the FieldTrial to have the same group string. | 
|  |  | 
|  | class FieldTrialSynchronizer | 
|  | : public base::RefCountedThreadSafe<FieldTrialSynchronizer>, | 
|  | public base::FieldTrialList::Observer { | 
|  | public: | 
|  | // Construction also sets up the global singleton instance.  This instance is | 
|  | // used to communicate between the UI and other threads, and is destroyed only | 
|  | // as the main thread (browser_main) terminates, which means all other threads | 
|  | // have completed, and will not need this instance any further. It adds itself | 
|  | // as an observer of FieldTrialList so that it gets notified whenever a group | 
|  | // is finalized in the browser process. | 
|  | FieldTrialSynchronizer(); | 
|  |  | 
|  | // Notify all renderer processes about the |group_name| that is finalized for | 
|  | // the given field trail (|field_trial_name|). This is called on UI thread. | 
|  | void NotifyAllRenderers(const std::string& field_trial_name, | 
|  | const std::string& group_name); | 
|  |  | 
|  | // FieldTrialList::Observer methods: | 
|  |  | 
|  | // This method is called by the FieldTrialList singleton when a trial's group | 
|  | // is finalized. This method contacts all renderers (by calling | 
|  | // NotifyAllRenderers) to create a FieldTrial that carries the randomly | 
|  | // selected state from the browser process into all the renderer processes. | 
|  | virtual void OnFieldTrialGroupFinalized( | 
|  | const std::string& name, | 
|  | const std::string& group_name) OVERRIDE; | 
|  |  | 
|  | private: | 
|  | friend class base::RefCountedThreadSafe<FieldTrialSynchronizer>; | 
|  | virtual ~FieldTrialSynchronizer(); | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(FieldTrialSynchronizer); | 
|  | }; | 
|  |  | 
|  | #endif  // CHROME_BROWSER_METRICS_FIELD_TRIAL_SYNCHRONIZER_H_ |