OLD | NEW |
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/search_engines/template_url_service.h" | 5 #include "chrome/browser/search_engines/template_url_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #include "chrome/common/pref_names.h" | 44 #include "chrome/common/pref_names.h" |
45 #include "chrome/common/url_constants.h" | 45 #include "chrome/common/url_constants.h" |
46 #include "content/public/browser/notification_service.h" | 46 #include "content/public/browser/notification_service.h" |
47 #include "extensions/common/constants.h" | 47 #include "extensions/common/constants.h" |
48 #include "net/base/net_util.h" | 48 #include "net/base/net_util.h" |
49 #include "sync/api/sync_change.h" | 49 #include "sync/api/sync_change.h" |
50 #include "sync/api/sync_error_factory.h" | 50 #include "sync/api/sync_error_factory.h" |
51 #include "sync/protocol/search_engine_specifics.pb.h" | 51 #include "sync/protocol/search_engine_specifics.pb.h" |
52 #include "sync/protocol/sync.pb.h" | 52 #include "sync/protocol/sync.pb.h" |
53 #include "ui/base/l10n/l10n_util.h" | 53 #include "ui/base/l10n/l10n_util.h" |
54 #include "url/gurl.h" | |
55 | 54 |
56 typedef SearchHostToURLsMap::TemplateURLSet TemplateURLSet; | 55 typedef SearchHostToURLsMap::TemplateURLSet TemplateURLSet; |
57 typedef TemplateURLService::SyncDataMap SyncDataMap; | 56 typedef TemplateURLService::SyncDataMap SyncDataMap; |
58 | 57 |
59 namespace { | 58 namespace { |
60 | 59 |
61 bool TemplateURLMatchesData(const TemplateURL* url1, | 60 bool TemplateURLMatchesData(const TemplateURL* url1, |
62 const TemplateURLData* url2) { | 61 const TemplateURLData* url2) { |
63 if (!url1 || !url2) | 62 if (!url1 || !url2) |
64 return !url1 && !url2; | 63 return !url1 && !url2; |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 load_handle_(0), | 284 load_handle_(0), |
286 default_search_provider_(NULL), | 285 default_search_provider_(NULL), |
287 is_default_search_managed_(false), | 286 is_default_search_managed_(false), |
288 next_id_(kInvalidTemplateURLID + 1), | 287 next_id_(kInvalidTemplateURLID + 1), |
289 time_provider_(&base::Time::Now), | 288 time_provider_(&base::Time::Now), |
290 models_associated_(false), | 289 models_associated_(false), |
291 processing_syncer_changes_(false), | 290 processing_syncer_changes_(false), |
292 pending_synced_default_search_(false), | 291 pending_synced_default_search_(false), |
293 dsp_change_origin_(DSP_CHANGE_OTHER), | 292 dsp_change_origin_(DSP_CHANGE_OTHER), |
294 default_search_manager_( | 293 default_search_manager_( |
295 GetPrefs(), DefaultSearchManager::ObserverCallback()) { | 294 new DefaultSearchManager(GetPrefs(), |
| 295 DefaultSearchManager::ObserverCallback())) { |
296 DCHECK(profile_); | 296 DCHECK(profile_); |
297 Init(NULL, 0); | 297 Init(NULL, 0); |
298 } | 298 } |
299 | 299 |
300 TemplateURLService::TemplateURLService(const Initializer* initializers, | 300 TemplateURLService::TemplateURLService(const Initializer* initializers, |
301 const int count) | 301 const int count) |
302 : provider_map_(new SearchHostToURLsMap), | 302 : provider_map_(new SearchHostToURLsMap), |
303 profile_(NULL), | 303 profile_(NULL), |
304 loaded_(false), | 304 loaded_(false), |
305 load_failed_(false), | 305 load_failed_(false), |
306 load_handle_(0), | 306 load_handle_(0), |
307 service_(NULL), | 307 service_(NULL), |
308 default_search_provider_(NULL), | 308 default_search_provider_(NULL), |
309 is_default_search_managed_(false), | 309 is_default_search_managed_(false), |
310 next_id_(kInvalidTemplateURLID + 1), | 310 next_id_(kInvalidTemplateURLID + 1), |
311 time_provider_(&base::Time::Now), | 311 time_provider_(&base::Time::Now), |
312 models_associated_(false), | 312 models_associated_(false), |
313 processing_syncer_changes_(false), | 313 processing_syncer_changes_(false), |
314 pending_synced_default_search_(false), | 314 pending_synced_default_search_(false), |
315 dsp_change_origin_(DSP_CHANGE_OTHER), | 315 dsp_change_origin_(DSP_CHANGE_OTHER) { |
316 default_search_manager_( | |
317 GetPrefs(), DefaultSearchManager::ObserverCallback()) { | |
318 Init(initializers, count); | 316 Init(initializers, count); |
319 } | 317 } |
320 | 318 |
321 TemplateURLService::~TemplateURLService() { | 319 TemplateURLService::~TemplateURLService() { |
322 // |service_| should be deleted during Shutdown(). | 320 // |service_| should be deleted during Shutdown(). |
323 DCHECK(!service_); | 321 DCHECK(!service_); |
324 STLDeleteElements(&template_urls_); | 322 STLDeleteElements(&template_urls_); |
325 } | 323 } |
326 | 324 |
327 // static | 325 // static |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 // be replaced. We do this to ensure that if the user assigns a different | 591 // be replaced. We do this to ensure that if the user assigns a different |
594 // keyword to a generated TemplateURL, we won't regenerate another keyword for | 592 // keyword to a generated TemplateURL, we won't regenerate another keyword for |
595 // the same host. | 593 // the same host. |
596 return !url.is_valid() || url.host().empty() || | 594 return !url.is_valid() || url.host().empty() || |
597 CanReplaceKeywordForHost(url.host(), template_url_to_replace); | 595 CanReplaceKeywordForHost(url.host(), template_url_to_replace); |
598 } | 596 } |
599 | 597 |
600 void TemplateURLService::FindMatchingKeywords( | 598 void TemplateURLService::FindMatchingKeywords( |
601 const base::string16& prefix, | 599 const base::string16& prefix, |
602 bool support_replacement_only, | 600 bool support_replacement_only, |
603 TemplateURLVector* matches) { | 601 TemplateURLVector* matches) const { |
604 // Sanity check args. | 602 // Sanity check args. |
605 if (prefix.empty()) | 603 if (prefix.empty()) |
606 return; | 604 return; |
607 DCHECK(matches != NULL); | 605 DCHECK(matches != NULL); |
608 DCHECK(matches->empty()); // The code for exact matches assumes this. | 606 DCHECK(matches->empty()); // The code for exact matches assumes this. |
609 | 607 |
610 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/det
ails/520043/error-converting-from-null-to-a-pointer-type-in-std-pair | 608 // Required for VS2010: http://connect.microsoft.com/VisualStudio/feedback/det
ails/520043/error-converting-from-null-to-a-pointer-type-in-std-pair |
611 TemplateURL* const kNullTemplateURL = NULL; | 609 TemplateURL* const kNullTemplateURL = NULL; |
612 | 610 |
613 // Find matching keyword range. Searches the element map for keywords | 611 // Find matching keyword range. Searches the element map for keywords |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 return !is_default_search_managed() && | 844 return !is_default_search_managed() && |
847 !IsExtensionControlledDefaultSearch() && | 845 !IsExtensionControlledDefaultSearch() && |
848 (url != GetDefaultSearchProvider()) && | 846 (url != GetDefaultSearchProvider()) && |
849 url->url_ref().SupportsReplacement() && | 847 url->url_ref().SupportsReplacement() && |
850 (url->GetType() == TemplateURL::NORMAL); | 848 (url->GetType() == TemplateURL::NORMAL); |
851 } | 849 } |
852 | 850 |
853 void TemplateURLService::SetUserSelectedDefaultSearchProvider( | 851 void TemplateURLService::SetUserSelectedDefaultSearchProvider( |
854 TemplateURL* url) { | 852 TemplateURL* url) { |
855 SetDefaultSearchProvider(url); | 853 SetDefaultSearchProvider(url); |
856 if (url) | 854 if (default_search_manager_) { |
857 default_search_manager_.SetUserSelectedDefaultSearchEngine(url->data()); | 855 if (url) |
858 else | 856 default_search_manager_->SetUserSelectedDefaultSearchEngine(url->data()); |
859 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); | 857 else |
| 858 default_search_manager_->ClearUserSelectedDefaultSearchEngine(); |
| 859 } |
860 } | 860 } |
861 | 861 |
862 TemplateURL* TemplateURLService::GetDefaultSearchProvider() { | 862 TemplateURL* TemplateURLService::GetDefaultSearchProvider() { |
863 if (loaded_ && !load_failed_) | 863 if (loaded_ && !load_failed_) |
864 return default_search_provider_; | 864 return default_search_provider_; |
865 // We're not loaded, rely on the default search provider stored in prefs. | 865 // We're not loaded, rely on the default search provider stored in prefs. |
866 return initial_default_search_provider_.get(); | 866 return initial_default_search_provider_.get(); |
867 } | 867 } |
868 | 868 |
869 bool TemplateURLService::IsSearchResultsPageFromDefaultSearchProvider( | 869 bool TemplateURLService::IsSearchResultsPageFromDefaultSearchProvider( |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 data.SetKeyword(updated_keyword); | 1204 data.SetKeyword(updated_keyword); |
1205 TemplateURL new_turl(existing_turl->profile(), data); | 1205 TemplateURL new_turl(existing_turl->profile(), data); |
1206 UIThreadSearchTermsData search_terms_data(existing_turl->profile()); | 1206 UIThreadSearchTermsData search_terms_data(existing_turl->profile()); |
1207 if (UpdateNoNotify(existing_turl, new_turl, search_terms_data)) | 1207 if (UpdateNoNotify(existing_turl, new_turl, search_terms_data)) |
1208 NotifyObservers(); | 1208 NotifyObservers(); |
1209 | 1209 |
1210 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(new_turl); | 1210 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(new_turl); |
1211 new_changes.push_back(syncer::SyncChange(FROM_HERE, | 1211 new_changes.push_back(syncer::SyncChange(FROM_HERE, |
1212 syncer::SyncChange::ACTION_ADD, | 1212 syncer::SyncChange::ACTION_ADD, |
1213 sync_data)); | 1213 sync_data)); |
1214 // Ignore the delete attempt. This means we never end up resetting the | 1214 // Ignore the delete attempt. This means we never end up reseting the |
1215 // default search provider due to an ACTION_DELETE from sync. | 1215 // default search provider due to an ACTION_DELETE from sync. |
1216 continue; | 1216 continue; |
1217 } | 1217 } |
1218 | 1218 |
1219 Remove(existing_turl); | 1219 Remove(existing_turl); |
1220 } else if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { | 1220 } else if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { |
1221 if (existing_turl) { | 1221 if (existing_turl) { |
1222 error = sync_error_factory_->CreateAndUploadError( | 1222 error = sync_error_factory_->CreateAndUploadError( |
1223 FROM_HERE, | 1223 FROM_HERE, |
1224 "ProcessSyncChanges failed on ChangeType ACTION_ADD"); | 1224 "ProcessSyncChanges failed on ChangeType ACTION_ADD"); |
(...skipping 1467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2692 // Don't log anything if the user has a NULL default search provider. | 2692 // Don't log anything if the user has a NULL default search provider. |
2693 if (default_search_provider_) { | 2693 if (default_search_provider_) { |
2694 UMA_HISTOGRAM_ENUMERATION("Search.DefaultSearchProviderType", | 2694 UMA_HISTOGRAM_ENUMERATION("Search.DefaultSearchProviderType", |
2695 TemplateURLPrepopulateData::GetEngineType(*default_search_provider_), | 2695 TemplateURLPrepopulateData::GetEngineType(*default_search_provider_), |
2696 SEARCH_ENGINE_MAX); | 2696 SEARCH_ENGINE_MAX); |
2697 } | 2697 } |
2698 } | 2698 } |
2699 } | 2699 } |
2700 | 2700 |
2701 TemplateURL* TemplateURLService::CreateTemplateURLForExtension( | 2701 TemplateURL* TemplateURLService::CreateTemplateURLForExtension( |
2702 const ExtensionKeyword& extension_keyword) { | 2702 const ExtensionKeyword& extension_keyword) const { |
2703 TemplateURLData data; | 2703 TemplateURLData data; |
2704 data.short_name = base::UTF8ToUTF16(extension_keyword.extension_name); | 2704 data.short_name = base::UTF8ToUTF16(extension_keyword.extension_name); |
2705 data.SetKeyword(base::UTF8ToUTF16(extension_keyword.extension_keyword)); | 2705 data.SetKeyword(base::UTF8ToUTF16(extension_keyword.extension_keyword)); |
2706 // This URL is not actually used for navigation. It holds the extension's | 2706 // This URL is not actually used for navigation. It holds the extension's |
2707 // ID, as well as forcing the TemplateURL to be treated as a search keyword. | 2707 // ID, as well as forcing the TemplateURL to be treated as a search keyword. |
2708 data.SetURL(std::string(extensions::kExtensionScheme) + "://" + | 2708 data.SetURL(std::string(extensions::kExtensionScheme) + "://" + |
2709 extension_keyword.extension_id + "/?q={searchTerms}"); | 2709 extension_keyword.extension_id + "/?q={searchTerms}"); |
2710 return new TemplateURL(profile_, data); | 2710 return new TemplateURL(profile_, data); |
2711 } | 2711 } |
2712 | 2712 |
2713 TemplateURL* TemplateURLService::FindTemplateURLForExtension( | 2713 TemplateURL* TemplateURLService::FindTemplateURLForExtension( |
2714 const std::string& extension_id, | 2714 const std::string& extension_id, |
2715 TemplateURL::Type type) { | 2715 TemplateURL::Type type) const { |
2716 DCHECK_NE(TemplateURL::NORMAL, type); | 2716 DCHECK_NE(TemplateURL::NORMAL, type); |
2717 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | 2717 for (TemplateURLVector::const_iterator i = template_urls_.begin(); |
2718 i != template_urls_.end(); ++i) { | 2718 i != template_urls_.end(); ++i) { |
2719 if ((*i)->GetType() == type && | 2719 if ((*i)->GetType() == type && |
2720 (*i)->GetExtensionId() == extension_id) | 2720 (*i)->GetExtensionId() == extension_id) |
2721 return *i; | 2721 return *i; |
2722 } | 2722 } |
2723 | 2723 |
2724 return NULL; | 2724 return NULL; |
2725 } | 2725 } |
(...skipping 30 matching lines...) Expand all Loading... |
2756 new_dse = *i; | 2756 new_dse = *i; |
2757 break; | 2757 break; |
2758 } | 2758 } |
2759 } | 2759 } |
2760 } | 2760 } |
2761 } | 2761 } |
2762 if (!new_dse) | 2762 if (!new_dse) |
2763 new_dse = FindNewDefaultSearchProvider(); | 2763 new_dse = FindNewDefaultSearchProvider(); |
2764 SetDefaultSearchProviderNoNotify(new_dse); | 2764 SetDefaultSearchProviderNoNotify(new_dse); |
2765 } | 2765 } |
OLD | NEW |