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

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: Merge with trunk + Peter's comments Created 7 years, 6 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 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 // We're not syncing at all. 664 // We're not syncing at all.
665 UMA_HISTOGRAM_ENUMERATION( 665 UMA_HISTOGRAM_ENUMERATION(
666 kFirstPotentialEngineHistogramName, 666 kFirstPotentialEngineHistogramName,
667 FIRST_POTENTIAL_CALLSITE_FIND_NEW_DSP_NOT_SYNCING, 667 FIRST_POTENTIAL_CALLSITE_FIND_NEW_DSP_NOT_SYNCING,
668 FIRST_POTENTIAL_CALLSITE_MAX); 668 FIRST_POTENTIAL_CALLSITE_MAX);
669 } 669 }
670 } 670 }
671 return FirstPotentialDefaultEngine(template_urls_); 671 return FirstPotentialDefaultEngine(template_urls_);
672 } 672 }
673 673
674 void TemplateURLService::ResetNonExtensionURLs() {
675 // Can't clean DB if it hasn't been loaded.
676 DCHECK(loaded());
677 ClearDefaultProviderFromPrefs();
678
679 TemplateURLVector entries_to_process;
680 for (TemplateURLVector::const_iterator i = template_urls_.begin();
681 i != template_urls_.end(); ++i) {
682 if (!(*i)->IsExtensionKeyword())
683 entries_to_process.push_back(*i);
684 }
685 // Clear default provider to be able to delete it.
686 default_search_provider_ = NULL;
687 // Remove non-extension keywords.
688 for (TemplateURLVector::const_iterator i = entries_to_process.begin();
689 i != entries_to_process.end(); ++i)
690 RemoveNoNotify(*i);
691
692 // Store the remaining engines in entries_to_process and merge them with
693 // prepopulated ones.
694 entries_to_process.clear();
695 entries_to_process.swap(template_urls_);
696 provider_map_.reset(new SearchHostToURLsMap);
697 UIThreadSearchTermsData search_terms_data(profile_);
698 provider_map_->Init(TemplateURLVector(), search_terms_data);
699
700 TemplateURL* default_search_provider = NULL;
701 // Force GetSearchProvidersUsingLoadedEngines() to include the prepopulated
702 // engines in the list by claiming we are currently on version 0, ensuring
703 // that the prepopulate data version will be newer.
704 int new_resource_keyword_version = 0;
705 GetSearchProvidersUsingLoadedEngines(service_.get(), profile_,
706 &entries_to_process,
707 &default_search_provider,
708 &new_resource_keyword_version,
709 &pre_sync_deletes_);
710 // Setup search engines and a default one.
711 AddTemplateURLsAndSetupDefaultEngine(&entries_to_process,
712 default_search_provider);
713
714 if (new_resource_keyword_version)
715 service_->SetBuiltinKeywordVersion(new_resource_keyword_version);
716
717 EnsureDefaultSearchProviderExists();
718 NotifyObservers();
719 }
720
674 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) { 721 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) {
675 model_observers_.AddObserver(observer); 722 model_observers_.AddObserver(observer);
676 } 723 }
677 724
678 void TemplateURLService::RemoveObserver(TemplateURLServiceObserver* observer) { 725 void TemplateURLService::RemoveObserver(TemplateURLServiceObserver* observer) {
679 model_observers_.RemoveObserver(observer); 726 model_observers_.RemoveObserver(observer);
680 } 727 }
681 728
682 void TemplateURLService::Load() { 729 void TemplateURLService::Load() {
683 if (loaded_ || load_handle_) 730 if (loaded_ || load_handle_)
(...skipping 23 matching lines...) Expand all
707 // loaded. 754 // loaded.
708 load_failed_ = true; 755 load_failed_ = true;
709 ChangeToLoadedState(); 756 ChangeToLoadedState();
710 NotifyLoaded(); 757 NotifyLoaded();
711 return; 758 return;
712 } 759 }
713 760
714 // initial_default_search_provider_ is only needed before we've finished 761 // initial_default_search_provider_ is only needed before we've finished
715 // loading. Now that we've loaded we can nuke it. 762 // loading. Now that we've loaded we can nuke it.
716 initial_default_search_provider_.reset(); 763 initial_default_search_provider_.reset();
717 is_default_search_managed_ = false;
718 764
719 TemplateURLVector template_urls; 765 TemplateURLVector template_urls;
720 TemplateURL* default_search_provider = NULL; 766 TemplateURL* default_search_provider = NULL;
721 int new_resource_keyword_version = 0; 767 int new_resource_keyword_version = 0;
722 GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_, 768 GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_,
723 &template_urls, &default_search_provider, &new_resource_keyword_version, 769 &template_urls, &default_search_provider, &new_resource_keyword_version,
724 &pre_sync_deletes_); 770 &pre_sync_deletes_);
725 771
726 bool database_specified_a_default = (default_search_provider != NULL); 772 AddTemplateURLsAndSetupDefaultEngine(&template_urls, default_search_provider);
727
728 // Check if default search provider is now managed.
729 scoped_ptr<TemplateURL> default_from_prefs;
730 LoadDefaultSearchProviderFromPrefs(&default_from_prefs,
731 &is_default_search_managed_);
732
733 // Remove entries that were created because of policy as they may have
734 // changed since the database was saved.
735 RemoveProvidersCreatedByPolicy(&template_urls,
736 &default_search_provider,
737 default_from_prefs.get());
738
739 PatchMissingSyncGUIDs(&template_urls);
740
741 if (is_default_search_managed_) {
742 SetTemplateURLs(template_urls);
743
744 if (TemplateURLsHaveSamePrefs(default_search_provider,
745 default_from_prefs.get())) {
746 // The value from the preferences was previously stored in the database.
747 // Reuse it.
748 } else {
749 // The value from the preferences takes over.
750 default_search_provider = NULL;
751 if (default_from_prefs.get()) {
752 TemplateURLData data(default_from_prefs->data());
753 data.created_by_policy = true;
754 data.id = kInvalidTemplateURLID;
755 default_search_provider = new TemplateURL(profile_, data);
756 if (!AddNoNotify(default_search_provider, true))
757 default_search_provider = NULL;
758 }
759 }
760 // Note that this saves the default search provider to prefs.
761 if (!default_search_provider ||
762 (!default_search_provider->IsExtensionKeyword() &&
763 default_search_provider->SupportsReplacement())) {
764 bool success = SetDefaultSearchProviderNoNotify(default_search_provider);
765 DCHECK(success);
766 }
767 } else {
768 // If we had a managed default, replace it with the synced default if
769 // applicable, or the first provider of the list.
770 TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider();
771 if (synced_default) {
772 default_search_provider = synced_default;
773 pending_synced_default_search_ = false;
774 } else if (database_specified_a_default &&
775 default_search_provider == NULL) {
776 UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName,
777 FIRST_POTENTIAL_CALLSITE_ON_LOAD, FIRST_POTENTIAL_CALLSITE_MAX);
778 default_search_provider = FirstPotentialDefaultEngine(template_urls);
779 }
780
781 // If the default search provider existed previously, then just
782 // 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.
784 if (default_search_provider &&
785 (default_search_provider->id() != kInvalidTemplateURLID)) {
786 default_search_provider_ = default_search_provider;
787 default_search_provider = NULL;
788 }
789 SetTemplateURLs(template_urls);
790
791 if (default_search_provider) {
792 // Note that this saves the default search provider to prefs.
793 SetDefaultSearchProvider(default_search_provider);
794 } else {
795 // Always save the default search provider to prefs. That way we don't
796 // have to worry about it being out of sync.
797 if (default_search_provider_)
798 SaveDefaultSearchProviderToPrefs(default_search_provider_);
799 }
800 }
801 773
802 // This initializes provider_map_ which should be done before 774 // This initializes provider_map_ which should be done before
803 // calling UpdateKeywordSearchTermsForURL. 775 // calling UpdateKeywordSearchTermsForURL.
804 ChangeToLoadedState(); 776 ChangeToLoadedState();
805 777
806 // Index any visits that occurred before we finished loading. 778 // Index any visits that occurred before we finished loading.
807 for (size_t i = 0; i < visits_to_add_.size(); ++i) 779 for (size_t i = 0; i < visits_to_add_.size(); ++i)
808 UpdateKeywordSearchTermsForURL(visits_to_add_[i]); 780 UpdateKeywordSearchTermsForURL(visits_to_add_[i]);
809 visits_to_add_.clear(); 781 visits_to_add_.clear();
810 782
811 if (new_resource_keyword_version) 783 if (new_resource_keyword_version)
812 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); 784 service_->SetBuiltinKeywordVersion(new_resource_keyword_version);
813 785
814 if (!is_default_search_managed_) { 786 EnsureDefaultSearchProviderExists();
815 bool has_default_search_provider = default_search_provider_ != NULL &&
816 default_search_provider_->SupportsReplacement();
817 UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName,
818 has_default_search_provider);
819 // Ensure that default search provider exists. See http://crbug.com/116952.
820 if (!has_default_search_provider) {
821 bool success =
822 SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider());
823 DCHECK(success);
824 }
825 // 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.
827 if (default_search_provider_) {
828 UMA_HISTOGRAM_ENUMERATION(
829 kDSPHistogramName,
830 default_search_provider_->prepopulate_id(),
831 TemplateURLPrepopulateData::kMaxPrepopulatedEngineID);
832 }
833 }
834 787
835 NotifyObservers(); 788 NotifyObservers();
836 NotifyLoaded(); 789 NotifyLoaded();
837 } 790 }
838 791
839 string16 TemplateURLService::GetKeywordShortName(const string16& keyword, 792 string16 TemplateURLService::GetKeywordShortName(const string16& keyword,
840 bool* is_extension_keyword) { 793 bool* is_extension_keyword) {
841 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword); 794 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword);
842 795
843 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLService 796 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLService
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 base::StringToInt(prepopulate_id, &value); 1667 base::StringToInt(prepopulate_id, &value);
1715 data.prepopulate_id = value; 1668 data.prepopulate_id = value;
1716 } 1669 }
1717 default_provider->reset(new TemplateURL(profile_, data)); 1670 default_provider->reset(new TemplateURL(profile_, data));
1718 DCHECK(!(*default_provider)->IsExtensionKeyword()); 1671 DCHECK(!(*default_provider)->IsExtensionKeyword());
1719 if (update_keyword) 1672 if (update_keyword)
1720 (*default_provider)->ResetKeywordIfNecessary(true); 1673 (*default_provider)->ResetKeywordIfNecessary(true);
1721 return true; 1674 return true;
1722 } 1675 }
1723 1676
1677 void TemplateURLService::ClearDefaultProviderFromPrefs() {
1678 // We overwrite user preferences. If the default search engine is managed,
1679 // there is no effect.
1680 SaveDefaultSearchProviderToPrefs(NULL);
1681 // Default value for kDefaultSearchProviderEnabled is true.
1682 PrefService* prefs = GetPrefs();
1683 if (prefs)
1684 prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, true);
1685 }
1686
1724 bool TemplateURLService::CanReplaceKeywordForHost( 1687 bool TemplateURLService::CanReplaceKeywordForHost(
1725 const std::string& host, 1688 const std::string& host,
1726 TemplateURL** to_replace) { 1689 TemplateURL** to_replace) {
1727 DCHECK(!to_replace || !*to_replace); 1690 DCHECK(!to_replace || !*to_replace);
1728 const TemplateURLSet* urls = provider_map_->GetURLsForHost(host); 1691 const TemplateURLSet* urls = provider_map_->GetURLsForHost(host);
1729 if (!urls) 1692 if (!urls)
1730 return true; 1693 return true;
1731 for (TemplateURLSet::const_iterator i(urls->begin()); i != urls->end(); ++i) { 1694 for (TemplateURLSet::const_iterator i(urls->begin()); i != urls->end(); ++i) {
1732 if (CanReplace(*i)) { 1695 if (CanReplace(*i)) {
1733 if (to_replace) 1696 if (to_replace)
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after
2490 // TODO(mpcomplete): If we allow editing extension keywords, then those 2453 // TODO(mpcomplete): If we allow editing extension keywords, then those
2491 // should be persisted to disk and synced. 2454 // should be persisted to disk and synced.
2492 if (template_url->sync_guid().empty() && 2455 if (template_url->sync_guid().empty() &&
2493 !template_url->IsExtensionKeyword()) { 2456 !template_url->IsExtensionKeyword()) {
2494 template_url->data_.sync_guid = base::GenerateGUID(); 2457 template_url->data_.sync_guid = base::GenerateGUID();
2495 if (service_.get()) 2458 if (service_.get())
2496 service_->UpdateKeyword(template_url->data()); 2459 service_->UpdateKeyword(template_url->data());
2497 } 2460 }
2498 } 2461 }
2499 } 2462 }
2463
2464 void TemplateURLService::AddTemplateURLsAndSetupDefaultEngine(
2465 TemplateURLVector* template_urls,
2466 TemplateURL* default_search_provider) {
2467 DCHECK(template_urls);
2468 is_default_search_managed_ = false;
2469 bool database_specified_a_default = (default_search_provider != NULL);
2470
2471 // Check if default search provider is now managed.
2472 scoped_ptr<TemplateURL> default_from_prefs;
2473 LoadDefaultSearchProviderFromPrefs(&default_from_prefs,
2474 &is_default_search_managed_);
2475
2476 // Remove entries that were created because of policy as they may have
2477 // changed since the database was saved.
2478 RemoveProvidersCreatedByPolicy(template_urls,
2479 &default_search_provider,
2480 default_from_prefs.get());
2481
2482 PatchMissingSyncGUIDs(template_urls);
2483
2484 if (is_default_search_managed_) {
2485 SetTemplateURLs(*template_urls);
2486
2487 if (TemplateURLsHaveSamePrefs(default_search_provider,
2488 default_from_prefs.get())) {
2489 // The value from the preferences was previously stored in the database.
2490 // Reuse it.
2491 } else {
2492 // The value from the preferences takes over.
2493 default_search_provider = NULL;
2494 if (default_from_prefs.get()) {
2495 TemplateURLData data(default_from_prefs->data());
2496 data.created_by_policy = true;
2497 data.id = kInvalidTemplateURLID;
2498 default_search_provider = new TemplateURL(profile_, data);
2499 if (!AddNoNotify(default_search_provider, true))
2500 default_search_provider = NULL;
2501 }
2502 }
2503 // Note that this saves the default search provider to prefs.
2504 if (!default_search_provider ||
2505 (!default_search_provider->IsExtensionKeyword() &&
2506 default_search_provider->SupportsReplacement())) {
2507 bool success = SetDefaultSearchProviderNoNotify(default_search_provider);
2508 DCHECK(success);
2509 }
2510 } else {
2511 // If we had a managed default, replace it with the synced default if
2512 // applicable, or the first provider of the list.
2513 TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider();
2514 if (synced_default) {
2515 default_search_provider = synced_default;
2516 pending_synced_default_search_ = false;
2517 } else if (database_specified_a_default &&
2518 default_search_provider == NULL) {
2519 UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName,
2520 FIRST_POTENTIAL_CALLSITE_ON_LOAD,
2521 FIRST_POTENTIAL_CALLSITE_MAX);
2522 default_search_provider = FirstPotentialDefaultEngine(*template_urls);
2523 }
2524
2525 // If the default search provider existed previously, then just
2526 // set the member variable. Otherwise, we'll set it using the method
2527 // to ensure that it is saved properly after its id is set.
2528 if (default_search_provider &&
2529 (default_search_provider->id() != kInvalidTemplateURLID)) {
2530 default_search_provider_ = default_search_provider;
2531 default_search_provider = NULL;
2532 }
2533 SetTemplateURLs(*template_urls);
2534
2535 if (default_search_provider) {
2536 // Note that this saves the default search provider to prefs.
2537 SetDefaultSearchProvider(default_search_provider);
2538 } else {
2539 // Always save the default search provider to prefs. That way we don't
2540 // have to worry about it being out of sync.
2541 if (default_search_provider_)
2542 SaveDefaultSearchProviderToPrefs(default_search_provider_);
2543 }
2544 }
2545 }
2546
2547 void TemplateURLService::EnsureDefaultSearchProviderExists() {
2548 if (!is_default_search_managed_) {
2549 bool has_default_search_provider = default_search_provider_ &&
2550 default_search_provider_->SupportsReplacement();
2551 UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName,
2552 has_default_search_provider);
2553 // Ensure that default search provider exists. See http://crbug.com/116952.
2554 if (!has_default_search_provider) {
2555 bool success =
2556 SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider());
2557 DCHECK(success);
2558 }
2559 // Don't log anything if the user has a NULL default search provider. A
2560 // logged value of 0 indicates a custom default search provider.
2561 if (default_search_provider_) {
2562 UMA_HISTOGRAM_ENUMERATION(
2563 kDSPHistogramName,
2564 default_search_provider_->prepopulate_id(),
2565 TemplateURLPrepopulateData::kMaxPrepopulatedEngineID);
2566 }
2567 }
2568 }
OLDNEW
« no previous file with comments | « chrome/browser/search_engines/template_url_service.h ('k') | chrome/browser/search_engines/template_url_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698