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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/autocomplete/autocomplete_provider.h" 6 7 #include "base/logging.h" 8 #include "base/prefs/pref_service.h" 9 #include "base/strings/utf_string_conversions.h" 10 #include "chrome/browser/autocomplete/autocomplete_match.h" 11 #include "chrome/browser/autocomplete/autocomplete_provider_listener.h" 12 #include "chrome/browser/bookmarks/bookmark_model.h" 13 #include "chrome/browser/bookmarks/bookmark_model_factory.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/common/pref_names.h" 16 #include "content/public/common/url_constants.h" 17 #include "net/base/net_util.h" 18 #include "url/gurl.h" 19 #include "url/url_util.h" 20 21 // static 22 const size_t AutocompleteProvider::kMaxMatches = 3; 23 24 AutocompleteProvider::AutocompleteProvider( 25 AutocompleteProviderListener* listener, 26 Profile* profile, 27 Type type) 28 : profile_(profile), 29 listener_(listener), 30 done_(true), 31 type_(type) { 32 } 33 34 // static 35 const char* AutocompleteProvider::TypeToString(Type type) { 36 switch (type) { 37 case TYPE_BOOKMARK: 38 return "Bookmark"; 39 case TYPE_BUILTIN: 40 return "Builtin"; 41 case TYPE_CONTACT: 42 return "Contact"; 43 case TYPE_EXTENSION_APP: 44 return "ExtensionApp"; 45 case TYPE_HISTORY_QUICK: 46 return "HistoryQuick"; 47 case TYPE_HISTORY_URL: 48 return "HistoryURL"; 49 case TYPE_KEYWORD: 50 return "Keyword"; 51 case TYPE_SEARCH: 52 return "Search"; 53 case TYPE_SHORTCUTS: 54 return "Shortcuts"; 55 case TYPE_ZERO_SUGGEST: 56 return "ZeroSuggest"; 57 default: 58 NOTREACHED() << "Unhandled AutocompleteProvider::Type " << type; 59 return "Unknown"; 60 } 61 } 62 63 void AutocompleteProvider::Stop(bool clear_cached_results) { 64 done_ = true; 65 } 66 67 const char* AutocompleteProvider::GetName() const { 68 return TypeToString(type_); 69 } 70 71 metrics::OmniboxEventProto_ProviderType AutocompleteProvider:: 72 AsOmniboxEventProviderType() const { 73 switch (type_) { 74 case TYPE_BOOKMARK: 75 return metrics::OmniboxEventProto::BOOKMARK; 76 case TYPE_BUILTIN: 77 return metrics::OmniboxEventProto::BUILTIN; 78 case TYPE_CONTACT: 79 return metrics::OmniboxEventProto::CONTACT; 80 case TYPE_EXTENSION_APP: 81 return metrics::OmniboxEventProto::EXTENSION_APPS; 82 case TYPE_HISTORY_QUICK: 83 return metrics::OmniboxEventProto::HISTORY_QUICK; 84 case TYPE_HISTORY_URL: 85 return metrics::OmniboxEventProto::HISTORY_URL; 86 case TYPE_KEYWORD: 87 return metrics::OmniboxEventProto::KEYWORD; 88 case TYPE_SEARCH: 89 return metrics::OmniboxEventProto::SEARCH; 90 case TYPE_SHORTCUTS: 91 return metrics::OmniboxEventProto::SHORTCUTS; 92 case TYPE_ZERO_SUGGEST: 93 return metrics::OmniboxEventProto::ZERO_SUGGEST; 94 default: 95 NOTREACHED() << "Unhandled AutocompleteProvider::Type " << type_; 96 return metrics::OmniboxEventProto::UNKNOWN_PROVIDER; 97 } 98 } 99 100 void AutocompleteProvider::DeleteMatch(const AutocompleteMatch& match) { 101 DLOG(WARNING) << "The AutocompleteProvider '" << GetName() 102 << "' has not implemented DeleteMatch."; 103 } 104 105 void AutocompleteProvider::AddProviderInfo(ProvidersInfo* provider_info) const { 106 } 107 108 void AutocompleteProvider::ResetSession() { 109 } 110 111 string16 AutocompleteProvider::StringForURLDisplay(const GURL& url, 112 bool check_accept_lang, 113 bool trim_http) const { 114 std::string languages = (check_accept_lang && profile_) ? 115 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages) : std::string(); 116 return net::FormatUrl(url, languages, 117 net::kFormatUrlOmitAll & ~(trim_http ? 0 : net::kFormatUrlOmitHTTP), 118 net::UnescapeRule::SPACES, NULL, NULL, NULL); 119 } 120 121 AutocompleteProvider::~AutocompleteProvider() { 122 Stop(false); 123 } 124 125 // static 126 bool AutocompleteProvider::HasHTTPScheme(const string16& input) { 127 std::string utf8_input(UTF16ToUTF8(input)); 128 url_parse::Component scheme; 129 if (url_util::FindAndCompareScheme(utf8_input, content::kViewSourceScheme, 130 &scheme)) 131 utf8_input.erase(0, scheme.end() + 1); 132 return url_util::FindAndCompareScheme(utf8_input, chrome::kHttpScheme, NULL); 133 } 134 135 void AutocompleteProvider::UpdateStarredStateOfMatches() { 136 if (matches_.empty()) 137 return; 138 139 if (!profile_) 140 return; 141 142 BookmarkModel* bookmark_model = BookmarkModelFactory::GetForProfile(profile_); 143 if (!bookmark_model || !bookmark_model->loaded()) 144 return; 145 146 for (ACMatches::iterator i(matches_.begin()); i != matches_.end(); ++i) 147 i->starred = bookmark_model->IsBookmarked(i->destination_url); 148 } 149