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/chrome_browser_field_trials.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/metrics/gzipped_protobufs_field_trial.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/omnibox/omnibox_field_trial.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/metrics/variations/uniformity_field_trials.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chrome_browser_field_trials_mobile.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chrome_browser_field_trials_desktop.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserFieldTrials::ChromeBrowserFieldTrials(
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const CommandLine& parsed_command_line)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : parsed_command_line_(parsed_command_line) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserFieldTrials::~ChromeBrowserFieldTrials() {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeBrowserFieldTrials::SetupFieldTrials(PrefService* local_state) {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Time install_time = base::Time::FromTimeT(
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      local_state->GetInt64(prefs::kInstallDate));
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!install_time.is_null());
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Field trials that are shared by all platforms.
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome_variations::SetupUniformityFieldTrials(install_time);
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  metrics::CreateGzippedProtobufsFieldTrial();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstantiateDynamicTrials();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::SetupMobileFieldTrials(
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      parsed_command_line_, install_time, local_state);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::SetupDesktopFieldTrials(
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      parsed_command_line_, install_time, local_state);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeBrowserFieldTrials::InstantiateDynamicTrials() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call |FindValue()| on the trials below, which may come from the server, to
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensure they get marked as "used" for the purposes of data reporting.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FieldTrialList::FindValue("UMA-Dynamic-Binary-Uniformity-Trial");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FieldTrialList::FindValue("UMA-Dynamic-Uniformity-Trial");
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FieldTrialList::FindValue("InstantDummy");
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FieldTrialList::FindValue("InstantChannel");
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FieldTrialList::FindValue("Test0PercentDefault");
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // MouseEventPreconnect trial is used from renderer process.
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Mark here so it will be sync-ed.
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::FieldTrialList::FindValue("MouseEventPreconnect");
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Activate the autocomplete dynamic field trials.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OmniboxFieldTrial::ActivateDynamicTrials();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68