summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpearson@chromium.org <mpearson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 17:32:41 +0000
committermpearson@chromium.org <mpearson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 17:32:41 +0000
commit1be0b45815e548f453be4e1dae88842afb6e0d6c (patch)
tree9e2133acec42deb77c607b17db6315596627c3b7
parentaa44546e0270e7cff9d934d9d5dc236df2030e99 (diff)
downloadchromium_src-1be0b45815e548f453be4e1dae88842afb6e0d6c.zip
chromium_src-1be0b45815e548f453be4e1dae88842afb6e0d6c.tar.gz
chromium_src-1be0b45815e548f453be4e1dae88842afb6e0d6c.tar.bz2
Omnibox: Add Field Trial to Make Shortcuts More Aggressive
Change ShortcutsProvider so it can assign high relevance scores. Simultaneously, make ShortcutsProvider explicitly enforce the rule that it should not return a result with an inlineable score (>=1200). Finally, create a field trial that will allow the server to specify the maximum relevance score ShortcutsProvider can assign. Setting this to 1199 will maintain current behavior. Also, if the field trial is not enabled through the variations server, Chrome will maintain the current behavior. BUG=252032 TEST=enter omnibox inputs that you've used before to get places (and hence shortcuts will have data about them) into about:omnibox and look at the resulting scores. Try again with --force-fieldtrials=OmniboxShortcutsScoring/MaxRelevance_XXX/ (where XXX is a number) and see how the scores change. Review URL: https://chromiumcodereview.appspot.com/17261012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207872 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autocomplete/shortcuts_provider.cc20
-rw-r--r--chrome/browser/autocomplete/shortcuts_provider.h9
-rw-r--r--chrome/browser/autocomplete/shortcuts_provider_unittest.cc16
-rw-r--r--chrome/browser/omnibox/omnibox_field_trial.cc18
-rw-r--r--chrome/browser/omnibox/omnibox_field_trial.h16
5 files changed, 67 insertions, 12 deletions
diff --git a/chrome/browser/autocomplete/shortcuts_provider.cc b/chrome/browser/autocomplete/shortcuts_provider.cc
index 21d7b5e..1d380b3 100644
--- a/chrome/browser/autocomplete/shortcuts_provider.cc
+++ b/chrome/browser/autocomplete/shortcuts_provider.cc
@@ -25,6 +25,7 @@
#include "chrome/browser/history/history_service.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/history/shortcuts_backend_factory.h"
+#include "chrome/browser/omnibox/omnibox_field_trial.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
@@ -53,7 +54,8 @@ ShortcutsProvider::ShortcutsProvider(AutocompleteProviderListener* listener,
: AutocompleteProvider(listener, profile,
AutocompleteProvider::TYPE_SHORTCUTS),
languages_(profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)),
- initialized_(false) {
+ initialized_(false),
+ max_relevance_(AutocompleteResult::kLowestDefaultScore - 1) {
scoped_refptr<history::ShortcutsBackend> backend =
ShortcutsBackendFactory::GetForProfile(profile_);
if (backend.get()) {
@@ -61,6 +63,9 @@ ShortcutsProvider::ShortcutsProvider(AutocompleteProviderListener* listener,
if (backend->initialized())
initialized_ = true;
}
+ int max_relevance;
+ if (OmniboxFieldTrial::ShortcutsScoringMaxRelevance(&max_relevance))
+ max_relevance_ = max_relevance;
}
void ShortcutsProvider::Start(const AutocompleteInput& input,
@@ -169,6 +174,16 @@ void ShortcutsProvider::GetMatches(const AutocompleteInput& input) {
matches_.erase(matches_.begin() + AutocompleteProvider::kMaxMatches,
matches_.end());
}
+ // Reset relevance scores to guarantee no results are given an
+ // inlineable score and all scores are decreasing (but not do assign
+ // any scores below 1).
+ int max_relevance = AutocompleteResult::kLowestDefaultScore - 1;
+ for (ACMatches::iterator it = matches_.begin(); it != matches_.end(); ++it) {
+ max_relevance = std::min(max_relevance, it->relevance);
+ it->relevance = max_relevance;
+ if (max_relevance > 1)
+ --max_relevance;
+ }
}
AutocompleteMatch ShortcutsProvider::ShortcutToACMatch(
@@ -321,7 +336,6 @@ history::ShortcutsBackend::ShortcutMap::const_iterator
backend->shortcuts_map().end();
}
-// static
int ShortcutsProvider::CalculateScore(
const string16& terms,
const history::ShortcutsBackend::Shortcut& shortcut) {
@@ -334,7 +348,7 @@ int ShortcutsProvider::CalculateScore(
// directly. This makes sense since the first characters typed are much more
// important for determining how likely it is a user wants a particular
// shortcut than are the remaining continued characters.
- double base_score = (AutocompleteResult::kLowestDefaultScore - 1) *
+ double base_score = max_relevance_ *
sqrt(static_cast<double>(terms.length()) / shortcut.text.length());
// Then we decay this by half each week.
diff --git a/chrome/browser/autocomplete/shortcuts_provider.h b/chrome/browser/autocomplete/shortcuts_provider.h
index b4b0fc9..11f0b0a 100644
--- a/chrome/browser/autocomplete/shortcuts_provider.h
+++ b/chrome/browser/autocomplete/shortcuts_provider.h
@@ -94,12 +94,19 @@ class ShortcutsProvider
const string16& keyword,
history::ShortcutsBackend* backend);
- static int CalculateScore(
+ int CalculateScore(
const string16& terms,
const history::ShortcutsBackend::Shortcut& shortcut);
std::string languages_;
bool initialized_;
+
+ // The maximum relevance that can be assigned in CalculateScore().
+ // Note that if the final assigned relevance is at least
+ // AutocompleteResult::kLowestDefaultScore, the relevance will be
+ // demoted to less than that number because ShortcutsProvider isn't
+ // allowed to inline.
+ int max_relevance_;
};
#endif // CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_PROVIDER_H_
diff --git a/chrome/browser/autocomplete/shortcuts_provider_unittest.cc b/chrome/browser/autocomplete/shortcuts_provider_unittest.cc
index bc1034c..9b2b4e4 100644
--- a/chrome/browser/autocomplete/shortcuts_provider_unittest.cc
+++ b/chrome/browser/autocomplete/shortcuts_provider_unittest.cc
@@ -573,37 +573,37 @@ TEST_F(ShortcutsProviderTest, CalculateScore) {
spans_description, base::Time::Now(), 1);
// Maximal score.
- const int kMaxScore = ShortcutsProvider::CalculateScore(
+ const int kMaxScore = provider_->CalculateScore(
ASCIIToUTF16("test"), shortcut);
// Score decreases as percent of the match is decreased.
int score_three_quarters =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("tes"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("tes"), shortcut);
EXPECT_LT(score_three_quarters, kMaxScore);
int score_one_half =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("te"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("te"), shortcut);
EXPECT_LT(score_one_half, score_three_quarters);
int score_one_quarter =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("t"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("t"), shortcut);
EXPECT_LT(score_one_quarter, score_one_half);
// Should decay with time - one week.
shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(7);
int score_week_old =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("test"), shortcut);
EXPECT_LT(score_week_old, kMaxScore);
// Should decay more in two weeks.
shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14);
int score_two_weeks_old =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("test"), shortcut);
EXPECT_LT(score_two_weeks_old, score_week_old);
// But not if it was activly clicked on. 2 hits slow decaying power.
shortcut.number_of_hits = 2;
shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14);
int score_popular_two_weeks_old =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("test"), shortcut);
EXPECT_LT(score_two_weeks_old, score_popular_two_weeks_old);
// But still decayed.
EXPECT_LT(score_popular_two_weeks_old, kMaxScore);
@@ -612,7 +612,7 @@ TEST_F(ShortcutsProviderTest, CalculateScore) {
shortcut.number_of_hits = 3;
shortcut.last_access_time = base::Time::Now() - base::TimeDelta::FromDays(14);
int score_more_popular_two_weeks_old =
- ShortcutsProvider::CalculateScore(ASCIIToUTF16("test"), shortcut);
+ provider_->CalculateScore(ASCIIToUTF16("test"), shortcut);
EXPECT_LT(score_two_weeks_old, score_more_popular_two_weeks_old);
EXPECT_LT(score_popular_two_weeks_old, score_more_popular_two_weeks_old);
// But still decayed.
diff --git a/chrome/browser/omnibox/omnibox_field_trial.cc b/chrome/browser/omnibox/omnibox_field_trial.cc
index 4ec2c5c..da16943 100644
--- a/chrome/browser/omnibox/omnibox_field_trial.cc
+++ b/chrome/browser/omnibox/omnibox_field_trial.cc
@@ -22,6 +22,7 @@ const char kHUPCullRedirectsFieldTrialName[] = "OmniboxHUPCullRedirects";
const char kHUPCreateShorterMatchFieldTrialName[] =
"OmniboxHUPCreateShorterMatch";
const char kStopTimerFieldTrialName[] = "OmniboxStopTimer";
+const char kShortcutsScoringFieldTrialName[] = "OmniboxShortcutsScoring";
// The autocomplete dynamic field trial name prefix. Each field trial is
// configured dynamically and is retrieved automatically by Chrome during
@@ -240,3 +241,20 @@ bool OmniboxFieldTrial::InZeroSuggestFieldTrial() {
}
return false;
}
+
+// If the active group name starts with "MaxRelevance_", extract the
+// int that immediately following that, returning true on success.
+bool OmniboxFieldTrial::ShortcutsScoringMaxRelevance(int* max_relevance) {
+ std::string group_name =
+ base::FieldTrialList::FindFullName(kShortcutsScoringFieldTrialName);
+ const char kMaxRelevanceGroupPrefix[] = "MaxRelevance_";
+ if (!StartsWithASCII(group_name, kMaxRelevanceGroupPrefix, true))
+ return false;
+ if (!base::StringToInt(base::StringPiece(
+ group_name.substr(strlen(kMaxRelevanceGroupPrefix))),
+ max_relevance)) {
+ LOG(WARNING) << "Malformed MaxRelevance string: " << group_name;
+ return false;
+ }
+ return true;
+}
diff --git a/chrome/browser/omnibox/omnibox_field_trial.h b/chrome/browser/omnibox/omnibox_field_trial.h
index e6f0345..ab5babc 100644
--- a/chrome/browser/omnibox/omnibox_field_trial.h
+++ b/chrome/browser/omnibox/omnibox_field_trial.h
@@ -97,6 +97,22 @@ class OmniboxFieldTrial {
// user clicks on the omnibox but has not typed anything yet.
static bool InZeroSuggestFieldTrial();
+ // ---------------------------------------------------------
+ // For the ShortcutsScoring field trial.
+
+ // If the field trial is active and the user is in an experiment
+ // group, extract from the experiment group name the maximum
+ // relevance score ShortcutsProvider:: CalculateScore() can return.
+ // Returns true on a successful extraction. If the extraction failed,
+ // if the field trial is not active, etc., returns false.
+ // CalculateScore()'s return value is a product of this maximum
+ // relevance score and some attenuating factors that are all between
+ // 0 and 1. (Note that Shortcuts results may have their scores
+ // reduced later if the assigned score is higher than allowed for
+ // non-inlineable results. Shortcuts results are not allowed to be
+ // inlined.)
+ static bool ShortcutsScoringMaxRelevance(int* max_relevance);
+
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(OmniboxFieldTrial);
};