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 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 // 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } | |
| OLD | NEW |