summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);
};