// Copyright (c) 2011 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. #include "chrome/browser/prerender/prerender_field_trial.h" #include "base/command_line.h" #include "base/logging.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram.h" #include "content/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/common/chrome_switches.h" namespace prerender { void ConfigurePrefetchAndPrerender(const CommandLine& command_line) { enum PrerenderOption { PRERENDER_OPTION_AUTO, PRERENDER_OPTION_DISABLED, PRERENDER_OPTION_ENABLED, PRERENDER_OPTION_PREFETCH_ONLY, }; PrerenderOption prerender_option = PRERENDER_OPTION_AUTO; if (command_line.HasSwitch(switches::kPrerender)) { const std::string switch_value = command_line.GetSwitchValueASCII(switches::kPrerender); if (switch_value == switches::kPrerenderSwitchValueAuto) { #if defined(OS_CHROMEOS) // Prerender is temporarily disabled on CrOS. // http://crosbug.com/12483 prerender_option = PRERENDER_OPTION_DISABLED; #else prerender_option = PRERENDER_OPTION_AUTO; #endif } else if (switch_value == switches::kPrerenderSwitchValueDisabled) { prerender_option = PRERENDER_OPTION_DISABLED; } else if (switch_value.empty() || switch_value == switches::kPrerenderSwitchValueEnabled) { // The empty string means the option was provided with no value, and that // means enable. prerender_option = PRERENDER_OPTION_ENABLED; } else if (switch_value == switches::kPrerenderSwitchValuePrefetchOnly) { prerender_option = PRERENDER_OPTION_PREFETCH_ONLY; } else { prerender_option = PRERENDER_OPTION_DISABLED; LOG(ERROR) << "Invalid --prerender option received on command line: " << switch_value; LOG(ERROR) << "Disabling prerendering!"; } } switch (prerender_option) { case PRERENDER_OPTION_AUTO: { const base::FieldTrial::Probability kPrefetchDivisor = 1000; const base::FieldTrial::Probability kYesPrefetchProbability = 0; const base::FieldTrial::Probability kPrerenderExp1Probability = 0; const base::FieldTrial::Probability kPrerenderControl1Probability = 0; const base::FieldTrial::Probability kPrerenderExp2Probability = 0; const base::FieldTrial::Probability kPrerenderControl2Probability = 0; scoped_refptr<base::FieldTrial> trial( new base::FieldTrial("Prefetch", kPrefetchDivisor, "ContentPrefetchDisabled", 2011, 6, 30)); const int kNoPrefetchGroup = trial->kDefaultGroupNumber; const int kYesPrefetchGroup = trial->AppendGroup("ContentPrefetchEnabled", kYesPrefetchProbability); const int kPrerenderExperiment1Group = trial->AppendGroup("ContentPrefetchPrerender1", kPrerenderExp1Probability); const int kPrerenderControl1Group = trial->AppendGroup("ContentPrefetchPrerenderControl1", kPrerenderControl1Probability); const int kPrerenderExperiment2Group = trial->AppendGroup("ContentPrefetchPrerender2", kPrerenderExp2Probability); const int kPrerenderControl2Group = trial->AppendGroup("ContentPrefetchPrerenderControl2", kPrerenderControl2Probability); const int trial_group = trial->group(); if (trial_group == kYesPrefetchGroup) { ResourceDispatcherHost::set_is_prefetch_enabled(true); PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); } else if (trial_group == kNoPrefetchGroup) { ResourceDispatcherHost::set_is_prefetch_enabled(false); PrerenderManager::SetMode( PrerenderManager::PRERENDER_MODE_DISABLED); } else if (trial_group == kPrerenderExperiment1Group || trial_group == kPrerenderExperiment2Group) { ResourceDispatcherHost::set_is_prefetch_enabled(true); PrerenderManager::SetMode( PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP); } else if (trial_group == kPrerenderControl1Group || trial_group == kPrerenderControl2Group) { ResourceDispatcherHost::set_is_prefetch_enabled(true); PrerenderManager::SetMode( PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); } else { NOTREACHED(); } break; } case PRERENDER_OPTION_DISABLED: ResourceDispatcherHost::set_is_prefetch_enabled(false); PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); break; case PRERENDER_OPTION_ENABLED: ResourceDispatcherHost::set_is_prefetch_enabled(true); PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_ENABLED); break; case PRERENDER_OPTION_PREFETCH_ONLY: ResourceDispatcherHost::set_is_prefetch_enabled(true); PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED); break; default: NOTREACHED(); } UMA_HISTOGRAM_ENUMERATION("Prerender.Sessions", PrerenderManager::GetMode(), PrerenderManager::PRERENDER_MODE_MAX); } } // namespace prerender