15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/field_trial_synchronizer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/variations/variations_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This singleton instance should be constructed during the single threaded
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// portion of main(). It initializes globals to provide support for all future
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calls. This object is created on the UI thread, and it is destroyed after
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all the other threads have gone away.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FieldTrialSynchronizer* g_field_trial_synchronizer = NULL;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FieldTrialSynchronizer::FieldTrialSynchronizer() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(g_field_trial_synchronizer == NULL);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_field_trial_synchronizer = this;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FieldTrialList::AddObserver(this);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_variations::SetChildProcessLoggingVariationList();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FieldTrialSynchronizer::NotifyAllRenderers(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& field_trial_name,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To iterate over RenderProcessHosts, or to send messages to the hosts, we
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to be on the UI thread.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (content::RenderProcessHost::iterator it(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::RenderProcessHost::AllHostsIterator());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       !it.IsAtEnd(); it.Advance()) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    it.GetCurrentValue()->Send(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ChromeViewMsg_SetFieldTrialGroup(field_trial_name, group_name));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FieldTrialSynchronizer::OnFieldTrialGroupFinalized(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& field_trial_name,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name) {
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CHECK(!field_trial_name.empty() && !group_name.empty());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&FieldTrialSynchronizer::NotifyAllRenderers,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 this,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 field_trial_name,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 group_name));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_variations::SetChildProcessLoggingVariationList();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FieldTrialSynchronizer::~FieldTrialSynchronizer() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FieldTrialList::RemoveObserver(this);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_field_trial_synchronizer = NULL;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68