// 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_
