Commit 5fc1217c authored by bartn@chromium.org's avatar bartn@chromium.org

Introduce dynamic ablation of AutocompleteProviders using AC dynamic trials.

The idea is simple. Use Autocomplete dynamic field trial group names to indicate which providers should be disabled. This information, due to limitations in field trial design, is passed in the group name in a string form of "DisabledProviders_<bitmask>".

For instance, in order to run a SHORTCUTS ablation, one need to create a field trial with a group name that contains "DisabledProviders_512" (1<<9).

BUG=174694
TBR=sky@chromium.org

Review URL: https://chromiumcodereview.appspot.com/12220004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182018 0039d316-1c4b-4281-b951-d872f2087c98
parent f6f2fc61
......@@ -15,6 +15,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/time.h"
#include "chrome/browser/autocomplete/autocomplete_controller_delegate.h"
#include "chrome/browser/autocomplete/autocomplete_field_trial.h"
#include "chrome/browser/autocomplete/bookmark_provider.h"
#include "chrome/browser/autocomplete/builtin_provider.h"
#include "chrome/browser/autocomplete/extension_app_provider.h"
......@@ -94,6 +95,8 @@ AutocompleteController::AutocompleteController(
in_start_(false),
in_zero_suggest_(false),
profile_(profile) {
// AND with the disabled providers, if any.
provider_types &= ~AutocompleteFieldTrial::GetDisabledProviderTypes();
bool use_hqp = !!(provider_types & AutocompleteProvider::TYPE_HISTORY_QUICK);
// TODO(mrossetti): Permanently modify the HistoryURLProvider to not search
// titles once HQP is turned on permanently.
......
......@@ -7,6 +7,7 @@
#include <string>
#include "base/metrics/field_trial.h"
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/common/metrics/metrics_util.h"
......@@ -105,10 +106,10 @@ const base::FieldTrial::Probability
// Field trial IDs.
// Though they are not literally "const", they are set only once, in
// Activate() below.
// ActivateStaticTrials() below.
// Whether the static field trials have been initialized by
// ActivateStaticTrials method.
// ActivateStaticTrials() method.
bool static_field_trials_initialized = false;
// Field trial ID for the disallow-inline History Quick Provider
......@@ -137,8 +138,14 @@ int hqp_only_count_matches_at_word_boundaries_experiment_group = 0;
// experiment group.
int hqp_use_cursor_position_experiment_group = 0;
// Concatenates the autocomplete dynamic field trial prefix with a field trial
// ID to form a complete autocomplete field trial name.
std::string DynamicFieldTrialName(int id) {
return base::StringPrintf("%s%d", kAutocompleteDynamicFieldTrialPrefix, id);
}
} // namespace
void AutocompleteFieldTrial::ActivateStaticTrials() {
DCHECK(!static_field_trials_initialized);
......@@ -261,11 +268,38 @@ void AutocompleteFieldTrial::ActivateStaticTrials() {
}
void AutocompleteFieldTrial::ActivateDynamicTrials() {
// Initialize all autocomplete dynamic field trials.
// Initialize all autocomplete dynamic field trials. This method may be
// called multiple times.
for (int i = 0; i < kMaxAutocompleteDynamicFieldTrials; ++i)
base::FieldTrialList::FindValue(DynamicFieldTrialName(i));
}
int AutocompleteFieldTrial::GetDisabledProviderTypes() {
// Make sure that Autocomplete dynamic field trials are activated. It's OK to
// call this method multiple times.
ActivateDynamicTrials();
// Look for group names in form of "DisabledProviders_<mask>" where "mask"
// is a bitmap of disabled provider types (AutocompleteProvider::Type).
int provider_types = 0;
for (int i = 0; i < kMaxAutocompleteDynamicFieldTrials; ++i) {
base::FieldTrialList::FindValue(
base::StringPrintf("%s%d", kAutocompleteDynamicFieldTrialPrefix, i));
std::string group_name = base::FieldTrialList::FindFullName(
DynamicFieldTrialName(i));
const char kDisabledProviders[] = "DisabledProviders_";
if (!StartsWithASCII(group_name, kDisabledProviders, true))
continue;
int types = 0;
if (!base::StringToInt(base::StringPiece(
group_name.substr(strlen(kDisabledProviders))), &types)) {
LOG(WARNING) << "Malformed DisabledProviders string: " << group_name;
continue;
}
if (types == 0)
LOG(WARNING) << "Expecting a non-zero bitmap; group = " << group_name;
else
provider_types |= types;
}
return provider_types;
}
bool AutocompleteFieldTrial::InDisallowInlineHQPFieldTrial() {
......
......@@ -24,6 +24,14 @@ class AutocompleteFieldTrial {
// This method, unlike ActivateStaticTrials(), may be called multiple times.
static void ActivateDynamicTrials();
// Returns a bitmap containing AutocompleteProvider::Type values
// that should be disabled in AutocompleteController.
// This method simply goes over all autocomplete dynamic field trial groups
// and looks for group names like "ProvidersDisabled_NNN" where NNN is
// an integer corresponding to a bitmap mask. All extracted bitmaps
// are OR-ed together and returned as the final result.
static int GetDisabledProviderTypes();
// ---------------------------------------------------------
// For the inline History Quick Provider field trial.
......
// Copyright (c) 2013 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/autocomplete/autocomplete_field_trial.h"
#include "base/basictypes.h"
#include "base/metrics/field_trial.h"
#include "base/string16.h"
#include "chrome/common/metrics/entropy_provider.h"
#include "testing/gtest/include/gtest/gtest.h"
class AutocompleteFieldTrialTest : public testing::Test {
public:
AutocompleteFieldTrialTest() {}
static void SetUpTestCase() {
ResetFieldTrialList();
}
static void TearDownTestCase() {
delete field_trial_list_;
field_trial_list_ = NULL;
}
static void ResetFieldTrialList() {
// It's important to delete the old pointer first which sets
// FieldTrialList::global_ to NULL.
if (field_trial_list_)
delete field_trial_list_;
field_trial_list_ = new base::FieldTrialList(
new metrics::SHA1EntropyProvider("foo"));
AutocompleteFieldTrial::ActivateDynamicTrials();
}
// Creates and activates a field trial.
static base::FieldTrial* CreateTestTrial(const std::string& name,
const std::string& group_name) {
base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
name, group_name);
trial->group();
return trial;
}
private:
// Needed for Activate{Static/Dynamic}Trials().
static base::FieldTrialList* field_trial_list_;
DISALLOW_COPY_AND_ASSIGN(AutocompleteFieldTrialTest);
};
// static
base::FieldTrialList* AutocompleteFieldTrialTest::field_trial_list_ = NULL;
// Test if GetDisabledProviderTypes() properly parses various field trial
// group names.
TEST_F(AutocompleteFieldTrialTest, GetDisabledProviderTypes) {
EXPECT_EQ(0, AutocompleteFieldTrial::GetDisabledProviderTypes());
{
SCOPED_TRACE("Invalid groups");
CreateTestTrial("AutocompleteDynamicTrial_0", "DisabledProviders_");
EXPECT_EQ(0, AutocompleteFieldTrial::GetDisabledProviderTypes());
ResetFieldTrialList();
CreateTestTrial("AutocompleteDynamicTrial_1", "DisabledProviders_XXX");
EXPECT_EQ(0, AutocompleteFieldTrial::GetDisabledProviderTypes());
ResetFieldTrialList();
CreateTestTrial("AutocompleteDynamicTrial_1", "DisabledProviders_12abc");
EXPECT_EQ(0, AutocompleteFieldTrial::GetDisabledProviderTypes());
}
{
SCOPED_TRACE("Valid group name, unsupported trial name.");
ResetFieldTrialList();
CreateTestTrial("UnsupportedTrialName", "DisabledProviders_20");
EXPECT_EQ(0, AutocompleteFieldTrial::GetDisabledProviderTypes());
}
{
SCOPED_TRACE("Valid field and group name.");
ResetFieldTrialList();
CreateTestTrial("AutocompleteDynamicTrial_2", "DisabledProviders_3");
EXPECT_EQ(3, AutocompleteFieldTrial::GetDisabledProviderTypes());
// Two groups should be OR-ed together.
CreateTestTrial("AutocompleteDynamicTrial_3", "DisabledProviders_6");
EXPECT_EQ(7, AutocompleteFieldTrial::GetDisabledProviderTypes());
}
}
......@@ -441,6 +441,7 @@
# All unittests in browser, common, renderer and service.
'browser/about_flags_unittest.cc',
'browser/app_controller_mac_unittest.mm',
'browser/autocomplete/autocomplete_field_trial_unittest.cc',
'browser/autocomplete/autocomplete_input_unittest.cc',
'browser/autocomplete/autocomplete_match_unittest.cc',
'browser/autocomplete/autocomplete_provider_unittest.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment