diff options
-rw-r--r-- | chrome/browser/autocomplete/shortcuts_provider.cc | 20 | ||||
-rw-r--r-- | chrome/browser/autocomplete/shortcuts_provider.h | 9 | ||||
-rw-r--r-- | chrome/browser/autocomplete/shortcuts_provider_unittest.cc | 16 | ||||
-rw-r--r-- | chrome/browser/omnibox/omnibox_field_trial.cc | 18 | ||||
-rw-r--r-- | chrome/browser/omnibox/omnibox_field_trial.h | 16 |
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); }; |