Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/keyword_provider.h" | 5 #include "chrome/browser/autocomplete/keyword_provider.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/string16.h" | 10 #include "base/string16.h" |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 172 // don't bother. | 172 // don't bother. |
| 173 // | 173 // |
| 174 // TODO(pkasting): http://b/893701 We should remember the user's use of a | 174 // TODO(pkasting): http://b/893701 We should remember the user's use of a |
| 175 // search query both from the autocomplete popup and from web pages | 175 // search query both from the autocomplete popup and from web pages |
| 176 // themselves. | 176 // themselves. |
| 177 std::vector<string16> keyword_matches; | 177 std::vector<string16> keyword_matches; |
| 178 model->FindMatchingKeywords(keyword, | 178 model->FindMatchingKeywords(keyword, |
| 179 !remaining_input.empty(), | 179 !remaining_input.empty(), |
| 180 &keyword_matches); | 180 &keyword_matches); |
| 181 | 181 |
| 182 // Prune any extension keywords that are disallowed in incognito mode (if | |
| 183 // we're incognito), or disabled. | |
| 184 for (std::vector<string16>::iterator i(keyword_matches.begin()); | 182 for (std::vector<string16>::iterator i(keyword_matches.begin()); |
| 185 i != keyword_matches.end(); ) { | 183 i != keyword_matches.end(); ) { |
| 186 const TemplateURL* template_url(model->GetTemplateURLForKeyword(*i)); | 184 const TemplateURL* template_url(model->GetTemplateURLForKeyword(*i)); |
| 185 | |
| 186 // Prune any extension keywords that are disallowed in incognito mode (if | |
| 187 // we're incognito), or disabled. | |
| 187 if (profile_ && | 188 if (profile_ && |
| 188 input.matches_requested() == AutocompleteInput::ALL_MATCHES && | 189 input.matches_requested() == AutocompleteInput::ALL_MATCHES && |
| 189 template_url->IsExtensionKeyword()) { | 190 template_url->IsExtensionKeyword()) { |
| 190 ExtensionService* service = profile_->GetExtensionService(); | 191 ExtensionService* service = profile_->GetExtensionService(); |
| 191 const Extension* extension = service->GetExtensionById( | 192 const Extension* extension = service->GetExtensionById( |
| 192 template_url->GetExtensionId(), false); | 193 template_url->GetExtensionId(), false); |
| 193 bool enabled = | 194 bool enabled = |
| 194 extension && (!profile_->IsOffTheRecord() || | 195 extension && (!profile_->IsOffTheRecord() || |
| 195 service->IsIncognitoEnabled(extension->id())); | 196 service->IsIncognitoEnabled(extension->id())); |
| 196 if (!enabled) { | 197 if (!enabled) { |
| 197 i = keyword_matches.erase(i); | 198 i = keyword_matches.erase(i); |
| 198 continue; | 199 continue; |
| 199 } | 200 } |
| 200 } | 201 } |
| 202 | |
| 203 // Prune any substituting keywords if there is no substitution. | |
| 204 if (TemplateURL::SupportsReplacement(template_url) && | |
| 205 !input.allow_exact_keyword_match()) { | |
| 206 i = keyword_matches.erase(i); | |
| 207 continue; | |
| 208 } | |
| 209 | |
| 201 ++i; | 210 ++i; |
| 202 } | 211 } |
| 203 if (keyword_matches.empty()) | 212 if (keyword_matches.empty()) |
| 204 return; | 213 return; |
| 205 std::sort(keyword_matches.begin(), keyword_matches.end(), CompareQuality()); | 214 std::sort(keyword_matches.begin(), keyword_matches.end(), CompareQuality()); |
| 206 | 215 |
| 207 // Limit to one exact or three inexact matches, and mark them up for display | 216 // Limit to one exact or three inexact matches, and mark them up for display |
| 208 // in the autocomplete popup. | 217 // in the autocomplete popup. |
| 209 // Any exact match is going to be the highest quality match, and thus at the | 218 // Any exact match is going to be the highest quality match, and thus at the |
| 210 // front of our vector. | 219 // front of our vector. |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 // to the user's input. Because right now inexact keyword matches can't score | 427 // to the user's input. Because right now inexact keyword matches can't score |
| 419 // more highly than a "what you typed" match from one of the other providers, | 428 // more highly than a "what you typed" match from one of the other providers, |
| 420 // we just don't bother to do this, and leave inline autocompletion off. | 429 // we just don't bother to do this, and leave inline autocompletion off. |
| 421 result.inline_autocomplete_offset = string16::npos; | 430 result.inline_autocomplete_offset = string16::npos; |
| 422 | 431 |
| 423 // Create destination URL and popup entry content by substituting user input | 432 // Create destination URL and popup entry content by substituting user input |
| 424 // into keyword templates. | 433 // into keyword templates. |
| 425 FillInURLAndContents(remaining_input, element, &result); | 434 FillInURLAndContents(remaining_input, element, &result); |
| 426 | 435 |
| 427 if (supports_replacement) | 436 if (supports_replacement) |
| 428 result.template_url = element; | 437 result.keyword_url = element; |
|
Peter Kasting
2011/04/13 21:06:59
Seems like this should be set regardless of |suppo
| |
| 429 result.transition = PageTransition::KEYWORD; | 438 result.transition = PageTransition::KEYWORD; |
| 439 result.keyword_state = AutocompleteMatch::KEYWORD; | |
| 440 result.keyword.assign(keyword); | |
|
Peter Kasting
2011/04/13 21:06:59
Nit: Just use =
| |
| 430 | 441 |
| 431 // Create popup entry description based on the keyword name. | 442 // Create popup entry description based on the keyword name. |
| 432 if (!element->IsExtensionKeyword()) { | 443 if (!element->IsExtensionKeyword()) { |
| 433 result.description.assign(l10n_util::GetStringFUTF16( | 444 result.description.assign(l10n_util::GetStringFUTF16( |
| 434 IDS_AUTOCOMPLETE_KEYWORD_DESCRIPTION, keyword)); | 445 IDS_AUTOCOMPLETE_KEYWORD_DESCRIPTION, keyword)); |
| 435 string16 keyword_desc( | 446 string16 keyword_desc( |
| 436 l10n_util::GetStringUTF16(IDS_AUTOCOMPLETE_KEYWORD_DESCRIPTION)); | 447 l10n_util::GetStringUTF16(IDS_AUTOCOMPLETE_KEYWORD_DESCRIPTION)); |
| 437 AutocompleteMatch::ClassifyLocationInString( | 448 AutocompleteMatch::ClassifyLocationInString( |
| 438 keyword_desc.find(ASCIIToUTF16("%s")), | 449 keyword_desc.find(ASCIIToUTF16("%s")), |
| 439 prefix_length, | 450 prefix_length, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 533 } | 544 } |
| 534 | 545 |
| 535 void KeywordProvider::MaybeEndExtensionKeywordMode() { | 546 void KeywordProvider::MaybeEndExtensionKeywordMode() { |
| 536 if (!current_keyword_extension_id_.empty()) { | 547 if (!current_keyword_extension_id_.empty()) { |
| 537 ExtensionOmniboxEventRouter::OnInputCancelled( | 548 ExtensionOmniboxEventRouter::OnInputCancelled( |
| 538 profile_, current_keyword_extension_id_); | 549 profile_, current_keyword_extension_id_); |
| 539 | 550 |
| 540 current_keyword_extension_id_.clear(); | 551 current_keyword_extension_id_.clear(); |
| 541 } | 552 } |
| 542 } | 553 } |
| OLD | NEW |