Index: chrome/browser/autocomplete/autocomplete_match.cc |
diff --git a/chrome/browser/autocomplete/autocomplete_match.cc b/chrome/browser/autocomplete/autocomplete_match.cc |
index f64d4bb93599a9b703725986b52cda50c27f3971..e3b9d13fb8ddfe8ac8f4efd22d2379a2a10fdbb3 100644 |
--- a/chrome/browser/autocomplete/autocomplete_match.cc |
+++ b/chrome/browser/autocomplete/autocomplete_match.cc |
@@ -358,11 +358,27 @@ bool AutocompleteMatch::IsSearchType(Type type) { |
type == SEARCH_OTHER_ENGINE; |
} |
-void AutocompleteMatch::ComputeStrippedDestinationURL() { |
+void AutocompleteMatch::ComputeStrippedDestinationURL(Profile* profile) { |
stripped_destination_url = destination_url; |
if (!stripped_destination_url.is_valid()) |
return; |
+ // If the destination URL looks like it was generated from a TemplateURL, |
+ // remove all substitutions other than the search terms. This allows us |
+ // to eliminate cases like past search URLs from history that differ only |
+ // by some obscure query param from each other or from the search/keyword |
+ // provider matches. |
+ TemplateURL* template_url = GetTemplateURL(profile, true); |
+ if (template_url != NULL && template_url->SupportsReplacement()) { |
+ string16 search_terms; |
+ if (template_url->ExtractSearchTermsFromURL(stripped_destination_url, |
+ &search_terms)) { |
+ stripped_destination_url = |
+ GURL(template_url->url_ref().ReplaceSearchTerms( |
+ TemplateURLRef::SearchTermsArgs(search_terms))); |
+ } |
+ } |
+ |
// |replacements| keeps all the substitions we're going to make to |
// from {destination_url} to {stripped_destination_url}. |need_replacement| |
// is a helper variable that helps us keep track of whether we need |
@@ -373,7 +389,7 @@ void AutocompleteMatch::ComputeStrippedDestinationURL() { |
// Remove the www. prefix from the host. |
static const char prefix[] = "www."; |
static const size_t prefix_len = arraysize(prefix) - 1; |
- std::string host = destination_url.host(); |
+ std::string host = stripped_destination_url.host(); |
if (host.compare(0, prefix_len, prefix) == 0) { |
host = host.substr(prefix_len); |
replacements.SetHostStr(host); |
@@ -389,7 +405,8 @@ void AutocompleteMatch::ComputeStrippedDestinationURL() { |
} |
if (needs_replacement) |
- stripped_destination_url = destination_url.ReplaceComponents(replacements); |
+ stripped_destination_url = stripped_destination_url.ReplaceComponents( |
+ replacements); |
} |
void AutocompleteMatch::GetKeywordUIState(Profile* profile, |
@@ -404,15 +421,24 @@ string16 AutocompleteMatch::GetSubstitutingExplicitlyInvokedKeyword( |
Profile* profile) const { |
if (transition != content::PAGE_TRANSITION_KEYWORD) |
return string16(); |
- const TemplateURL* t_url = GetTemplateURL(profile); |
+ const TemplateURL* t_url = GetTemplateURL(profile, false); |
return (t_url && t_url->SupportsReplacement()) ? keyword : string16(); |
} |
-TemplateURL* AutocompleteMatch::GetTemplateURL(Profile* profile) const { |
+TemplateURL* AutocompleteMatch::GetTemplateURL( |
+ Profile* profile, bool allow_fallback_to_destination_host) const { |
DCHECK(profile); |
- return keyword.empty() ? NULL : |
- TemplateURLServiceFactory::GetForProfile(profile)-> |
- GetTemplateURLForKeyword(keyword); |
+ TemplateURLService* template_url_service = |
+ TemplateURLServiceFactory::GetForProfile(profile); |
+ if (template_url_service == NULL) |
+ return NULL; |
+ TemplateURL* template_url = keyword.empty() ? NULL : |
+ template_url_service->GetTemplateURLForKeyword(keyword); |
+ if (template_url == NULL && allow_fallback_to_destination_host) { |
+ template_url = template_url_service->GetTemplateURLForHost( |
+ destination_url.host()); |
+ } |
+ return template_url; |
} |
void AutocompleteMatch::RecordAdditionalInfo(const std::string& property, |