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 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |