Index: chrome/browser/omnibox/omnibox_field_trial.cc |
diff --git a/chrome/browser/omnibox/omnibox_field_trial.cc b/chrome/browser/omnibox/omnibox_field_trial.cc |
index 2bec78bc0ccf477943baf275e0d459b0f0edaa24..5f3457b8c0c7a1f657914f9b758c3bab5619a327 100644 |
--- a/chrome/browser/omnibox/omnibox_field_trial.cc |
+++ b/chrome/browser/omnibox/omnibox_field_trial.cc |
@@ -11,6 +11,7 @@ |
#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
+#include "chrome/browser/search/search.h" |
#include "chrome/common/metrics/metrics_util.h" |
#include "chrome/common/metrics/variations/variation_ids.h" |
#include "chrome/common/metrics/variations/variations_util.h" |
@@ -270,19 +271,32 @@ void OmniboxFieldTrial::GetDemotionsByType( |
// parameters (key-value pairs). In the bundled omnibox experiment |
// (kBundledExperimentFieldTrialName), each experiment group comes with a |
// list of parameters in the form: |
-// key=<Rule>:<AutocompleteInput::PageClassification (as an int)> |
+// key=<Rule>: |
+// <AutocompleteInput::PageClassification (as an int)>: |
+// <whether Instant Extended is enabled (as a 1 or 0)> |
+// (note that there are no linebreaks in keys; this format is for |
+// presentation only> |
// value=<arbitrary string> |
-// The AutocompleteInput::PageClassification can also be "*", which means |
-// this rule applies in all page classification contexts. |
+// Both the AutocompleteInput::PageClassification and the Instant Extended |
+// entries can be "*", which means this rule applies for all values of the |
+// matching portion of the context. |
// One example parameter is |
-// key=SearchHistory:6 |
+// key=SearchHistory:6:1 |
// value=PreventInlining |
// This means in page classification context 6 (a search result page doing |
-// search term replacement), the SearchHistory experiment should |
-// PreventInlining. |
+// search term replacement) with Instant Extended enabled, the SearchHistory |
+// experiment should PreventInlining. |
+// |
+// When an exact match to the rule in the current context is missing, we |
+// give preference to a wildcard rule that matches the instant extended |
+// context over a wildcard rule that matches the page classification |
+// context. Hopefully, though, users will write their field trial configs |
+// so as not to rely on this fall back order. |
// |
// In short, this function tries to find the value associated with key |
-// |rule|:|page_classification|, failing that it looks up |rule|:*, |
+// |rule|:|page_classification|:|instant_extended|, failing that it looks up |
+// |rule|:*:|instant_extended|, failing that it looks up |
+// |rule|:|page_classification|:*, failing that it looks up |rule|:*:*, |
// and failing that it returns the empty string. |
std::string OmniboxFieldTrial::GetValueForRuleInContext( |
const std::string& rule, |
@@ -292,13 +306,24 @@ std::string OmniboxFieldTrial::GetValueForRuleInContext( |
¶ms)) { |
return std::string(); |
} |
+ const std::string page_classification_str = |
+ base::IntToString(static_cast<int>(page_classification)); |
+ const std::string instant_extended = |
+ chrome::IsInstantExtendedAPIEnabled() ? "1" : "0"; |
// Look up rule in this exact context. |
- std::map<std::string, std::string>::iterator it = |
- params.find(rule + ":" + base::IntToString( |
- static_cast<int>(page_classification))); |
+ std::map<std::string, std::string>::iterator it = params.find( |
+ rule + ":" + page_classification_str + ":" + instant_extended); |
+ if (it != params.end()) |
+ return it->second; |
+ // Fall back to the global page classification context. |
+ it = params.find(rule + ":*:" + instant_extended); |
+ if (it != params.end()) |
+ return it->second; |
+ // Fall back to the global instant extended context. |
+ it = params.find(rule + ":" + page_classification_str + ":*"); |
if (it != params.end()) |
return it->second; |
// Look up rule in the global context. |
- it = params.find(rule + ":*"); |
+ it = params.find(rule + ":*:*"); |
return (it != params.end()) ? it->second : std::string(); |
} |