Commit e084b1b2 authored by sreeram@chromium.org's avatar sreeram@chromium.org

Add a new field trial for Instant.

The new field trial (SUGGEST) is almost the same as HIDDEN, except that the
Instant suggested text is allowed to be autocompleted into the omnibox. Since
the hidden tab contains results for the full query, it's more likely to be
relevant when the user presses <Enter>. From the user perspective, the omnibox
autocompletion is similar to how it behaves for past searches.

BUG=none
TEST=With --instant-field-trial=suggest, type into the omnibox, and observe
that it gets inline autocompleted, even though there's no Instant preview.


Review URL: http://codereview.chromium.org/8588003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110463 0039d316-1c4b-4281-b951-d872f2087c98
parent 3bbabb5a
...@@ -933,3 +933,48 @@ IN_PROC_BROWSER_TEST_F(InstantFieldTrialSilentTest, MAYBE(ExperimentEnabled)) { ...@@ -933,3 +933,48 @@ IN_PROC_BROWSER_TEST_F(InstantFieldTrialSilentTest, MAYBE(ExperimentEnabled)) {
EXPECT_FALSE(instant()->IsCurrent()); EXPECT_FALSE(instant()->IsCurrent());
EXPECT_EQ(preview_tab, browser()->GetSelectedTabContents()); EXPECT_EQ(preview_tab, browser()->GetSelectedTabContents());
} }
// Tests the SUGGEST experiment of the field trial.
class InstantFieldTrialSuggestTest : public InstantTest {
public:
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
command_line->AppendSwitchASCII(switches::kInstantFieldTrial,
switches::kInstantFieldTrialSuggest);
}
};
// Tests that instant is active, even without calling EnableInstant().
IN_PROC_BROWSER_TEST_F(InstantFieldTrialSuggestTest, MAYBE(ExperimentEnabled)) {
// Check that instant is enabled, despite not setting the preference.
Profile* profile = browser()->profile();
EXPECT_FALSE(profile->GetPrefs()->GetBoolean(prefs::kInstantEnabled));
EXPECT_TRUE(InstantController::IsEnabled(profile));
ASSERT_TRUE(test_server()->Start());
SetupInstantProvider("instant.html");
DetermineInstantSupport();
// Type into the omnibox, but don't press <Enter> yet.
omnibox()->SetUserText(ASCIIToUTF16("def"));
ASSERT_TRUE(WaitForMessageToBeProcessedByRenderer());
// Check that instant is active, but the preview is not showing.
EXPECT_TRUE(preview());
EXPECT_TRUE(loader()->ready());
EXPECT_FALSE(instant()->is_displayable());
EXPECT_FALSE(instant()->IsCurrent());
// Check that the suggested text has actually been set in the omnibox.
EXPECT_EQ("defghi", GetSuggestion());
EXPECT_EQ("defghi", UTF16ToUTF8(omnibox()->GetText()));
// Press <Enter> in the omnibox, causing the preview to be committed.
TabContents* preview_tab = preview()->tab_contents();
ASSERT_TRUE(PressEnter());
// The preview contents should now be the active tab contents.
EXPECT_FALSE(preview());
EXPECT_FALSE(instant()->is_displayable());
EXPECT_FALSE(instant()->IsCurrent());
EXPECT_EQ(preview_tab, browser()->GetSelectedTabContents());
}
...@@ -424,7 +424,7 @@ void InstantController::SetSuggestedTextFor( ...@@ -424,7 +424,7 @@ void InstantController::SetSuggestedTextFor(
const string16& text, const string16& text,
InstantCompleteBehavior behavior) { InstantCompleteBehavior behavior) {
if (!is_out_of_date_ && if (!is_out_of_date_ &&
!InstantFieldTrial::IsHiddenExperiment(tab_contents_->profile())) { InstantFieldTrial::ShouldSetSuggestedText(tab_contents_->profile())) {
delegate_->SetSuggestedText(text, behavior); delegate_->SetSuggestedText(text, behavior);
} }
} }
...@@ -497,14 +497,13 @@ void InstantController::UpdateLoader(const TemplateURL* template_url, ...@@ -497,14 +497,13 @@ void InstantController::UpdateLoader(const TemplateURL* template_url,
bool verbatim, bool verbatim,
string16* suggested_text) { string16* suggested_text) {
is_out_of_date_ = false; is_out_of_date_ = false;
bool hidden = InstantFieldTrial::IsHiddenExperiment(tab_contents_->profile()); if (!InstantFieldTrial::IsHiddenExperiment(tab_contents_->profile()))
if (!hidden)
loader_->SetOmniboxBounds(omnibox_bounds_); loader_->SetOmniboxBounds(omnibox_bounds_);
loader_->Update(tab_contents_, template_url, url, transition_type, user_text, loader_->Update(tab_contents_, template_url, url, transition_type, user_text,
verbatim, suggested_text); verbatim, suggested_text);
UpdateIsDisplayable(); UpdateIsDisplayable();
// For the HIDDEN and SILENT field trials, don't send back suggestions. // For the HIDDEN and SILENT field trials, don't send back suggestions.
if (hidden) if (!InstantFieldTrial::ShouldSetSuggestedText(tab_contents_->profile()))
suggested_text->clear(); suggested_text->clear();
} }
......
...@@ -19,13 +19,19 @@ namespace { ...@@ -19,13 +19,19 @@ namespace {
// file for what these groups represent. // file for what these groups represent.
int g_instant_experiment_a = 0; int g_instant_experiment_a = 0;
int g_instant_experiment_b = 0; int g_instant_experiment_b = 0;
int g_hidden_experiment_a = 0; int g_hidden_experiment_a = 0;
int g_hidden_experiment_b = 0; int g_hidden_experiment_b = 0;
int g_silent_experiment_a = 0; int g_silent_experiment_a = 0;
int g_silent_experiment_b = 0; int g_silent_experiment_b = 0;
int g_suggest_experiment_a = 0;
int g_suggest_experiment_b = 0;
int g_uma_control_a = 0; int g_uma_control_a = 0;
int g_uma_control_b = 0; int g_uma_control_b = 0;
int g_all_control_a = 0; int g_all_control_a = 0;
int g_all_control_b = 0; int g_all_control_b = 0;
...@@ -43,13 +49,19 @@ void InstantFieldTrial::Activate() { ...@@ -43,13 +49,19 @@ void InstantFieldTrial::Activate() {
// Each group is of total size 10% (5% each for the _a and _b variants). // Each group is of total size 10% (5% each for the _a and _b variants).
g_instant_experiment_a = trial->AppendGroup("InstantExperimentA", 50); g_instant_experiment_a = trial->AppendGroup("InstantExperimentA", 50);
g_instant_experiment_b = trial->AppendGroup("InstantExperimentB", 50); g_instant_experiment_b = trial->AppendGroup("InstantExperimentB", 50);
g_hidden_experiment_a = trial->AppendGroup("HiddenExperimentA", 50); g_hidden_experiment_a = trial->AppendGroup("HiddenExperimentA", 50);
g_hidden_experiment_b = trial->AppendGroup("HiddenExperimentB", 50); g_hidden_experiment_b = trial->AppendGroup("HiddenExperimentB", 50);
g_silent_experiment_a = trial->AppendGroup("SilentExperimentA", 50); g_silent_experiment_a = trial->AppendGroup("SilentExperimentA", 50);
g_silent_experiment_b = trial->AppendGroup("SilentExperimentB", 50); g_silent_experiment_b = trial->AppendGroup("SilentExperimentB", 50);
g_suggest_experiment_a = trial->AppendGroup("SuggestExperimentA", 50);
g_suggest_experiment_b = trial->AppendGroup("SuggestExperimentB", 50);
g_uma_control_a = trial->AppendGroup("UmaControlA", 50); g_uma_control_a = trial->AppendGroup("UmaControlA", 50);
g_uma_control_b = trial->AppendGroup("UmaControlB", 50); g_uma_control_b = trial->AppendGroup("UmaControlB", 50);
g_all_control_a = trial->AppendGroup("AllControlA", 50); g_all_control_a = trial->AppendGroup("AllControlA", 50);
g_all_control_b = trial->AppendGroup("AllControlB", 50); g_all_control_b = trial->AppendGroup("AllControlB", 50);
} }
...@@ -66,6 +78,8 @@ InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) { ...@@ -66,6 +78,8 @@ InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) {
return HIDDEN_EXPERIMENT_A; return HIDDEN_EXPERIMENT_A;
else if (switch_value == switches::kInstantFieldTrialSilent) else if (switch_value == switches::kInstantFieldTrialSilent)
return SILENT_EXPERIMENT_A; return SILENT_EXPERIMENT_A;
else if (switch_value == switches::kInstantFieldTrialSuggest)
return SUGGEST_EXPERIMENT_A;
else else
return INACTIVE; return INACTIVE;
} }
...@@ -88,6 +102,7 @@ InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) { ...@@ -88,6 +102,7 @@ InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) {
return SILENT_EXPERIMENT_A; return SILENT_EXPERIMENT_A;
if (group == g_silent_experiment_b) if (group == g_silent_experiment_b)
return SILENT_EXPERIMENT_B; return SILENT_EXPERIMENT_B;
if (group == g_all_control_a) if (group == g_all_control_a)
return ALL_CONTROL_A; return ALL_CONTROL_A;
if (group == g_all_control_b) if (group == g_all_control_b)
...@@ -104,10 +119,17 @@ InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) { ...@@ -104,10 +119,17 @@ InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) {
return INSTANT_EXPERIMENT_A; return INSTANT_EXPERIMENT_A;
if (group == g_instant_experiment_b) if (group == g_instant_experiment_b)
return INSTANT_EXPERIMENT_B; return INSTANT_EXPERIMENT_B;
if (group == g_hidden_experiment_a) if (group == g_hidden_experiment_a)
return HIDDEN_EXPERIMENT_A; return HIDDEN_EXPERIMENT_A;
if (group == g_hidden_experiment_b) if (group == g_hidden_experiment_b)
return HIDDEN_EXPERIMENT_B; return HIDDEN_EXPERIMENT_B;
if (group == g_suggest_experiment_a)
return SUGGEST_EXPERIMENT_A;
if (group == g_suggest_experiment_b)
return SUGGEST_EXPERIMENT_B;
if (group == g_uma_control_a) if (group == g_uma_control_a)
return UMA_CONTROL_A; return UMA_CONTROL_A;
if (group == g_uma_control_b) if (group == g_uma_control_b)
...@@ -122,14 +144,16 @@ bool InstantFieldTrial::IsInstantExperiment(Profile* profile) { ...@@ -122,14 +144,16 @@ bool InstantFieldTrial::IsInstantExperiment(Profile* profile) {
Group group = GetGroup(profile); Group group = GetGroup(profile);
return group == INSTANT_EXPERIMENT_A || group == INSTANT_EXPERIMENT_B || return group == INSTANT_EXPERIMENT_A || group == INSTANT_EXPERIMENT_B ||
group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B || group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B ||
group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B; group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B ||
group == SUGGEST_EXPERIMENT_A || group == SUGGEST_EXPERIMENT_B;
} }
// static // static
bool InstantFieldTrial::IsHiddenExperiment(Profile* profile) { bool InstantFieldTrial::IsHiddenExperiment(Profile* profile) {
Group group = GetGroup(profile); Group group = GetGroup(profile);
return group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B || return group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B ||
group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B; group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B ||
group == SUGGEST_EXPERIMENT_A || group == SUGGEST_EXPERIMENT_B;
} }
// static // static
...@@ -145,13 +169,19 @@ std::string InstantFieldTrial::GetGroupName(Profile* profile) { ...@@ -145,13 +169,19 @@ std::string InstantFieldTrial::GetGroupName(Profile* profile) {
case INSTANT_EXPERIMENT_A: return "_InstantExperimentA"; case INSTANT_EXPERIMENT_A: return "_InstantExperimentA";
case INSTANT_EXPERIMENT_B: return "_InstantExperimentB"; case INSTANT_EXPERIMENT_B: return "_InstantExperimentB";
case HIDDEN_EXPERIMENT_A: return "_HiddenExperimentA"; case HIDDEN_EXPERIMENT_A: return "_HiddenExperimentA";
case HIDDEN_EXPERIMENT_B: return "_HiddenExperimentB"; case HIDDEN_EXPERIMENT_B: return "_HiddenExperimentB";
case SILENT_EXPERIMENT_A: return "_SilentExperimentA"; case SILENT_EXPERIMENT_A: return "_SilentExperimentA";
case SILENT_EXPERIMENT_B: return "_SilentExperimentB"; case SILENT_EXPERIMENT_B: return "_SilentExperimentB";
case SUGGEST_EXPERIMENT_A: return "_SuggestExperimentA";
case SUGGEST_EXPERIMENT_B: return "_SuggestExperimentB";
case UMA_CONTROL_A: return "_UmaControlA"; case UMA_CONTROL_A: return "_UmaControlA";
case UMA_CONTROL_B: return "_UmaControlB"; case UMA_CONTROL_B: return "_UmaControlB";
case ALL_CONTROL_A: return "_AllControlA"; case ALL_CONTROL_A: return "_AllControlA";
case ALL_CONTROL_B: return "_AllControlB"; case ALL_CONTROL_B: return "_AllControlB";
} }
...@@ -167,13 +197,19 @@ std::string InstantFieldTrial::GetGroupAsUrlParam(Profile* profile) { ...@@ -167,13 +197,19 @@ std::string InstantFieldTrial::GetGroupAsUrlParam(Profile* profile) {
case INSTANT_EXPERIMENT_A: return "ix=iea&"; case INSTANT_EXPERIMENT_A: return "ix=iea&";
case INSTANT_EXPERIMENT_B: return "ix=ieb&"; case INSTANT_EXPERIMENT_B: return "ix=ieb&";
case HIDDEN_EXPERIMENT_A: return "ix=hea&"; case HIDDEN_EXPERIMENT_A: return "ix=hea&";
case HIDDEN_EXPERIMENT_B: return "ix=heb&"; case HIDDEN_EXPERIMENT_B: return "ix=heb&";
case SILENT_EXPERIMENT_A: return "ix=sea&"; case SILENT_EXPERIMENT_A: return "ix=sea&";
case SILENT_EXPERIMENT_B: return "ix=seb&"; case SILENT_EXPERIMENT_B: return "ix=seb&";
case SUGGEST_EXPERIMENT_A: return "ix=tea&";
case SUGGEST_EXPERIMENT_B: return "ix=teb&";
case UMA_CONTROL_A: return "ix=uca&"; case UMA_CONTROL_A: return "ix=uca&";
case UMA_CONTROL_B: return "ix=ucb&"; case UMA_CONTROL_B: return "ix=ucb&";
case ALL_CONTROL_A: return "ix=aca&"; case ALL_CONTROL_A: return "ix=aca&";
case ALL_CONTROL_B: return "ix=acb&"; case ALL_CONTROL_B: return "ix=acb&";
} }
...@@ -181,3 +217,10 @@ std::string InstantFieldTrial::GetGroupAsUrlParam(Profile* profile) { ...@@ -181,3 +217,10 @@ std::string InstantFieldTrial::GetGroupAsUrlParam(Profile* profile) {
NOTREACHED(); NOTREACHED();
return std::string(); return std::string();
} }
// static
bool InstantFieldTrial::ShouldSetSuggestedText(Profile* profile) {
Group group = GetGroup(profile);
return !(group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B ||
group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B);
}
...@@ -28,11 +28,15 @@ class Profile; ...@@ -28,11 +28,15 @@ class Profile;
// //
// HIDDEN_EXPERIMENT: Queries are issued as the user types, but no preview is // HIDDEN_EXPERIMENT: Queries are issued as the user types, but no preview is
// shown until they press <Enter>. If the user hasn't opted to send metrics // shown until they press <Enter>. If the user hasn't opted to send metrics
// (UMA) data, they are bounced back to INACTIVE. // (UMA) data, they are bounced back to INACTIVE. Suggestions obtained from
// Instant are not propagated back to the omnibox.
// //
// SILENT_EXPERIMENT: No queries are issued until the user presses <Enter>. No // SILENT_EXPERIMENT: No queries are issued until the user presses <Enter>. No
// previews are shown. The user is not required to send metrics (UMA) data. // previews are shown. The user is not required to send metrics (UMA) data.
// //
// SUGGEST_EXPERIMENT: Same as HIDDEN, except that the Instant suggestions are
// autocompleted inline into the omnibox.
//
// UMA_CONTROL: Instant is disabled. If the user hasn't opted to send metrics // UMA_CONTROL: Instant is disabled. If the user hasn't opted to send metrics
// (UMA) data, they are bounced back to INACTIVE. // (UMA) data, they are bounced back to INACTIVE.
// //
...@@ -51,13 +55,19 @@ class InstantFieldTrial { ...@@ -51,13 +55,19 @@ class InstantFieldTrial {
INSTANT_EXPERIMENT_A, INSTANT_EXPERIMENT_A,
INSTANT_EXPERIMENT_B, INSTANT_EXPERIMENT_B,
HIDDEN_EXPERIMENT_A, HIDDEN_EXPERIMENT_A,
HIDDEN_EXPERIMENT_B, HIDDEN_EXPERIMENT_B,
SILENT_EXPERIMENT_A, SILENT_EXPERIMENT_A,
SILENT_EXPERIMENT_B, SILENT_EXPERIMENT_B,
SUGGEST_EXPERIMENT_A,
SUGGEST_EXPERIMENT_B,
UMA_CONTROL_A, UMA_CONTROL_A,
UMA_CONTROL_B, UMA_CONTROL_B,
ALL_CONTROL_A, ALL_CONTROL_A,
ALL_CONTROL_B, ALL_CONTROL_B,
}; };
...@@ -72,7 +82,7 @@ class InstantFieldTrial { ...@@ -72,7 +82,7 @@ class InstantFieldTrial {
// Check if the user is in any of the EXPERIMENT groups. // Check if the user is in any of the EXPERIMENT groups.
static bool IsInstantExperiment(Profile* profile); static bool IsInstantExperiment(Profile* profile);
// Check if the user is in the HIDDEN or SILENT EXPERIMENT groups. // Check if the user is in the HIDDEN, SILENT or SUGGEST EXPERIMENT groups.
static bool IsHiddenExperiment(Profile* profile); static bool IsHiddenExperiment(Profile* profile);
// Check if the user is in the SILENT EXPERIMENT group. // Check if the user is in the SILENT EXPERIMENT group.
...@@ -85,6 +95,10 @@ class InstantFieldTrial { ...@@ -85,6 +95,10 @@ class InstantFieldTrial {
// Returns a string denoting the user's group, for adding as a URL param. // Returns a string denoting the user's group, for adding as a URL param.
static std::string GetGroupAsUrlParam(Profile* profile); static std::string GetGroupAsUrlParam(Profile* profile);
// Returns whether the Instant suggested text should be autocompleted inline
// into the omnibox.
static bool ShouldSetSuggestedText(Profile* profile);
private: private:
DISALLOW_IMPLICIT_CONSTRUCTORS(InstantFieldTrial); DISALLOW_IMPLICIT_CONSTRUCTORS(InstantFieldTrial);
}; };
......
...@@ -712,6 +712,8 @@ const char kInstantFieldTrialHidden[] = "hidden"; ...@@ -712,6 +712,8 @@ const char kInstantFieldTrialHidden[] = "hidden";
const char kInstantFieldTrialInstant[] = "instant"; const char kInstantFieldTrialInstant[] = "instant";
// The field trial is forced into the SILENT_EXPERIMENT group. // The field trial is forced into the SILENT_EXPERIMENT group.
const char kInstantFieldTrialSilent[] = "silent"; const char kInstantFieldTrialSilent[] = "silent";
// The field trial is forced into the SUGGEST_EXPERIMENT group.
const char kInstantFieldTrialSuggest[] = "suggest";
// URL to use for instant. If specified this overrides the url from the // URL to use for instant. If specified this overrides the url from the
// TemplateURL. // TemplateURL.
......
...@@ -198,6 +198,7 @@ extern const char kInstantFieldTrial[]; ...@@ -198,6 +198,7 @@ extern const char kInstantFieldTrial[];
extern const char kInstantFieldTrialHidden[]; extern const char kInstantFieldTrialHidden[];
extern const char kInstantFieldTrialInstant[]; extern const char kInstantFieldTrialInstant[];
extern const char kInstantFieldTrialSilent[]; extern const char kInstantFieldTrialSilent[];
extern const char kInstantFieldTrialSuggest[];
extern const char kInstantURL[]; extern const char kInstantURL[];
extern const char kKeepAliveForTest[]; extern const char kKeepAliveForTest[];
extern const char kLoadExtension[]; extern const char kLoadExtension[];
......
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