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

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: Reset Google search URL together with search engines 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 // Prepopulated engines version isn't 0. Thus they will be merged in for sure.
Peter Kasting 2013/05/29 04:04:41 Nit: Ah, now I see what you're trying to say. How
vasilii 2013/05/29 08:30:18 Done.
702 int new_resource_keyword_version = 0;
703 GetSearchProvidersUsingLoadedEngines(service_.get(), profile_,
704 &entries_to_process,
705 &default_search_provider,
706 &new_resource_keyword_version,
707 &pre_sync_deletes_);
708 // Setup search engines and a default one.
709 AddTemplateURLsAndSetupDefaultEngine(&entries_to_process,
710 default_search_provider);
711
712 if (new_resource_keyword_version)
713 service_->SetBuiltinKeywordVersion(new_resource_keyword_version);
714
715 EnsureDefaultSearchProviderExists();
716 NotifyObservers();
717 }
718
674 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) { 719 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) {
675 model_observers_.AddObserver(observer); 720 model_observers_.AddObserver(observer);
676 } 721 }
677 722
678 void TemplateURLService::RemoveObserver(TemplateURLServiceObserver* observer) { 723 void TemplateURLService::RemoveObserver(TemplateURLServiceObserver* observer) {
679 model_observers_.RemoveObserver(observer); 724 model_observers_.RemoveObserver(observer);
680 } 725 }
681 726
682 void TemplateURLService::Load() { 727 void TemplateURLService::Load() {
683 if (loaded_ || load_handle_) 728 if (loaded_ || load_handle_)
(...skipping 23 matching lines...) Expand all
707 // loaded. 752 // loaded.
708 load_failed_ = true; 753 load_failed_ = true;
709 ChangeToLoadedState(); 754 ChangeToLoadedState();
710 NotifyLoaded(); 755 NotifyLoaded();
711 return; 756 return;
712 } 757 }
713 758
714 // initial_default_search_provider_ is only needed before we've finished 759 // initial_default_search_provider_ is only needed before we've finished
715 // loading. Now that we've loaded we can nuke it. 760 // loading. Now that we've loaded we can nuke it.
716 initial_default_search_provider_.reset(); 761 initial_default_search_provider_.reset();
717 is_default_search_managed_ = false;
718 762
719 TemplateURLVector template_urls; 763 TemplateURLVector template_urls;
720 TemplateURL* default_search_provider = NULL; 764 TemplateURL* default_search_provider = NULL;
721 int new_resource_keyword_version = 0; 765 int new_resource_keyword_version = 0;
722 GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_, 766 GetSearchProvidersUsingKeywordResult(*result, service_.get(), profile_,
723 &template_urls, &default_search_provider, &new_resource_keyword_version, 767 &template_urls, &default_search_provider, &new_resource_keyword_version,
724 &pre_sync_deletes_); 768 &pre_sync_deletes_);
725 769
726 bool database_specified_a_default = (default_search_provider != NULL); 770 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 771
802 // This initializes provider_map_ which should be done before 772 // This initializes provider_map_ which should be done before
803 // calling UpdateKeywordSearchTermsForURL. 773 // calling UpdateKeywordSearchTermsForURL.
804 ChangeToLoadedState(); 774 ChangeToLoadedState();
805 775
806 // Index any visits that occurred before we finished loading. 776 // Index any visits that occurred before we finished loading.
807 for (size_t i = 0; i < visits_to_add_.size(); ++i) 777 for (size_t i = 0; i < visits_to_add_.size(); ++i)
808 UpdateKeywordSearchTermsForURL(visits_to_add_[i]); 778 UpdateKeywordSearchTermsForURL(visits_to_add_[i]);
809 visits_to_add_.clear(); 779 visits_to_add_.clear();
810 780
811 if (new_resource_keyword_version) 781 if (new_resource_keyword_version)
812 service_->SetBuiltinKeywordVersion(new_resource_keyword_version); 782 service_->SetBuiltinKeywordVersion(new_resource_keyword_version);
813 783
814 if (!is_default_search_managed_) { 784 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 785
835 NotifyObservers(); 786 NotifyObservers();
836 NotifyLoaded(); 787 NotifyLoaded();
837 } 788 }
838 789
839 string16 TemplateURLService::GetKeywordShortName(const string16& keyword, 790 string16 TemplateURLService::GetKeywordShortName(const string16& keyword,
840 bool* is_extension_keyword) { 791 bool* is_extension_keyword) {
841 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword); 792 const TemplateURL* template_url = GetTemplateURLForKeyword(keyword);
842 793
843 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLService 794 // 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); 1665 base::StringToInt(prepopulate_id, &value);
1715 data.prepopulate_id = value; 1666 data.prepopulate_id = value;
1716 } 1667 }
1717 default_provider->reset(new TemplateURL(profile_, data)); 1668 default_provider->reset(new TemplateURL(profile_, data));
1718 DCHECK(!(*default_provider)->IsExtensionKeyword()); 1669 DCHECK(!(*default_provider)->IsExtensionKeyword());
1719 if (update_keyword) 1670 if (update_keyword)
1720 (*default_provider)->ResetKeywordIfNecessary(true); 1671 (*default_provider)->ResetKeywordIfNecessary(true);
1721 return true; 1672 return true;
1722 } 1673 }
1723 1674
1675 void TemplateURLService::ClearDefaultProviderFromPrefs() {
1676 // We overwrite user preferences. If the default search engine is managed,
1677 // there is no effect.
1678 SaveDefaultSearchProviderToPrefs(NULL);
1679 // Default value for kDefaultSearchProviderEnabled is true.
1680 PrefService* prefs = GetPrefs();
1681 if (prefs)
1682 prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, true);
1683 }
1684
1724 bool TemplateURLService::CanReplaceKeywordForHost( 1685 bool TemplateURLService::CanReplaceKeywordForHost(
1725 const std::string& host, 1686 const std::string& host,
1726 TemplateURL** to_replace) { 1687 TemplateURL** to_replace) {
1727 DCHECK(!to_replace || !*to_replace); 1688 DCHECK(!to_replace || !*to_replace);
1728 const TemplateURLSet* urls = provider_map_->GetURLsForHost(host); 1689 const TemplateURLSet* urls = provider_map_->GetURLsForHost(host);
1729 if (!urls) 1690 if (!urls)
1730 return true; 1691 return true;
1731 for (TemplateURLSet::const_iterator i(urls->begin()); i != urls->end(); ++i) { 1692 for (TemplateURLSet::const_iterator i(urls->begin()); i != urls->end(); ++i) {
1732 if (CanReplace(*i)) { 1693 if (CanReplace(*i)) {
1733 if (to_replace) 1694 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 2451 // TODO(mpcomplete): If we allow editing extension keywords, then those
2491 // should be persisted to disk and synced. 2452 // should be persisted to disk and synced.
2492 if (template_url->sync_guid().empty() && 2453 if (template_url->sync_guid().empty() &&
2493 !template_url->IsExtensionKeyword()) { 2454 !template_url->IsExtensionKeyword()) {
2494 template_url->data_.sync_guid = base::GenerateGUID(); 2455 template_url->data_.sync_guid = base::GenerateGUID();
2495 if (service_.get()) 2456 if (service_.get())
2496 service_->UpdateKeyword(template_url->data()); 2457 service_->UpdateKeyword(template_url->data());
2497 } 2458 }
2498 } 2459 }
2499 } 2460 }
2461
2462 void TemplateURLService::AddTemplateURLsAndSetupDefaultEngine(
2463 TemplateURLVector* template_urls,
2464 TemplateURL* default_search_provider) {
2465 DCHECK(template_urls);
2466 is_default_search_managed_ = false;
2467 bool database_specified_a_default = (default_search_provider != NULL);
2468
2469 // Check if default search provider is now managed.
2470 scoped_ptr<TemplateURL> default_from_prefs;
2471 LoadDefaultSearchProviderFromPrefs(&default_from_prefs,
2472 &is_default_search_managed_);
2473
2474 // Remove entries that were created because of policy as they may have
2475 // changed since the database was saved.
2476 RemoveProvidersCreatedByPolicy(template_urls,
2477 &default_search_provider,
2478 default_from_prefs.get());
2479
2480 PatchMissingSyncGUIDs(template_urls);
2481
2482 if (is_default_search_managed_) {
2483 SetTemplateURLs(*template_urls);
2484
2485 if (TemplateURLsHaveSamePrefs(default_search_provider,
2486 default_from_prefs.get())) {
2487 // The value from the preferences was previously stored in the database.
2488 // Reuse it.
2489 } else {
2490 // The value from the preferences takes over.
2491 default_search_provider = NULL;
2492 if (default_from_prefs.get()) {
2493 TemplateURLData data(default_from_prefs->data());
2494 data.created_by_policy = true;
2495 data.id = kInvalidTemplateURLID;
2496 default_search_provider = new TemplateURL(profile_, data);
2497 if (!AddNoNotify(default_search_provider, true))
2498 default_search_provider = NULL;
2499 }
2500 }
2501 // Note that this saves the default search provider to prefs.
2502 if (!default_search_provider ||
2503 (!default_search_provider->IsExtensionKeyword() &&
2504 default_search_provider->SupportsReplacement())) {
2505 bool success = SetDefaultSearchProviderNoNotify(default_search_provider);
2506 DCHECK(success);
2507 }
2508 } else {
2509 // If we had a managed default, replace it with the synced default if
2510 // applicable, or the first provider of the list.
2511 TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider();
2512 if (synced_default) {
2513 default_search_provider = synced_default;
2514 pending_synced_default_search_ = false;
2515 } else if (database_specified_a_default &&
2516 default_search_provider == NULL) {
2517 UMA_HISTOGRAM_ENUMERATION(kFirstPotentialEngineHistogramName,
2518 FIRST_POTENTIAL_CALLSITE_ON_LOAD,
2519 FIRST_POTENTIAL_CALLSITE_MAX);
2520 default_search_provider = FirstPotentialDefaultEngine(*template_urls);
2521 }
2522
2523 // If the default search provider existed previously, then just
2524 // set the member variable. Otherwise, we'll set it using the method
2525 // to ensure that it is saved properly after its id is set.
2526 if (default_search_provider &&
2527 (default_search_provider->id() != kInvalidTemplateURLID)) {
2528 default_search_provider_ = default_search_provider;
2529 default_search_provider = NULL;
2530 }
2531 SetTemplateURLs(*template_urls);
2532
2533 if (default_search_provider) {
2534 // Note that this saves the default search provider to prefs.
2535 SetDefaultSearchProvider(default_search_provider);
2536 } else {
2537 // Always save the default search provider to prefs. That way we don't
2538 // have to worry about it being out of sync.
2539 if (default_search_provider_)
2540 SaveDefaultSearchProviderToPrefs(default_search_provider_);
2541 }
2542 }
2543 }
2544
2545 void TemplateURLService::EnsureDefaultSearchProviderExists() {
2546 if (!is_default_search_managed_) {
2547 bool has_default_search_provider = default_search_provider_ &&
2548 default_search_provider_->SupportsReplacement();
2549 UMA_HISTOGRAM_BOOLEAN(kHasDSPHistogramName,
2550 has_default_search_provider);
2551 // Ensure that default search provider exists. See http://crbug.com/116952.
2552 if (!has_default_search_provider) {
2553 bool success =
2554 SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider());
2555 DCHECK(success);
2556 }
2557 // Don't log anything if the user has a NULL default search provider. A
2558 // logged value of 0 indicates a custom default search provider.
2559 if (default_search_provider_) {
2560 UMA_HISTOGRAM_ENUMERATION(
2561 kDSPHistogramName,
2562 default_search_provider_->prepopulate_id(),
2563 TemplateURLPrepopulateData::kMaxPrepopulatedEngineID);
2564 }
2565 }
2566 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698