| OLD | NEW |
| 1 // Copyright (c) 2010 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/search_engines/template_url_model.h" | 5 #include "chrome/browser/search_engines/template_url_model.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/environment.h" | 9 #include "base/environment.h" |
| 10 #include "base/stl_util-inl.h" | 10 #include "base/stl_util-inl.h" |
| 11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 39 | 39 |
| 40 // String in the URL that is replaced by the search term. | 40 // String in the URL that is replaced by the search term. |
| 41 static const char kSearchTermParameter[] = "{searchTerms}"; | 41 static const char kSearchTermParameter[] = "{searchTerms}"; |
| 42 | 42 |
| 43 // String in Initializer that is replaced with kSearchTermParameter. | 43 // String in Initializer that is replaced with kSearchTermParameter. |
| 44 static const char kTemplateParameter[] = "%s"; | 44 static const char kTemplateParameter[] = "%s"; |
| 45 | 45 |
| 46 // Term used when generating a search url. Use something obscure so that on | 46 // Term used when generating a search url. Use something obscure so that on |
| 47 // the rare case the term replaces the URL it's unlikely another keyword would | 47 // the rare case the term replaces the URL it's unlikely another keyword would |
| 48 // have the same url. | 48 // have the same url. |
| 49 static const wchar_t kReplacementTerm[] = L"blah.blah.blah.blah.blah"; | 49 static const char kReplacementTerm[] = "blah.blah.blah.blah.blah"; |
| 50 | 50 |
| 51 | 51 |
| 52 // Removes from the vector any template URL that was created because of | 52 // Removes from the vector any template URL that was created because of |
| 53 // policy. These TemplateURLs are freed. | 53 // policy. These TemplateURLs are freed. |
| 54 // Sets default_search_provider to NULL if it was one of them. | 54 // Sets default_search_provider to NULL if it was one of them. |
| 55 static void RemoveProvidersCreatedByPolicy( | 55 static void RemoveProvidersCreatedByPolicy( |
| 56 std::vector<TemplateURL*>* template_urls, | 56 std::vector<TemplateURL*>* template_urls, |
| 57 const TemplateURL** default_search_provider) { | 57 const TemplateURL** default_search_provider) { |
| 58 DCHECK(template_urls); | 58 DCHECK(template_urls); |
| 59 DCHECK(default_search_provider); | 59 DCHECK(default_search_provider); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 TemplateURLModel::~TemplateURLModel() { | 122 TemplateURLModel::~TemplateURLModel() { |
| 123 if (load_handle_) { | 123 if (load_handle_) { |
| 124 DCHECK(service_.get()); | 124 DCHECK(service_.get()); |
| 125 service_->CancelRequest(load_handle_); | 125 service_->CancelRequest(load_handle_); |
| 126 } | 126 } |
| 127 | 127 |
| 128 STLDeleteElements(&template_urls_); | 128 STLDeleteElements(&template_urls_); |
| 129 } | 129 } |
| 130 | 130 |
| 131 // static | 131 // static |
| 132 std::wstring TemplateURLModel::GenerateKeyword(const GURL& url, | 132 string16 TemplateURLModel::GenerateKeyword(const GURL& url, |
| 133 bool autodetected) { | 133 bool autodetected) { |
| 134 // Don't autogenerate keywords for referrers that are the result of a form | 134 // Don't autogenerate keywords for referrers that are the result of a form |
| 135 // submission (TODO: right now we approximate this by checking for the URL | 135 // submission (TODO: right now we approximate this by checking for the URL |
| 136 // having a query, but we should replace this with a call to WebCore to see if | 136 // having a query, but we should replace this with a call to WebCore to see if |
| 137 // the originating page was actually a form submission), anything other than | 137 // the originating page was actually a form submission), anything other than |
| 138 // http, or referrers with a path. | 138 // http, or referrers with a path. |
| 139 // | 139 // |
| 140 // If we relax the path constraint, we need to be sure to sanitize the path | 140 // If we relax the path constraint, we need to be sure to sanitize the path |
| 141 // elements and update AutocompletePopup to look for keywords using the path. | 141 // elements and update AutocompletePopup to look for keywords using the path. |
| 142 // See http://b/issue?id=863583. | 142 // See http://b/issue?id=863583. |
| 143 if (!url.is_valid() || | 143 if (!url.is_valid() || |
| 144 (autodetected && (url.has_query() || !url.SchemeIs(chrome::kHttpScheme) || | 144 (autodetected && (url.has_query() || !url.SchemeIs(chrome::kHttpScheme) || |
| 145 ((url.path() != "") && (url.path() != "/"))))) | 145 ((url.path() != "") && (url.path() != "/"))))) |
| 146 return std::wstring(); | 146 return string16(); |
| 147 | 147 |
| 148 // Strip "www." off the front of the keyword; otherwise the keyword won't work | 148 // Strip "www." off the front of the keyword; otherwise the keyword won't work |
| 149 // properly. See http://code.google.com/p/chromium/issues/detail?id=6984 . | 149 // properly. See http://code.google.com/p/chromium/issues/detail?id=6984 . |
| 150 return UTF16ToWideHack(net::StripWWW(UTF8ToUTF16(url.host()))); | 150 return net::StripWWW(UTF8ToUTF16(url.host())); |
| 151 } | 151 } |
| 152 | 152 |
| 153 // static | 153 // static |
| 154 std::wstring TemplateURLModel::CleanUserInputKeyword( | 154 string16 TemplateURLModel::CleanUserInputKeyword(const string16& keyword) { |
| 155 const std::wstring& keyword) { | |
| 156 // Remove the scheme. | 155 // Remove the scheme. |
| 157 std::wstring result(UTF16ToWide(l10n_util::ToLower(WideToUTF16(keyword)))); | 156 string16 result(l10n_util::ToLower(keyword)); |
| 158 url_parse::Component scheme_component; | 157 url_parse::Component scheme_component; |
| 159 if (url_parse::ExtractScheme(WideToUTF8(keyword).c_str(), | 158 if (url_parse::ExtractScheme(UTF16ToUTF8(keyword).c_str(), |
| 160 static_cast<int>(keyword.length()), | 159 static_cast<int>(keyword.length()), |
| 161 &scheme_component)) { | 160 &scheme_component)) { |
| 162 // If the scheme isn't "http" or "https", bail. The user isn't trying to | 161 // If the scheme isn't "http" or "https", bail. The user isn't trying to |
| 163 // type a web address, but rather an FTP, file:, or other scheme URL, or a | 162 // type a web address, but rather an FTP, file:, or other scheme URL, or a |
| 164 // search query with some sort of initial operator (e.g. "site:"). | 163 // search query with some sort of initial operator (e.g. "site:"). |
| 165 if (result.compare(0, scheme_component.end(), | 164 if (result.compare(0, scheme_component.end(), |
| 166 ASCIIToWide(chrome::kHttpScheme)) && | 165 ASCIIToUTF16(chrome::kHttpScheme)) && |
| 167 result.compare(0, scheme_component.end(), | 166 result.compare(0, scheme_component.end(), |
| 168 ASCIIToWide(chrome::kHttpsScheme))) | 167 ASCIIToUTF16(chrome::kHttpsScheme))) |
| 169 return std::wstring(); | 168 return string16(); |
| 170 | 169 |
| 171 // Include trailing ':'. | 170 // Include trailing ':'. |
| 172 result.erase(0, scheme_component.end() + 1); | 171 result.erase(0, scheme_component.end() + 1); |
| 173 // Many schemes usually have "//" after them, so strip it too. | 172 // Many schemes usually have "//" after them, so strip it too. |
| 174 const std::wstring after_scheme(L"//"); | 173 const string16 after_scheme(ASCIIToUTF16("//")); |
| 175 if (result.compare(0, after_scheme.length(), after_scheme) == 0) | 174 if (result.compare(0, after_scheme.length(), after_scheme) == 0) |
| 176 result.erase(0, after_scheme.length()); | 175 result.erase(0, after_scheme.length()); |
| 177 } | 176 } |
| 178 | 177 |
| 179 // Remove leading "www.". | 178 // Remove leading "www.". |
| 180 result = UTF16ToWideHack(net::StripWWW(WideToUTF16(result))); | 179 result = net::StripWWW(result); |
| 181 | 180 |
| 182 // Remove trailing "/". | 181 // Remove trailing "/". |
| 183 return (result.length() > 0 && result[result.length() - 1] == L'/') ? | 182 return (result.length() > 0 && result[result.length() - 1] == '/') ? |
| 184 result.substr(0, result.length() - 1) : result; | 183 result.substr(0, result.length() - 1) : result; |
| 185 } | 184 } |
| 186 | 185 |
| 187 // static | 186 // static |
| 188 GURL TemplateURLModel::GenerateSearchURL(const TemplateURL* t_url) { | 187 GURL TemplateURLModel::GenerateSearchURL(const TemplateURL* t_url) { |
| 189 DCHECK(t_url); | 188 DCHECK(t_url); |
| 190 UIThreadSearchTermsData search_terms_data; | 189 UIThreadSearchTermsData search_terms_data; |
| 191 return GenerateSearchURLUsingTermsData(t_url, search_terms_data); | 190 return GenerateSearchURLUsingTermsData(t_url, search_terms_data); |
| 192 } | 191 } |
| 193 | 192 |
| 194 // static | 193 // static |
| 195 GURL TemplateURLModel::GenerateSearchURLUsingTermsData( | 194 GURL TemplateURLModel::GenerateSearchURLUsingTermsData( |
| 196 const TemplateURL* t_url, | 195 const TemplateURL* t_url, |
| 197 const SearchTermsData& search_terms_data) { | 196 const SearchTermsData& search_terms_data) { |
| 198 DCHECK(t_url); | 197 DCHECK(t_url); |
| 199 const TemplateURLRef* search_ref = t_url->url(); | 198 const TemplateURLRef* search_ref = t_url->url(); |
| 200 // Extension keywords don't have host-based search URLs. | 199 // Extension keywords don't have host-based search URLs. |
| 201 if (!search_ref || !search_ref->IsValidUsingTermsData(search_terms_data) || | 200 if (!search_ref || !search_ref->IsValidUsingTermsData(search_terms_data) || |
| 202 t_url->IsExtensionKeyword()) | 201 t_url->IsExtensionKeyword()) |
| 203 return GURL(); | 202 return GURL(); |
| 204 | 203 |
| 205 if (!search_ref->SupportsReplacementUsingTermsData(search_terms_data)) | 204 if (!search_ref->SupportsReplacementUsingTermsData(search_terms_data)) |
| 206 return GURL(search_ref->url()); | 205 return GURL(search_ref->url()); |
| 207 | 206 |
| 208 return GURL(search_ref->ReplaceSearchTermsUsingTermsData( | 207 return GURL(search_ref->ReplaceSearchTermsUsingTermsData( |
| 209 *t_url, kReplacementTerm, TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, | 208 *t_url, ASCIIToUTF16(kReplacementTerm), |
| 210 std::wstring(), search_terms_data)); | 209 TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, |
| 210 string16(), search_terms_data)); |
| 211 } | 211 } |
| 212 | 212 |
| 213 bool TemplateURLModel::CanReplaceKeyword( | 213 bool TemplateURLModel::CanReplaceKeyword( |
| 214 const std::wstring& keyword, | 214 const string16& keyword, |
| 215 const GURL& url, | 215 const GURL& url, |
| 216 const TemplateURL** template_url_to_replace) { | 216 const TemplateURL** template_url_to_replace) { |
| 217 DCHECK(!keyword.empty()); // This should only be called for non-empty | 217 DCHECK(!keyword.empty()); // This should only be called for non-empty |
| 218 // keywords. If we need to support empty kewords | 218 // keywords. If we need to support empty kewords |
| 219 // the code needs to change slightly. | 219 // the code needs to change slightly. |
| 220 const TemplateURL* existing_url = GetTemplateURLForKeyword(keyword); | 220 const TemplateURL* existing_url = GetTemplateURLForKeyword(keyword); |
| 221 if (existing_url) { | 221 if (existing_url) { |
| 222 // We already have a TemplateURL for this keyword. Only allow it to be | 222 // We already have a TemplateURL for this keyword. Only allow it to be |
| 223 // replaced if the TemplateURL can be replaced. | 223 // replaced if the TemplateURL can be replaced. |
| 224 if (template_url_to_replace) | 224 if (template_url_to_replace) |
| 225 *template_url_to_replace = existing_url; | 225 *template_url_to_replace = existing_url; |
| 226 return CanReplace(existing_url); | 226 return CanReplace(existing_url); |
| 227 } | 227 } |
| 228 | 228 |
| 229 // We don't have a TemplateURL with keyword. Only allow a new one if there | 229 // We don't have a TemplateURL with keyword. Only allow a new one if there |
| 230 // isn't a TemplateURL for the specified host, or there is one but it can | 230 // isn't a TemplateURL for the specified host, or there is one but it can |
| 231 // be replaced. We do this to ensure that if the user assigns a different | 231 // be replaced. We do this to ensure that if the user assigns a different |
| 232 // keyword to a generated TemplateURL, we won't regenerate another keyword for | 232 // keyword to a generated TemplateURL, we won't regenerate another keyword for |
| 233 // the same host. | 233 // the same host. |
| 234 if (url.is_valid() && !url.host().empty()) | 234 if (url.is_valid() && !url.host().empty()) |
| 235 return CanReplaceKeywordForHost(url.host(), template_url_to_replace); | 235 return CanReplaceKeywordForHost(url.host(), template_url_to_replace); |
| 236 return true; | 236 return true; |
| 237 } | 237 } |
| 238 | 238 |
| 239 void TemplateURLModel::FindMatchingKeywords( | 239 void TemplateURLModel::FindMatchingKeywords( |
| 240 const std::wstring& prefix, | 240 const string16& prefix, |
| 241 bool support_replacement_only, | 241 bool support_replacement_only, |
| 242 std::vector<std::wstring>* matches) const { | 242 std::vector<string16>* matches) const { |
| 243 // Sanity check args. | 243 // Sanity check args. |
| 244 if (prefix.empty()) | 244 if (prefix.empty()) |
| 245 return; | 245 return; |
| 246 DCHECK(matches != NULL); | 246 DCHECK(matches != NULL); |
| 247 DCHECK(matches->empty()); // The code for exact matches assumes this. | 247 DCHECK(matches->empty()); // The code for exact matches assumes this. |
| 248 | 248 |
| 249 // Find matching keyword range. Searches the element map for keywords | 249 // Find matching keyword range. Searches the element map for keywords |
| 250 // beginning with |prefix| and stores the endpoints of the resulting set in | 250 // beginning with |prefix| and stores the endpoints of the resulting set in |
| 251 // |match_range|. | 251 // |match_range|. |
| 252 const std::pair<KeywordToTemplateMap::const_iterator, | 252 const std::pair<KeywordToTemplateMap::const_iterator, |
| 253 KeywordToTemplateMap::const_iterator> match_range( | 253 KeywordToTemplateMap::const_iterator> match_range( |
| 254 std::equal_range( | 254 std::equal_range( |
| 255 keyword_to_template_map_.begin(), keyword_to_template_map_.end(), | 255 keyword_to_template_map_.begin(), keyword_to_template_map_.end(), |
| 256 KeywordToTemplateMap::value_type(prefix, NULL), LessWithPrefix())); | 256 KeywordToTemplateMap::value_type(prefix, NULL), LessWithPrefix())); |
| 257 | 257 |
| 258 // Return vector of matching keywords. | 258 // Return vector of matching keywords. |
| 259 for (KeywordToTemplateMap::const_iterator i(match_range.first); | 259 for (KeywordToTemplateMap::const_iterator i(match_range.first); |
| 260 i != match_range.second; ++i) { | 260 i != match_range.second; ++i) { |
| 261 DCHECK(i->second->url()); | 261 DCHECK(i->second->url()); |
| 262 if (!support_replacement_only || i->second->url()->SupportsReplacement()) | 262 if (!support_replacement_only || i->second->url()->SupportsReplacement()) |
| 263 matches->push_back(i->first); | 263 matches->push_back(i->first); |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 | 266 |
| 267 const TemplateURL* TemplateURLModel::GetTemplateURLForKeyword( | 267 const TemplateURL* TemplateURLModel::GetTemplateURLForKeyword( |
| 268 const std::wstring& keyword) const { | 268 const string16& keyword) const { |
| 269 KeywordToTemplateMap::const_iterator elem( | 269 KeywordToTemplateMap::const_iterator elem( |
| 270 keyword_to_template_map_.find(keyword)); | 270 keyword_to_template_map_.find(keyword)); |
| 271 return (elem == keyword_to_template_map_.end()) ? NULL : elem->second; | 271 return (elem == keyword_to_template_map_.end()) ? NULL : elem->second; |
| 272 } | 272 } |
| 273 | 273 |
| 274 const TemplateURL* TemplateURLModel::GetTemplateURLForHost( | 274 const TemplateURL* TemplateURLModel::GetTemplateURLForHost( |
| 275 const std::string& host) const { | 275 const std::string& host) const { |
| 276 return provider_map_.GetTemplateURLForHost(host); | 276 return provider_map_.GetTemplateURLForHost(host); |
| 277 } | 277 } |
| 278 | 278 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 if (extension->omnibox_keyword().empty()) | 313 if (extension->omnibox_keyword().empty()) |
| 314 return; | 314 return; |
| 315 | 315 |
| 316 Load(); | 316 Load(); |
| 317 if (!loaded_) { | 317 if (!loaded_) { |
| 318 pending_extension_ids_.push_back(extension->id()); | 318 pending_extension_ids_.push_back(extension->id()); |
| 319 return; | 319 return; |
| 320 } | 320 } |
| 321 | 321 |
| 322 const TemplateURL* existing_url = GetTemplateURLForExtension(extension); | 322 const TemplateURL* existing_url = GetTemplateURLForExtension(extension); |
| 323 std::wstring keyword = UTF8ToWide(extension->omnibox_keyword()); | 323 string16 keyword = UTF8ToUTF16(extension->omnibox_keyword()); |
| 324 | 324 |
| 325 scoped_ptr<TemplateURL> template_url(new TemplateURL); | 325 scoped_ptr<TemplateURL> template_url(new TemplateURL); |
| 326 template_url->set_short_name(UTF8ToWide(extension->name())); | 326 template_url->set_short_name(UTF8ToUTF16(extension->name())); |
| 327 template_url->set_keyword(keyword); | 327 template_url->set_keyword(keyword); |
| 328 // This URL is not actually used for navigation. It holds the extension's | 328 // This URL is not actually used for navigation. It holds the extension's |
| 329 // ID, as well as forcing the TemplateURL to be treated as a search keyword. | 329 // ID, as well as forcing the TemplateURL to be treated as a search keyword. |
| 330 template_url->SetURL( | 330 template_url->SetURL( |
| 331 std::string(chrome::kExtensionScheme) + "://" + | 331 std::string(chrome::kExtensionScheme) + "://" + |
| 332 extension->id() + "/?q={searchTerms}", 0, 0); | 332 extension->id() + "/?q={searchTerms}", 0, 0); |
| 333 template_url->set_safe_for_autoreplace(false); | 333 template_url->set_safe_for_autoreplace(false); |
| 334 | 334 |
| 335 if (existing_url) { | 335 if (existing_url) { |
| 336 // TODO(mpcomplete): only replace if the user hasn't changed the keyword. | 336 // TODO(mpcomplete): only replace if the user hasn't changed the keyword. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 365 | 365 |
| 366 void TemplateURLModel::IncrementUsageCount(const TemplateURL* url) { | 366 void TemplateURLModel::IncrementUsageCount(const TemplateURL* url) { |
| 367 DCHECK(url && find(template_urls_.begin(), template_urls_.end(), url) != | 367 DCHECK(url && find(template_urls_.begin(), template_urls_.end(), url) != |
| 368 template_urls_.end()); | 368 template_urls_.end()); |
| 369 const_cast<TemplateURL*>(url)->set_usage_count(url->usage_count() + 1); | 369 const_cast<TemplateURL*>(url)->set_usage_count(url->usage_count() + 1); |
| 370 if (service_.get()) | 370 if (service_.get()) |
| 371 service_.get()->UpdateKeyword(*url); | 371 service_.get()->UpdateKeyword(*url); |
| 372 } | 372 } |
| 373 | 373 |
| 374 void TemplateURLModel::ResetTemplateURL(const TemplateURL* url, | 374 void TemplateURLModel::ResetTemplateURL(const TemplateURL* url, |
| 375 const std::wstring& title, | 375 const string16& title, |
| 376 const std::wstring& keyword, | 376 const string16& keyword, |
| 377 const std::string& search_url) { | 377 const std::string& search_url) { |
| 378 TemplateURL new_url(*url); | 378 TemplateURL new_url(*url); |
| 379 new_url.set_short_name(title); | 379 new_url.set_short_name(title); |
| 380 new_url.set_keyword(keyword); | 380 new_url.set_keyword(keyword); |
| 381 if ((new_url.url() && search_url.empty()) || | 381 if ((new_url.url() && search_url.empty()) || |
| 382 (!new_url.url() && !search_url.empty()) || | 382 (!new_url.url() && !search_url.empty()) || |
| 383 (new_url.url() && new_url.url()->url() != search_url)) { | 383 (new_url.url() && new_url.url()->url() != search_url)) { |
| 384 // The urls have changed, reset the favicon url. | 384 // The urls have changed, reset the favicon url. |
| 385 new_url.SetFavIconURL(GURL()); | 385 new_url.SetFavIconURL(GURL()); |
| 386 new_url.SetURL(search_url, 0, 0); | 386 new_url.SetURL(search_url, 0, 0); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 UpdateKeywordSearchTermsForURL(visits_to_add_[i]); | 531 UpdateKeywordSearchTermsForURL(visits_to_add_[i]); |
| 532 visits_to_add_.clear(); | 532 visits_to_add_.clear(); |
| 533 | 533 |
| 534 if (new_resource_keyword_version && service_.get()) | 534 if (new_resource_keyword_version && service_.get()) |
| 535 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); | 535 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); |
| 536 | 536 |
| 537 NotifyObservers(); | 537 NotifyObservers(); |
| 538 NotifyLoaded(); | 538 NotifyLoaded(); |
| 539 } | 539 } |
| 540 | 540 |
| 541 std::wstring TemplateURLModel::GetKeywordShortName(const std::wstring& keyword, | 541 string16 TemplateURLModel::GetKeywordShortName(const string16& keyword, |
| 542 bool* is_extension_keyword) { | 542 bool* is_extension_keyword) { |
| 543 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword); | 543 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword); |
| 544 | 544 |
| 545 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLModel | 545 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLModel |
| 546 // to track changes to the model, this should become a DCHECK. | 546 // to track changes to the model, this should become a DCHECK. |
| 547 if (template_url) { | 547 if (template_url) { |
| 548 *is_extension_keyword = template_url->IsExtensionKeyword(); | 548 *is_extension_keyword = template_url->IsExtensionKeyword(); |
| 549 return template_url->AdjustedShortNameForLocaleDirection(); | 549 return template_url->AdjustedShortNameForLocaleDirection(); |
| 550 } | 550 } |
| 551 *is_extension_keyword = false; | 551 *is_extension_keyword = false; |
| 552 return std::wstring(); | 552 return string16(); |
| 553 } | 553 } |
| 554 | 554 |
| 555 void TemplateURLModel::Observe(NotificationType type, | 555 void TemplateURLModel::Observe(NotificationType type, |
| 556 const NotificationSource& source, | 556 const NotificationSource& source, |
| 557 const NotificationDetails& details) { | 557 const NotificationDetails& details) { |
| 558 if (type == NotificationType::HISTORY_URL_VISITED) { | 558 if (type == NotificationType::HISTORY_URL_VISITED) { |
| 559 Details<history::URLVisitedDetails> visit_details(details); | 559 Details<history::URLVisitedDetails> visit_details(details); |
| 560 if (!loaded()) | 560 if (!loaded()) |
| 561 visits_to_add_.push_back(*visit_details.ptr()); | 561 visits_to_add_.push_back(*visit_details.ptr()); |
| 562 else | 562 else |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 prefs->RegisterStringPref( | 595 prefs->RegisterStringPref( |
| 596 prefs::kDefaultSearchProviderKeyword, std::string()); | 596 prefs::kDefaultSearchProviderKeyword, std::string()); |
| 597 prefs->RegisterStringPref( | 597 prefs->RegisterStringPref( |
| 598 prefs::kDefaultSearchProviderIconURL, std::string()); | 598 prefs::kDefaultSearchProviderIconURL, std::string()); |
| 599 prefs->RegisterStringPref( | 599 prefs->RegisterStringPref( |
| 600 prefs::kDefaultSearchProviderEncodings, std::string()); | 600 prefs::kDefaultSearchProviderEncodings, std::string()); |
| 601 } | 601 } |
| 602 | 602 |
| 603 void TemplateURLModel::SetKeywordSearchTermsForURL(const TemplateURL* t_url, | 603 void TemplateURLModel::SetKeywordSearchTermsForURL(const TemplateURL* t_url, |
| 604 const GURL& url, | 604 const GURL& url, |
| 605 const std::wstring& term) { | 605 const string16& term) { |
| 606 HistoryService* history = profile_ ? | 606 HistoryService* history = profile_ ? |
| 607 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : NULL; | 607 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : NULL; |
| 608 if (!history) | 608 if (!history) |
| 609 return; | 609 return; |
| 610 history->SetKeywordSearchTermsForURL(url, t_url->id(), WideToUTF16Hack(term)); | 610 history->SetKeywordSearchTermsForURL(url, t_url->id(), term); |
| 611 } | 611 } |
| 612 | 612 |
| 613 void TemplateURLModel::Init(const Initializer* initializers, | 613 void TemplateURLModel::Init(const Initializer* initializers, |
| 614 int num_initializers) { | 614 int num_initializers) { |
| 615 // Register for notifications. | 615 // Register for notifications. |
| 616 if (profile_) { | 616 if (profile_) { |
| 617 // TODO(sky): bug 1166191. The keywords should be moved into the history | 617 // TODO(sky): bug 1166191. The keywords should be moved into the history |
| 618 // db, which will mean we no longer need this notification and the history | 618 // db, which will mean we no longer need this notification and the history |
| 619 // backend can handle automatically adding the search terms as the user | 619 // backend can handle automatically adding the search terms as the user |
| 620 // navigates. | 620 // navigates. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 633 ChangeToLoadedState(); | 633 ChangeToLoadedState(); |
| 634 | 634 |
| 635 // Add specific initializers, if any. | 635 // Add specific initializers, if any. |
| 636 for (int i(0); i < num_initializers; ++i) { | 636 for (int i(0); i < num_initializers; ++i) { |
| 637 DCHECK(initializers[i].keyword); | 637 DCHECK(initializers[i].keyword); |
| 638 DCHECK(initializers[i].url); | 638 DCHECK(initializers[i].url); |
| 639 DCHECK(initializers[i].content); | 639 DCHECK(initializers[i].content); |
| 640 | 640 |
| 641 size_t template_position = | 641 size_t template_position = |
| 642 std::string(initializers[i].url).find(kTemplateParameter); | 642 std::string(initializers[i].url).find(kTemplateParameter); |
| 643 DCHECK(template_position != std::wstring::npos); | 643 DCHECK(template_position != std::string::npos); |
| 644 std::string osd_url(initializers[i].url); | 644 std::string osd_url(initializers[i].url); |
| 645 osd_url.replace(template_position, arraysize(kTemplateParameter) - 1, | 645 osd_url.replace(template_position, arraysize(kTemplateParameter) - 1, |
| 646 kSearchTermParameter); | 646 kSearchTermParameter); |
| 647 | 647 |
| 648 // TemplateURLModel ends up owning the TemplateURL, don't try and free it. | 648 // TemplateURLModel ends up owning the TemplateURL, don't try and free it. |
| 649 TemplateURL* template_url = new TemplateURL(); | 649 TemplateURL* template_url = new TemplateURL(); |
| 650 template_url->set_keyword(initializers[i].keyword); | 650 template_url->set_keyword(UTF8ToUTF16(initializers[i].keyword)); |
| 651 template_url->set_short_name(initializers[i].content); | 651 template_url->set_short_name(UTF8ToUTF16(initializers[i].content)); |
| 652 template_url->SetURL(osd_url, 0, 0); | 652 template_url->SetURL(osd_url, 0, 0); |
| 653 AddNoNotify(template_url); | 653 AddNoNotify(template_url); |
| 654 } | 654 } |
| 655 } | 655 } |
| 656 | 656 |
| 657 // Initialize default search. | 657 // Initialize default search. |
| 658 UpdateDefaultSearch(); | 658 UpdateDefaultSearch(); |
| 659 | 659 |
| 660 // Request a server check for the correct Google URL if Google is the | 660 // Request a server check for the correct Google URL if Google is the |
| 661 // default search engine, not in headless mode and not in Chrome Frame. | 661 // default search engine, not in headless mode and not in Chrome Frame. |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 if (t_url->url()) | 770 if (t_url->url()) |
| 771 search_url = t_url->url()->url(); | 771 search_url = t_url->url()->url(); |
| 772 if (t_url->suggestions_url()) | 772 if (t_url->suggestions_url()) |
| 773 suggest_url = t_url->suggestions_url()->url(); | 773 suggest_url = t_url->suggestions_url()->url(); |
| 774 if (t_url->instant_url()) | 774 if (t_url->instant_url()) |
| 775 instant_url = t_url->instant_url()->url(); | 775 instant_url = t_url->instant_url()->url(); |
| 776 GURL icon_gurl = t_url->GetFavIconURL(); | 776 GURL icon_gurl = t_url->GetFavIconURL(); |
| 777 if (!icon_gurl.is_empty()) | 777 if (!icon_gurl.is_empty()) |
| 778 icon_url = icon_gurl.spec(); | 778 icon_url = icon_gurl.spec(); |
| 779 encodings = JoinString(t_url->input_encodings(), ';'); | 779 encodings = JoinString(t_url->input_encodings(), ';'); |
| 780 short_name = WideToUTF8(t_url->short_name()); | 780 short_name = UTF16ToUTF8(t_url->short_name()); |
| 781 keyword = WideToUTF8(t_url->keyword()); | 781 keyword = UTF16ToUTF8(t_url->keyword()); |
| 782 id_string = base::Int64ToString(t_url->id()); | 782 id_string = base::Int64ToString(t_url->id()); |
| 783 prepopulate_id = base::Int64ToString(t_url->prepopulate_id()); | 783 prepopulate_id = base::Int64ToString(t_url->prepopulate_id()); |
| 784 } | 784 } |
| 785 prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, enabled); | 785 prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, enabled); |
| 786 prefs->SetString(prefs::kDefaultSearchProviderSearchURL, search_url); | 786 prefs->SetString(prefs::kDefaultSearchProviderSearchURL, search_url); |
| 787 prefs->SetString(prefs::kDefaultSearchProviderSuggestURL, suggest_url); | 787 prefs->SetString(prefs::kDefaultSearchProviderSuggestURL, suggest_url); |
| 788 prefs->SetString(prefs::kDefaultSearchProviderInstantURL, instant_url); | 788 prefs->SetString(prefs::kDefaultSearchProviderInstantURL, instant_url); |
| 789 prefs->SetString(prefs::kDefaultSearchProviderIconURL, icon_url); | 789 prefs->SetString(prefs::kDefaultSearchProviderIconURL, icon_url); |
| 790 prefs->SetString(prefs::kDefaultSearchProviderEncodings, encodings); | 790 prefs->SetString(prefs::kDefaultSearchProviderEncodings, encodings); |
| 791 prefs->SetString(prefs::kDefaultSearchProviderName, short_name); | 791 prefs->SetString(prefs::kDefaultSearchProviderName, short_name); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 815 prefs->GetString(prefs::kDefaultSearchProviderSearchURL); | 815 prefs->GetString(prefs::kDefaultSearchProviderSearchURL); |
| 816 std::string instant_url = | 816 std::string instant_url = |
| 817 prefs->GetString(prefs::kDefaultSearchProviderInstantURL); | 817 prefs->GetString(prefs::kDefaultSearchProviderInstantURL); |
| 818 | 818 |
| 819 if (!enabled || (suggest_url.empty() && search_url.empty())) { | 819 if (!enabled || (suggest_url.empty() && search_url.empty())) { |
| 820 // The user doesn't want a default search provider. | 820 // The user doesn't want a default search provider. |
| 821 default_provider->reset(NULL); | 821 default_provider->reset(NULL); |
| 822 return true; | 822 return true; |
| 823 } | 823 } |
| 824 | 824 |
| 825 std::wstring name = | 825 string16 name = |
| 826 UTF8ToWide(prefs->GetString(prefs::kDefaultSearchProviderName)); | 826 UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderName)); |
| 827 std::wstring keyword = | 827 string16 keyword = |
| 828 UTF8ToWide(prefs->GetString(prefs::kDefaultSearchProviderKeyword)); | 828 UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderKeyword)); |
| 829 std::string icon_url = | 829 std::string icon_url = |
| 830 prefs->GetString(prefs::kDefaultSearchProviderIconURL); | 830 prefs->GetString(prefs::kDefaultSearchProviderIconURL); |
| 831 std::string encodings = | 831 std::string encodings = |
| 832 prefs->GetString(prefs::kDefaultSearchProviderEncodings); | 832 prefs->GetString(prefs::kDefaultSearchProviderEncodings); |
| 833 std::string id_string = prefs->GetString(prefs::kDefaultSearchProviderID); | 833 std::string id_string = prefs->GetString(prefs::kDefaultSearchProviderID); |
| 834 std::string prepopulate_id = | 834 std::string prepopulate_id = |
| 835 prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID); | 835 prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID); |
| 836 | 836 |
| 837 default_provider->reset(new TemplateURL()); | 837 default_provider->reset(new TemplateURL()); |
| 838 (*default_provider)->set_short_name(name); | 838 (*default_provider)->set_short_name(name); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 // KEYWORD_GENERATED visit for the KEYWORD so that the keyword typed | 976 // KEYWORD_GENERATED visit for the KEYWORD so that the keyword typed |
| 977 // count is boosted. | 977 // count is boosted. |
| 978 AddTabToSearchVisit(**i); | 978 AddTabToSearchVisit(**i); |
| 979 } | 979 } |
| 980 | 980 |
| 981 QueryTerms::iterator terms_iterator = | 981 QueryTerms::iterator terms_iterator = |
| 982 query_terms.find(search_ref->GetSearchTermKey()); | 982 query_terms.find(search_ref->GetSearchTermKey()); |
| 983 if (terms_iterator != query_terms.end() && | 983 if (terms_iterator != query_terms.end() && |
| 984 !terms_iterator->second.empty()) { | 984 !terms_iterator->second.empty()) { |
| 985 SetKeywordSearchTermsForURL( | 985 SetKeywordSearchTermsForURL( |
| 986 *i, row.url(), search_ref->SearchTermToWide(*(*i), | 986 *i, row.url(), search_ref->SearchTermToString16(*(*i), |
| 987 terms_iterator->second)); | 987 terms_iterator->second)); |
| 988 } | 988 } |
| 989 } | 989 } |
| 990 } | 990 } |
| 991 } | 991 } |
| 992 | 992 |
| 993 void TemplateURLModel::AddTabToSearchVisit(const TemplateURL& t_url) { | 993 void TemplateURLModel::AddTabToSearchVisit(const TemplateURL& t_url) { |
| 994 // Only add visits for entries the user hasn't modified. If the user modified | 994 // Only add visits for entries the user hasn't modified. If the user modified |
| 995 // the entry the keyword may no longer correspond to the host name. It may be | 995 // the entry the keyword may no longer correspond to the host name. It may be |
| 996 // possible to do something more sophisticated here, but it's so rare as to | 996 // possible to do something more sophisticated here, but it's so rare as to |
| 997 // not be worth it. | 997 // not be worth it. |
| 998 if (!t_url.safe_for_autoreplace()) | 998 if (!t_url.safe_for_autoreplace()) |
| 999 return; | 999 return; |
| 1000 | 1000 |
| 1001 if (!profile_) | 1001 if (!profile_) |
| 1002 return; | 1002 return; |
| 1003 | 1003 |
| 1004 HistoryService* history = | 1004 HistoryService* history = |
| 1005 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); | 1005 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
| 1006 if (!history) | 1006 if (!history) |
| 1007 return; | 1007 return; |
| 1008 | 1008 |
| 1009 GURL url(URLFixerUpper::FixupURL(WideToUTF8(t_url.keyword()), std::string())); | 1009 GURL url(URLFixerUpper::FixupURL(UTF16ToUTF8(t_url.keyword()), |
| 1010 std::string())); |
| 1010 if (!url.is_valid()) | 1011 if (!url.is_valid()) |
| 1011 return; | 1012 return; |
| 1012 | 1013 |
| 1013 // Synthesize a visit for the keyword. This ensures the url for the keyword is | 1014 // Synthesize a visit for the keyword. This ensures the url for the keyword is |
| 1014 // autocompleted even if the user doesn't type the url in directly. | 1015 // autocompleted even if the user doesn't type the url in directly. |
| 1015 history->AddPage(url, NULL, 0, GURL(), | 1016 history->AddPage(url, NULL, 0, GURL(), |
| 1016 PageTransition::KEYWORD_GENERATED, | 1017 PageTransition::KEYWORD_GENERATED, |
| 1017 history::RedirectList(), history::SOURCE_BROWSED, false); | 1018 history::RedirectList(), history::SOURCE_BROWSED, false); |
| 1018 } | 1019 } |
| 1019 | 1020 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1251 delete template_url; | 1252 delete template_url; |
| 1252 } | 1253 } |
| 1253 | 1254 |
| 1254 void TemplateURLModel::NotifyObservers() { | 1255 void TemplateURLModel::NotifyObservers() { |
| 1255 if (!loaded_) | 1256 if (!loaded_) |
| 1256 return; | 1257 return; |
| 1257 | 1258 |
| 1258 FOR_EACH_OBSERVER(TemplateURLModelObserver, model_observers_, | 1259 FOR_EACH_OBSERVER(TemplateURLModelObserver, model_observers_, |
| 1259 OnTemplateURLModelChanged()); | 1260 OnTemplateURLModelChanged()); |
| 1260 } | 1261 } |
| OLD | NEW |