Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1083)

Side by Side Diff: chrome/browser/autocomplete/shortcuts_provider.cc

Issue 1098843004: Omnibox - Do Not Allow HTTP/HTTPS Equivalence if User Explicitly Entered A Scheme (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: peter's comments, slight refactoringpeter's comments, slight refactoring Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/autocomplete/shortcuts_provider.h" 5 #include "chrome/browser/autocomplete/shortcuts_provider.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <map> 9 #include <map>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/i18n/break_iterator.h" 12 #include "base/i18n/break_iterator.h"
13 #include "base/i18n/case_conversion.h" 13 #include "base/i18n/case_conversion.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/prefs/pref_service.h" 16 #include "base/prefs/pref_service.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/string_split.h"
18 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
19 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
20 #include "base/time/time.h" 21 #include "base/time/time.h"
21 #include "chrome/browser/autocomplete/history_provider.h" 22 #include "chrome/browser/autocomplete/history_provider.h"
22 #include "chrome/browser/autocomplete/shortcuts_backend_factory.h" 23 #include "chrome/browser/autocomplete/shortcuts_backend_factory.h"
23 #include "chrome/browser/history/history_service_factory.h" 24 #include "chrome/browser/history/history_service_factory.h"
24 #include "chrome/browser/profiles/profile.h" 25 #include "chrome/browser/profiles/profile.h"
25 #include "chrome/browser/search_engines/template_url_service_factory.h" 26 #include "chrome/browser/search_engines/template_url_service_factory.h"
26 #include "chrome/common/pref_names.h" 27 #include "chrome/common/pref_names.h"
27 #include "chrome/common/url_constants.h" 28 #include "chrome/common/url_constants.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 base::string16 term_string(base::i18n::ToLower(input.text())); 137 base::string16 term_string(base::i18n::ToLower(input.text()));
137 DCHECK(!term_string.empty()); 138 DCHECK(!term_string.empty());
138 139
139 int max_relevance; 140 int max_relevance;
140 if (!OmniboxFieldTrial::ShortcutsScoringMaxRelevance( 141 if (!OmniboxFieldTrial::ShortcutsScoringMaxRelevance(
141 input.current_page_classification(), &max_relevance)) 142 input.current_page_classification(), &max_relevance))
142 max_relevance = kShortcutsProviderDefaultMaxRelevance; 143 max_relevance = kShortcutsProviderDefaultMaxRelevance;
143 TemplateURLService* template_url_service = 144 TemplateURLService* template_url_service =
144 TemplateURLServiceFactory::GetForProfile(profile_); 145 TemplateURLServiceFactory::GetForProfile(profile_);
145 const base::string16 fixed_up_input(FixupUserInput(input).second); 146 const base::string16 fixed_up_input(FixupUserInput(input).second);
147 std::vector<base::string16> words;
148 base::SplitString(input.text(), ' ', &words);
Peter Kasting 2015/06/06 01:31:23 Hmmm. Is it realy necessary for the shortcuts sys
Mark P 2015/06/06 17:10:11 No. Prior to fixing bug 260799, Shortcuts did not
Peter Kasting 2015/06/06 18:38:15 I'm wondering if we can go even further and avoid
Mark P 2015/06/06 20:23:06 Look at the pointed-to bug. For almost any input,
Peter Kasting 2015/06/08 20:26:59 OK. Can we add comments about why it's more impor
Mark P 2015/06/09 19:29:38 Okay, I added some comments about why it's importa
146 for (ShortcutsBackend::ShortcutMap::const_iterator it = 149 for (ShortcutsBackend::ShortcutMap::const_iterator it =
147 FindFirstMatch(term_string, backend.get()); 150 FindFirstMatch(term_string, backend.get());
148 it != backend->shortcuts_map().end() && 151 it != backend->shortcuts_map().end() &&
149 StartsWith(it->first, term_string, true); ++it) { 152 StartsWith(it->first, term_string, true); ++it) {
150 // Don't return shortcuts with zero relevance. 153 // Don't return shortcuts with zero relevance.
151 int relevance = CalculateScore(term_string, it->second, max_relevance); 154 int relevance = CalculateScore(term_string, it->second, max_relevance);
152 if (relevance) { 155 if (relevance) {
153 matches_.push_back(ShortcutToACMatch(it->second, relevance, input, 156 matches_.push_back(ShortcutToACMatch(it->second, relevance, input,
154 fixed_up_input)); 157 fixed_up_input, words));
155 matches_.back().ComputeStrippedDestinationURL(template_url_service); 158 matches_.back().ComputeStrippedDestinationURL(words,
159 template_url_service);
156 } 160 }
157 } 161 }
158 // Remove duplicates. Duplicates don't need to be preserved in the matches 162 // Remove duplicates. Duplicates don't need to be preserved in the matches
159 // because they are only used for deletions, and shortcuts deletes matches 163 // because they are only used for deletions, and shortcuts deletes matches
160 // based on the URL. 164 // based on the URL.
161 AutocompleteResult::DedupMatchesByDestination( 165 AutocompleteResult::DedupMatchesByDestination(
162 input.current_page_classification(), false, &matches_); 166 input.current_page_classification(), false, &matches_);
163 // Find best matches. 167 // Find best matches.
164 std::partial_sort(matches_.begin(), 168 std::partial_sort(matches_.begin(),
165 matches_.begin() + 169 matches_.begin() +
(...skipping 10 matching lines...) Expand all
176 it->relevance = max_relevance; 180 it->relevance = max_relevance;
177 if (max_relevance > 1) 181 if (max_relevance > 1)
178 --max_relevance; 182 --max_relevance;
179 } 183 }
180 } 184 }
181 185
182 AutocompleteMatch ShortcutsProvider::ShortcutToACMatch( 186 AutocompleteMatch ShortcutsProvider::ShortcutToACMatch(
183 const ShortcutsDatabase::Shortcut& shortcut, 187 const ShortcutsDatabase::Shortcut& shortcut,
184 int relevance, 188 int relevance,
185 const AutocompleteInput& input, 189 const AutocompleteInput& input,
186 const base::string16& fixed_up_input_text) { 190 const base::string16& fixed_up_input_text,
191 const std::vector<base::string16>& words) {
187 DCHECK(!input.text().empty()); 192 DCHECK(!input.text().empty());
188 AutocompleteMatch match; 193 AutocompleteMatch match;
189 match.provider = this; 194 match.provider = this;
190 match.relevance = relevance; 195 match.relevance = relevance;
191 match.deletable = true; 196 match.deletable = true;
192 match.fill_into_edit = shortcut.match_core.fill_into_edit; 197 match.fill_into_edit = shortcut.match_core.fill_into_edit;
193 match.destination_url = shortcut.match_core.destination_url; 198 match.destination_url = shortcut.match_core.destination_url;
194 DCHECK(match.destination_url.is_valid()); 199 DCHECK(match.destination_url.is_valid());
195 match.contents = shortcut.match_core.contents; 200 match.contents = shortcut.match_core.contents;
196 match.contents_class = AutocompleteMatch::ClassificationsFromString( 201 match.contents_class = AutocompleteMatch::ClassificationsFromString(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 input.text(), fixed_up_input_text, true, match.fill_into_edit); 234 input.text(), fixed_up_input_text, true, match.fill_into_edit);
230 if (inline_autocomplete_offset != base::string16::npos) { 235 if (inline_autocomplete_offset != base::string16::npos) {
231 match.inline_autocompletion = 236 match.inline_autocompletion =
232 match.fill_into_edit.substr(inline_autocomplete_offset); 237 match.fill_into_edit.substr(inline_autocomplete_offset);
233 match.allowed_to_be_default_match = 238 match.allowed_to_be_default_match =
234 !HistoryProvider::PreventInlineAutocomplete(input) || 239 !HistoryProvider::PreventInlineAutocomplete(input) ||
235 match.inline_autocompletion.empty(); 240 match.inline_autocompletion.empty();
236 } 241 }
237 } 242 }
238 match.EnsureUWYTIsAllowedToBeDefault( 243 match.EnsureUWYTIsAllowedToBeDefault(
239 input.canonicalized_url(), 244 input.canonicalized_url(), words,
Peter Kasting 2015/06/06 01:31:23 Instead of passing |words| to this function we cou
Mark P 2015/06/06 17:10:11 I'm passing |words| here so as to above the versio
Peter Kasting 2015/06/06 18:38:16 OK, but this seems like an argument in favor of my
Mark P 2015/06/06 20:23:06 Yes, it is.
240 TemplateURLServiceFactory::GetForProfile(profile_)); 245 TemplateURLServiceFactory::GetForProfile(profile_));
241 246
242 // Try to mark pieces of the contents and description as matches if they 247 // Try to mark pieces of the contents and description as matches if they
243 // appear in |input.text()|. 248 // appear in |input.text()|.
244 const base::string16 term_string = base::i18n::ToLower(input.text()); 249 const base::string16 term_string = base::i18n::ToLower(input.text());
245 WordMap terms_map(CreateWordMapForString(term_string)); 250 WordMap terms_map(CreateWordMapForString(term_string));
246 if (!terms_map.empty()) { 251 if (!terms_map.empty()) {
247 match.contents_class = ClassifyAllMatchesInString(term_string, terms_map, 252 match.contents_class = ClassifyAllMatchesInString(term_string, terms_map,
248 match.contents, match.contents_class); 253 match.contents, match.contents_class);
249 match.description_class = ClassifyAllMatchesInString(term_string, terms_map, 254 match.description_class = ClassifyAllMatchesInString(term_string, terms_map,
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 // (1.0 / each 5 additional hits), up to a maximum of 5x as long. 406 // (1.0 / each 5 additional hits), up to a maximum of 5x as long.
402 const double kMaxDecaySpeedDivisor = 5.0; 407 const double kMaxDecaySpeedDivisor = 5.0;
403 const double kNumUsesPerDecaySpeedDivisorIncrement = 5.0; 408 const double kNumUsesPerDecaySpeedDivisorIncrement = 5.0;
404 double decay_divisor = std::min(kMaxDecaySpeedDivisor, 409 double decay_divisor = std::min(kMaxDecaySpeedDivisor,
405 (shortcut.number_of_hits + kNumUsesPerDecaySpeedDivisorIncrement - 1) / 410 (shortcut.number_of_hits + kNumUsesPerDecaySpeedDivisorIncrement - 1) /
406 kNumUsesPerDecaySpeedDivisorIncrement); 411 kNumUsesPerDecaySpeedDivisorIncrement);
407 412
408 return static_cast<int>((base_score / exp(decay_exponent / decay_divisor)) + 413 return static_cast<int>((base_score / exp(decay_exponent / decay_divisor)) +
409 0.5); 414 0.5);
410 } 415 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698