Chromium Code Reviews| 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 "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/environment.h" | 10 #include "base/environment.h" |
| (...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 707 // loaded. | 707 // loaded. |
| 708 load_failed_ = true; | 708 load_failed_ = true; |
| 709 ChangeToLoadedState(); | 709 ChangeToLoadedState(); |
| 710 NotifyLoaded(); | 710 NotifyLoaded(); |
| 711 return; | 711 return; |
| 712 } | 712 } |
| 713 | 713 |
| 714 // initial_default_search_provider_ is only needed before we've finished | 714 // initial_default_search_provider_ is only needed before we've finished |
| 715 // loading. Now that we've loaded we can nuke it. | 715 // loading. Now that we've loaded we can nuke it. |
| 716 initial_default_search_provider_.reset(); | 716 initial_default_search_provider_.reset(); |
| 717 is_default_search_managed_ = false; | |
| 718 | 717 |
| 719 TemplateURLVector template_urls; | 718 TemplateURLVector template_urls; |
| 720 TemplateURL* default_search_provider = NULL; | 719 TemplateURL* default_search_provider = NULL; |
| 721 int new_resource_keyword_version = 0; | 720 int new_resource_keyword_version = 0; |
| 722 GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_, | 721 GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_, |
| 723 &template_urls, &default_search_provider, &new_resource_keyword_version, | 722 &template_urls, &default_search_provider, &new_resource_keyword_version, |
| 724 &pre_sync_deletes_); | 723 &pre_sync_deletes_); |
| 725 | 724 |
| 725 AddTemplateURLsAndSetupDefaultEngine(&template_urls, default_search_provider); | |
| 726 | |
| 727 // This initializes provider_map_ which should be done before | |
| 728 // calling UpdateKeywordSearchTermsForURL. | |
| 729 ChangeToLoadedState(); | |
| 730 | |
| 731 // Index any visits that occurred before we finished loading. | |
| 732 for (size_t i = 0; i < visits_to_add_.size(); ++i) | |
| 733 UpdateKeywordSearchTermsForURL(visits_to_add_[i]); | |
| 734 visits_to_add_.clear(); | |
| 735 | |
| 736 if (new_resource_keyword_version) | |
| 737 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); | |
| 738 | |
| 739 EnsureDefaultSearchProviderExists(); | |
| 740 | |
| 741 NotifyObservers(); | |
| 742 NotifyLoaded(); | |
| 743 } | |
| 744 | |
| 745 void TemplateURLService::AddTemplateURLsAndSetupDefaultEngine( | |
| 746 TemplateURLVector* template_urls, | |
| 747 TemplateURL* default_search_provider) { | |
| 748 DCHECK(template_urls); | |
| 749 is_default_search_managed_ = false; | |
| 726 bool database_specified_a_default = (default_search_provider != NULL); | 750 bool database_specified_a_default = (default_search_provider != NULL); |
| 727 | 751 |
| 728 // Check if default search provider is now managed. | 752 // Check if default search provider is now managed. |
| 729 scoped_ptr<TemplateURL> default_from_prefs; | 753 scoped_ptr<TemplateURL> default_from_prefs; |
| 730 LoadDefaultSearchProviderFromPrefs(&default_from_prefs, | 754 LoadDefaultSearchProviderFromPrefs(&default_from_prefs, |
| 731 &is_default_search_managed_); | 755 &is_default_search_managed_); |
| 732 | 756 |
| 733 // Remove entries that were created because of policy as they may have | 757 // Remove entries that were created because of policy as they may have |
| 734 // changed since the database was saved. | 758 // changed since the database was saved. |
| 735 RemoveProvidersCreatedByPolicy(&template_urls, | 759 RemoveProvidersCreatedByPolicy(template_urls, |
| 736 &default_search_provider, | 760 &default_search_provider, |
| 737 default_from_prefs.get()); | 761 default_from_prefs.get()); |
| 738 | 762 |
| 739 PatchMissingSyncGUIDs(&template_urls); | 763 PatchMissingSyncGUIDs(template_urls); |
| 740 | 764 |
| 741 if (is_default_search_managed_) { | 765 if (is_default_search_managed_) { |
| 742 SetTemplateURLs(template_urls); | 766 SetTemplateURLs(*template_urls); |
| 743 | 767 |
| 744 if (TemplateURLsHaveSamePrefs(default_search_provider, | 768 if (TemplateURLsHaveSamePrefs(default_search_provider, |
| 745 default_from_prefs.get())) { | 769 default_from_prefs.get())) { |
| 746 // The value from the preferences was previously stored in the database. | 770 // The value from the preferences was previously stored in the database. |
| 747 // Reuse it. | 771 // Reuse it. |
| 748 } else { | 772 } else { |
| 749 // The value from the preferences takes over. | 773 // The value from the preferences takes over. |
| 750 default_search_provider = NULL; | 774 default_search_provider = NULL; |
| 751 if (default_from_prefs.get()) { | 775 if (default_from_prefs.get()) { |
| 752 TemplateURLData data(default_from_prefs->data()); | 776 TemplateURLData data(default_from_prefs->data()); |
| 753 data.created_by_policy = true; | 777 data.created_by_policy = true; |
| 754 data.id = kInvalidTemplateURLID; | 778 data.id = kInvalidTemplateURLID; |
| 755 default_search_provider = new TemplateURL(profile_, data); | 779 default_search_provider = new TemplateURL(profile_, data); |
| 756 if (!AddNoNotify(default_search_provider, true)) | 780 if (!AddNoNotify(default_search_provider, true)) |
| 757 default_search_provider = NULL; | 781 default_search_provider = NULL; |
| 758 } | 782 } |
| 759 } | 783 } |
| 760 // Note that this saves the default search provider to prefs. | 784 // Note that this saves the default search provider to prefs. |
| 761 if (!default_search_provider || | 785 if (!default_search_provider || |
| 762 (!default_search_provider->IsExtensionKeyword() && | 786 (!default_search_provider->IsExtensionKeyword() && |
| 763 default_search_provider->SupportsReplacement())) { | 787 default_search_provider->SupportsReplacement())) { |
| 764 bool success = SetDefaultSearchProviderNoNotify(default_search_provider); | 788 bool success = SetDefaultSearchProviderNoNotify(default_search_provider); |
| 765 DCHECK(success); | 789 DCHECK(success); |
| 766 } | 790 } |
| 767 } else { | 791 } else { |
| 768 // If we had a managed default, replace it with the synced default if | 792 // If we had a managed default, replace it with the synced default if |
| 769 // applicable, or the first provider of the list. | 793 // applicable, or the first provider of the list. |
| 770 TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); | 794 TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); |
| 771 if (synced_default) { | 795 if (synced_default) { |
| 772 default_search_provider = synced_default; | 796 default_search_provider = synced_default; |
| 773 pending_synced_default_search_ = false; | 797 pending_synced_default_search_ = false; |
| 774 } else if (database_specified_a_default && | 798 } else if (database_specified_a_default && |
| 775 default_search_provider == NULL) { | 799 default_search_provider == NULL) { |
| 776 UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName, | 800 UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName, |
| 777 FIRST_POTENTIAL_CALLSITE_ON_LOAD, FIRST_POTENTIAL_CALLSITE_MAX); | 801 FIRST_POTENTIAL_CALLSITE_ON_LOAD, |
| 778 default_search_provider = FirstPotentialDefaultEngine(template_urls); | 802 FIRST_POTENTIAL_CALLSITE_MAX); |
| 803 default_search_provider = FirstPotentialDefaultEngine(*template_urls); | |
| 779 } | 804 } |
| 780 | 805 |
| 781 // If the default search provider existed previously, then just | 806 // If the default search provider existed previously, then just |
| 782 // set the member variable. Otherwise, we'll set it using the method | 807 // set the member variable. Otherwise, we'll set it using the method |
| 783 // to ensure that it is saved properly after its id is set. | 808 // to ensure that it is saved properly after its id is set. |
| 784 if (default_search_provider && | 809 if (default_search_provider && |
| 785 (default_search_provider->id() != kInvalidTemplateURLID)) { | 810 (default_search_provider->id() != kInvalidTemplateURLID)) { |
| 786 default_search_provider_ = default_search_provider; | 811 default_search_provider_ = default_search_provider; |
| 787 default_search_provider = NULL; | 812 default_search_provider = NULL; |
| 788 } | 813 } |
| 789 SetTemplateURLs(template_urls); | 814 SetTemplateURLs(*template_urls); |
| 790 | 815 |
| 791 if (default_search_provider) { | 816 if (default_search_provider) { |
| 792 // Note that this saves the default search provider to prefs. | 817 // Note that this saves the default search provider to prefs. |
| 793 SetDefaultSearchProvider(default_search_provider); | 818 SetDefaultSearchProvider(default_search_provider); |
| 794 } else { | 819 } else { |
| 795 // Always save the default search provider to prefs. That way we don't | 820 // Always save the default search provider to prefs. That way we don't |
| 796 // have to worry about it being out of sync. | 821 // have to worry about it being out of sync. |
| 797 if (default_search_provider_) | 822 if (default_search_provider_) |
| 798 SaveDefaultSearchProviderToPrefs(default_search_provider_); | 823 SaveDefaultSearchProviderToPrefs(default_search_provider_); |
| 799 } | 824 } |
| 800 } | 825 } |
| 826 } | |
| 801 | 827 |
| 802 // This initializes provider_map_ which should be done before | 828 void TemplateURLService::EnsureDefaultSearchProviderExists() { |
| 803 // calling UpdateKeywordSearchTermsForURL. | |
| 804 ChangeToLoadedState(); | |
| 805 | |
| 806 // Index any visits that occurred before we finished loading. | |
| 807 for (size_t i = 0; i < visits_to_add_.size(); ++i) | |
| 808 UpdateKeywordSearchTermsForURL(visits_to_add_[i]); | |
| 809 visits_to_add_.clear(); | |
| 810 | |
| 811 if (new_resource_keyword_version) | |
| 812 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); | |
| 813 | |
| 814 if (!is_default_search_managed_) { | 829 if (!is_default_search_managed_) { |
| 815 bool has_default_search_provider = default_search_provider_ != NULL && | 830 bool has_default_search_provider = default_search_provider_ && |
| 816 default_search_provider_->SupportsReplacement(); | 831 default_search_provider_->SupportsReplacement(); |
| 817 UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName, | 832 UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName, |
| 818 has_default_search_provider); | 833 has_default_search_provider); |
| 819 // Ensure that default search provider exists. See http://crbug.com/116952. | 834 // Ensure that default search provider exists. See http://crbug.com/116952. |
| 820 if (!has_default_search_provider) { | 835 if (!has_default_search_provider) { |
| 821 bool success = | 836 bool success = |
| 822 SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider()); | 837 SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider()); |
| 823 DCHECK(success); | 838 DCHECK(success); |
| 824 } | 839 } |
| 825 // Don't log anything if the user has a NULL default search provider. A | 840 // Don't log anything if the user has a NULL default search provider. A |
| 826 // logged value of 0 indicates a custom default search provider. | 841 // logged value of 0 indicates a custom default search provider. |
| 827 if (default_search_provider_) { | 842 if (default_search_provider_) { |
| 828 UMA_HISTOGRAM_ENUMERATION( | 843 UMA_HISTOGRAM_ENUMERATION( |
| 829 kDSPHistogramName, | 844 kDSPHistogramName, |
| 830 default_search_provider_->prepopulate_id(), | 845 default_search_provider_->prepopulate_id(), |
| 831 TemplateURLPrepopulateData::kMaxPrepopulatedEngineID); | 846 TemplateURLPrepopulateData::kMaxPrepopulatedEngineID); |
| 832 } | 847 } |
| 833 } | 848 } |
| 834 | |
| 835 NotifyObservers(); | |
| 836 NotifyLoaded(); | |
| 837 } | 849 } |
| 838 | 850 |
| 839 string16 TemplateURLService::GetKeywordShortName(const string16& keyword, | 851 string16 TemplateURLService::GetKeywordShortName(const string16& keyword, |
| 840 bool* is_extension_keyword) { | 852 bool* is_extension_keyword) { |
| 841 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword); | 853 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword); |
| 842 | 854 |
| 843 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLService | 855 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLService |
| 844 // to track changes to the model, this should become a DCHECK. | 856 // to track changes to the model, this should become a DCHECK. |
| 845 if (template_url) { | 857 if (template_url) { |
| 846 *is_extension_keyword = template_url->IsExtensionKeyword(); | 858 *is_extension_keyword = template_url->IsExtensionKeyword(); |
| (...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1579 loaded_ = true; | 1591 loaded_ = true; |
| 1580 } | 1592 } |
| 1581 | 1593 |
| 1582 void TemplateURLService::NotifyLoaded() { | 1594 void TemplateURLService::NotifyLoaded() { |
| 1583 content::NotificationService::current()->Notify( | 1595 content::NotificationService::current()->Notify( |
| 1584 chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, | 1596 chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, |
| 1585 content::Source<TemplateURLService>(this), | 1597 content::Source<TemplateURLService>(this), |
| 1586 content::NotificationService::NoDetails()); | 1598 content::NotificationService::NoDetails()); |
| 1587 } | 1599 } |
| 1588 | 1600 |
| 1601 void TemplateURLService::ClearDefaultProviderFromPrefs() { | |
| 1602 // We overwrite user preferences. If the default search engine is managed, | |
| 1603 // there is no effect. | |
| 1604 SaveDefaultSearchProviderToPrefs(NULL); | |
| 1605 // Default value for kDefaultSearchProviderEnabled is true. | |
| 1606 if (PrefService* prefs = GetPrefs()) | |
| 1607 prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, true); | |
| 1608 } | |
| 1609 | |
| 1589 void TemplateURLService::SaveDefaultSearchProviderToPrefs( | 1610 void TemplateURLService::SaveDefaultSearchProviderToPrefs( |
| 1590 const TemplateURL* t_url) { | 1611 const TemplateURL* t_url) { |
| 1591 PrefService* prefs = GetPrefs(); | 1612 PrefService* prefs = GetPrefs(); |
| 1592 if (!prefs) | 1613 if (!prefs) |
| 1593 return; | 1614 return; |
| 1594 | 1615 |
| 1595 bool enabled = false; | 1616 bool enabled = false; |
| 1596 std::string search_url; | 1617 std::string search_url; |
| 1597 std::string suggest_url; | 1618 std::string suggest_url; |
| 1598 std::string instant_url; | 1619 std::string instant_url; |
| (...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2490 // TODO(mpcomplete): If we allow editing extension keywords, then those | 2511 // TODO(mpcomplete): If we allow editing extension keywords, then those |
| 2491 // should be persisted to disk and synced. | 2512 // should be persisted to disk and synced. |
| 2492 if (template_url->sync_guid().empty() && | 2513 if (template_url->sync_guid().empty() && |
| 2493 !template_url->IsExtensionKeyword()) { | 2514 !template_url->IsExtensionKeyword()) { |
| 2494 template_url->data_.sync_guid = base::GenerateGUID(); | 2515 template_url->data_.sync_guid = base::GenerateGUID(); |
| 2495 if (service_.get()) | 2516 if (service_.get()) |
| 2496 service_->UpdateKeyword(template_url->data()); | 2517 service_->UpdateKeyword(template_url->data()); |
| 2497 } | 2518 } |
| 2498 } | 2519 } |
| 2499 } | 2520 } |
| 2521 | |
| 2522 bool TemplateURLService::ResetNonExtensionURLs() { | |
| 2523 // Can't clean DB if it hasn't been loaded. | |
| 2524 DCHECK(loaded()); | |
| 2525 TemplateURLVector entries_to_process; | |
| 2526 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | |
| 2527 i != template_urls_.end(); ++i) { | |
|
battre
2013/05/22 14:03:37
nit: +1 space
vasilii
2013/05/22 18:54:08
Done.
| |
| 2528 if (!(**i).IsExtensionKeyword()) | |
| 2529 entries_to_process.push_back(*i); | |
| 2530 } | |
| 2531 // Clear default provider to be able to delete it. | |
| 2532 default_search_provider_ = NULL; | |
| 2533 // Remove non-extension keywords | |
| 2534 for (TemplateURLVector::const_iterator i = entries_to_process.begin(); | |
| 2535 i != entries_to_process.end(); ++i) { | |
|
battre
2013/05/22 14:03:37
nit: +1 space
vasilii
2013/05/22 18:54:08
Done.
| |
| 2536 RemoveNoNotify(*i); | |
| 2537 } | |
| 2538 // Store the remaining engines in entries_to_process and merge them with | |
| 2539 // prepopulated ones. | |
| 2540 entries_to_process.clear(); | |
| 2541 entries_to_process.swap(template_urls_); | |
| 2542 provider_map_.reset(new SearchHostToURLsMap); | |
| 2543 UIThreadSearchTermsData search_terms_data(profile_); | |
| 2544 provider_map_->Init(TemplateURLVector(), search_terms_data); | |
| 2545 TemplateURL* default_search_provider = NULL; | |
| 2546 // This will force to merge prepopulated engines. | |
| 2547 int new_resource_keyword_version = 0; | |
| 2548 GetSearchProvidersUsingLoadedEngines(service_.get(), profile_, | |
| 2549 &entries_to_process, | |
| 2550 &default_search_provider, | |
| 2551 &new_resource_keyword_version, | |
| 2552 &pre_sync_deletes_); | |
| 2553 // Setup search engines and a default one. | |
| 2554 AddTemplateURLsAndSetupDefaultEngine(&entries_to_process, | |
| 2555 default_search_provider); | |
| 2556 if (new_resource_keyword_version) | |
| 2557 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); | |
| 2558 // Make sure the default search engine != NULL; | |
| 2559 EnsureDefaultSearchProviderExists(); | |
| 2560 NotifyObservers(); | |
| 2561 return true; | |
| 2562 } | |
| OLD | NEW |