Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(651)

Side by Side Diff: chrome/browser/search_engines/template_url_service.cc

Issue 15572002: Implemented 'Reset Search engines' feature. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Android compilation error Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698