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 <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 ++i) { | 868 ++i) { |
869 AddNoNotify(new TemplateURL(profile_, *i), true); | 869 AddNoNotify(new TemplateURL(profile_, *i), true); |
870 } | 870 } |
871 | 871 |
872 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 872 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
873 &dsp_change_origin_, DSP_CHANGE_PROFILE_RESET); | 873 &dsp_change_origin_, DSP_CHANGE_PROFILE_RESET); |
874 | 874 |
875 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); | 875 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); |
876 | 876 |
877 if (!default_search_provider_) { | 877 if (!default_search_provider_) { |
| 878 // If the default search provider came from a user pref we would have been |
| 879 // notified of the new (fallback-provided) value in |
| 880 // ClearUserSelectedDefaultSearchEngine() above. Since we are here, the |
| 881 // value was presumably originally a fallback value (which may have been |
| 882 // repaired). |
878 DefaultSearchManager::Source source; | 883 DefaultSearchManager::Source source; |
879 const TemplateURLData* new_dse = | 884 const TemplateURLData* new_dse = |
880 default_search_manager_.GetDefaultSearchEngine(&source); | 885 default_search_manager_.GetDefaultSearchEngine(&source); |
881 // ApplyDefaultSearchChange will notify observers once it is done. | 886 // ApplyDefaultSearchChange will notify observers once it is done. |
882 ApplyDefaultSearchChange(new_dse, source); | 887 ApplyDefaultSearchChange(new_dse, source); |
883 } else { | 888 } else { |
884 NotifyObservers(); | 889 NotifyObservers(); |
885 } | 890 } |
886 } | 891 } |
887 | 892 |
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1670 } | 1675 } |
1671 | 1676 |
1672 void TemplateURLService::ChangeToLoadedState() { | 1677 void TemplateURLService::ChangeToLoadedState() { |
1673 DCHECK(!loaded_); | 1678 DCHECK(!loaded_); |
1674 | 1679 |
1675 UIThreadSearchTermsData search_terms_data(profile_); | 1680 UIThreadSearchTermsData search_terms_data(profile_); |
1676 provider_map_->Init(template_urls_, search_terms_data); | 1681 provider_map_->Init(template_urls_, search_terms_data); |
1677 loaded_ = true; | 1682 loaded_ = true; |
1678 | 1683 |
1679 // This will cause a call to NotifyObservers(). | 1684 // This will cause a call to NotifyObservers(). |
1680 ApplyDefaultSearchChange(initial_default_search_provider_ ? | 1685 ApplyDefaultSearchChangeNoMetrics( |
1681 &initial_default_search_provider_->data() : NULL, | 1686 initial_default_search_provider_ ? |
1682 default_search_provider_source_); | 1687 &initial_default_search_provider_->data() : NULL, |
| 1688 default_search_provider_source_); |
1683 initial_default_search_provider_.reset(); | 1689 initial_default_search_provider_.reset(); |
1684 on_loaded_callbacks_.Notify(); | 1690 on_loaded_callbacks_.Notify(); |
1685 } | 1691 } |
1686 | 1692 |
1687 bool TemplateURLService::CanReplaceKeywordForHost( | 1693 bool TemplateURLService::CanReplaceKeywordForHost( |
1688 const std::string& host, | 1694 const std::string& host, |
1689 TemplateURL** to_replace) { | 1695 TemplateURL** to_replace) { |
1690 DCHECK(!to_replace || !*to_replace); | 1696 DCHECK(!to_replace || !*to_replace); |
1691 const TemplateURLSet* urls = provider_map_->GetURLsForHost(host); | 1697 const TemplateURLSet* urls = provider_map_->GetURLsForHost(host); |
1692 if (!urls) | 1698 if (!urls) |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1934 !IdenticalSyncGUIDs(data, GetDefaultSearchProvider()))) { | 1940 !IdenticalSyncGUIDs(data, GetDefaultSearchProvider()))) { |
1935 GetPrefs()->SetString(prefs::kSyncedDefaultSearchProviderGUID, | 1941 GetPrefs()->SetString(prefs::kSyncedDefaultSearchProviderGUID, |
1936 data->sync_guid); | 1942 data->sync_guid); |
1937 } | 1943 } |
1938 ApplyDefaultSearchChange(data, source); | 1944 ApplyDefaultSearchChange(data, source); |
1939 } | 1945 } |
1940 | 1946 |
1941 void TemplateURLService::ApplyDefaultSearchChange( | 1947 void TemplateURLService::ApplyDefaultSearchChange( |
1942 const TemplateURLData* data, | 1948 const TemplateURLData* data, |
1943 DefaultSearchManager::Source source) { | 1949 DefaultSearchManager::Source source) { |
| 1950 if (!ApplyDefaultSearchChangeNoMetrics(data, source)) |
| 1951 return; |
| 1952 |
| 1953 UMA_HISTOGRAM_ENUMERATION( |
| 1954 "Search.DefaultSearchChangeOrigin", dsp_change_origin_, DSP_CHANGE_MAX); |
| 1955 |
| 1956 if (GetDefaultSearchProvider() && |
| 1957 GetDefaultSearchProvider()->HasGoogleBaseURLs()) { |
| 1958 #if defined(ENABLE_RLZ) |
| 1959 RLZTracker::RecordProductEvent( |
| 1960 rlz_lib::CHROME, RLZTracker::ChromeOmnibox(), rlz_lib::SET_TO_GOOGLE); |
| 1961 #endif |
| 1962 } |
| 1963 } |
| 1964 |
| 1965 bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
| 1966 const TemplateURLData* data, |
| 1967 DefaultSearchManager::Source source) { |
1944 if (!loaded_) { | 1968 if (!loaded_) { |
1945 // Set |initial_default_search_provider_| from the preferences. This is | 1969 // Set |initial_default_search_provider_| from the preferences. This is |
1946 // mainly so we can hold ownership until we get to the point where the list | 1970 // mainly so we can hold ownership until we get to the point where the list |
1947 // of keywords from Web Data is the owner of everything including the | 1971 // of keywords from Web Data is the owner of everything including the |
1948 // default. | 1972 // default. |
| 1973 bool changed = |
| 1974 TemplateURL::MatchesData(initial_default_search_provider_.get(), data); |
1949 initial_default_search_provider_.reset( | 1975 initial_default_search_provider_.reset( |
1950 data ? new TemplateURL(profile_, *data) : NULL); | 1976 data ? new TemplateURL(profile_, *data) : NULL); |
1951 default_search_provider_source_ = source; | 1977 default_search_provider_source_ = source; |
1952 return; | 1978 return changed; |
1953 } | 1979 } |
1954 | 1980 |
1955 // Prevent recursion if we update the value stored in default_search_manager_. | 1981 // Prevent recursion if we update the value stored in default_search_manager_. |
1956 // Note that we exclude the case of data == NULL because that could cause a | 1982 // Note that we exclude the case of data == NULL because that could cause a |
1957 // false positive for recursion when the initial_default_search_provider_ is | 1983 // false positive for recursion when the initial_default_search_provider_ is |
1958 // NULL due to policy. We'll never actually get recursion with data == NULL. | 1984 // NULL due to policy. We'll never actually get recursion with data == NULL. |
1959 if (source == default_search_provider_source_ && data != NULL && | 1985 if (source == default_search_provider_source_ && data != NULL && |
1960 TemplateURL::MatchesData(default_search_provider_, data)) | 1986 TemplateURL::MatchesData(default_search_provider_, data)) |
1961 return; | 1987 return false; |
1962 | 1988 |
1963 UMA_HISTOGRAM_ENUMERATION("Search.DefaultSearchChangeOrigin", | 1989 // This may be deleted later. Use exclusively for pointer comparison to detect |
1964 dsp_change_origin_, DSP_CHANGE_MAX); | 1990 // a change. |
| 1991 TemplateURL* previous_default_search_engine = default_search_provider_; |
1965 | 1992 |
1966 WebDataService::KeywordBatchModeScoper keyword_scoper(service_.get()); | 1993 WebDataService::KeywordBatchModeScoper keyword_scoper(service_.get()); |
1967 if (default_search_provider_source_ == DefaultSearchManager::FROM_POLICY || | 1994 if (default_search_provider_source_ == DefaultSearchManager::FROM_POLICY || |
1968 source == DefaultSearchManager::FROM_POLICY) { | 1995 source == DefaultSearchManager::FROM_POLICY) { |
1969 // We do this both to remove any no-longer-applicable policy-defined DSE as | 1996 // We do this both to remove any no-longer-applicable policy-defined DSE as |
1970 // well as to add the new one, if appropriate. | 1997 // well as to add the new one, if appropriate. |
1971 UpdateProvidersCreatedByPolicy( | 1998 UpdateProvidersCreatedByPolicy( |
1972 &template_urls_, | 1999 &template_urls_, |
1973 source == DefaultSearchManager::FROM_POLICY ? data : NULL); | 2000 source == DefaultSearchManager::FROM_POLICY ? data : NULL); |
1974 } | 2001 } |
1975 | 2002 |
1976 if (!data) { | 2003 if (!data) { |
1977 default_search_provider_ = NULL; | 2004 default_search_provider_ = NULL; |
1978 default_search_provider_source_ = source; | 2005 } else if (source == DefaultSearchManager::FROM_EXTENSION) { |
1979 NotifyObservers(); | |
1980 return; | |
1981 } | |
1982 | |
1983 if (source == DefaultSearchManager::FROM_EXTENSION) { | |
1984 default_search_provider_ = FindMatchingExtensionTemplateURL( | 2006 default_search_provider_ = FindMatchingExtensionTemplateURL( |
1985 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); | 2007 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
1986 } | 2008 } else if (source == DefaultSearchManager::FROM_FALLBACK) { |
1987 | |
1988 if (source == DefaultSearchManager::FROM_FALLBACK) { | |
1989 default_search_provider_ = | 2009 default_search_provider_ = |
1990 FindPrepopulatedTemplateURL(data->prepopulate_id); | 2010 FindPrepopulatedTemplateURL(data->prepopulate_id); |
1991 if (default_search_provider_) { | 2011 if (default_search_provider_) { |
1992 TemplateURLData update_data(*data); | 2012 TemplateURLData update_data(*data); |
1993 update_data.sync_guid = default_search_provider_->sync_guid(); | 2013 update_data.sync_guid = default_search_provider_->sync_guid(); |
1994 if (!default_search_provider_->safe_for_autoreplace()) { | 2014 if (!default_search_provider_->safe_for_autoreplace()) { |
1995 update_data.safe_for_autoreplace = false; | 2015 update_data.safe_for_autoreplace = false; |
1996 update_data.SetKeyword(default_search_provider_->keyword()); | 2016 update_data.SetKeyword(default_search_provider_->keyword()); |
1997 update_data.short_name = default_search_provider_->short_name(); | 2017 update_data.short_name = default_search_provider_->short_name(); |
1998 } | 2018 } |
1999 UIThreadSearchTermsData search_terms_data( | 2019 UIThreadSearchTermsData search_terms_data( |
2000 default_search_provider_->profile()); | 2020 default_search_provider_->profile()); |
2001 UpdateNoNotify(default_search_provider_, | 2021 UpdateNoNotify(default_search_provider_, |
2002 TemplateURL(profile_, update_data), | 2022 TemplateURL(profile_, update_data), |
2003 search_terms_data); | 2023 search_terms_data); |
2004 } else { | 2024 } else { |
2005 // Normally the prepopulated fallback should be present in | 2025 // Normally the prepopulated fallback should be present in |
2006 // |template_urls_|, but in a few cases it might not be: | 2026 // |template_urls_|, but in a few cases it might not be: |
2007 // (1) Tests that initialize the TemplateURLService in peculiar ways. | 2027 // (1) Tests that initialize the TemplateURLService in peculiar ways. |
2008 // (2) If the user deleted the pre-populated default and we subsequently | 2028 // (2) If the user deleted the pre-populated default and we subsequently |
2009 // lost their user-selected value. | 2029 // lost their user-selected value. |
2010 TemplateURL* new_dse = new TemplateURL(profile_, *data); | 2030 TemplateURL* new_dse = new TemplateURL(profile_, *data); |
2011 if (AddNoNotify(new_dse, true)) | 2031 if (AddNoNotify(new_dse, true)) |
2012 default_search_provider_ = new_dse; | 2032 default_search_provider_ = new_dse; |
2013 } | 2033 } |
2014 } | 2034 } else if (source == DefaultSearchManager::FROM_USER) { |
2015 if (source == DefaultSearchManager::FROM_USER) { | |
2016 default_search_provider_ = GetTemplateURLForGUID(data->sync_guid); | 2035 default_search_provider_ = GetTemplateURLForGUID(data->sync_guid); |
2017 if (!default_search_provider_ && data->prepopulate_id) { | 2036 if (!default_search_provider_ && data->prepopulate_id) { |
2018 default_search_provider_ = | 2037 default_search_provider_ = |
2019 FindPrepopulatedTemplateURL(data->prepopulate_id); | 2038 FindPrepopulatedTemplateURL(data->prepopulate_id); |
2020 } | 2039 } |
2021 TemplateURLData new_data(*data); | 2040 TemplateURLData new_data(*data); |
2022 new_data.show_in_default_list = true; | 2041 new_data.show_in_default_list = true; |
2023 if (default_search_provider_) { | 2042 if (default_search_provider_) { |
2024 UIThreadSearchTermsData search_terms_data( | 2043 UIThreadSearchTermsData search_terms_data( |
2025 default_search_provider_->profile()); | 2044 default_search_provider_->profile()); |
2026 UpdateNoNotify(default_search_provider_, | 2045 UpdateNoNotify(default_search_provider_, |
2027 TemplateURL(profile_, new_data), | 2046 TemplateURL(profile_, new_data), |
2028 search_terms_data); | 2047 search_terms_data); |
2029 } else { | 2048 } else { |
2030 new_data.id = kInvalidTemplateURLID; | 2049 new_data.id = kInvalidTemplateURLID; |
2031 TemplateURL* new_dse = new TemplateURL(profile_, new_data); | 2050 TemplateURL* new_dse = new TemplateURL(profile_, new_data); |
2032 if (AddNoNotify(new_dse, true)) | 2051 if (AddNoNotify(new_dse, true)) |
2033 default_search_provider_ = new_dse; | 2052 default_search_provider_ = new_dse; |
2034 } | 2053 } |
2035 if (default_search_provider_ && GetPrefs()) { | 2054 if (default_search_provider_ && GetPrefs()) { |
2036 GetPrefs()->SetString( | 2055 GetPrefs()->SetString( |
2037 prefs::kSyncedDefaultSearchProviderGUID, | 2056 prefs::kSyncedDefaultSearchProviderGUID, |
2038 default_search_provider_->sync_guid()); | 2057 default_search_provider_->sync_guid()); |
2039 } | 2058 } |
2040 | 2059 |
2041 } | 2060 } |
2042 | 2061 |
2043 default_search_provider_source_ = source; | 2062 default_search_provider_source_ = source; |
2044 | 2063 |
2045 if (default_search_provider_ && | 2064 bool changed = default_search_provider_ != previous_default_search_engine; |
2046 default_search_provider_->HasGoogleBaseURLs()) { | 2065 |
2047 if (profile_) | 2066 if (profile_ && changed && default_search_provider_ && |
2048 GoogleURLTracker::RequestServerCheck(profile_, false); | 2067 default_search_provider_->HasGoogleBaseURLs()) |
2049 #if defined(ENABLE_RLZ) | 2068 GoogleURLTracker::RequestServerCheck(profile_, false); |
2050 RLZTracker::RecordProductEvent(rlz_lib::CHROME, | |
2051 RLZTracker::ChromeOmnibox(), | |
2052 rlz_lib::SET_TO_GOOGLE); | |
2053 #endif | |
2054 } | |
2055 | 2069 |
2056 NotifyObservers(); | 2070 NotifyObservers(); |
| 2071 |
| 2072 return changed; |
2057 } | 2073 } |
2058 | 2074 |
2059 bool TemplateURLService::AddNoNotify(TemplateURL* template_url, | 2075 bool TemplateURLService::AddNoNotify(TemplateURL* template_url, |
2060 bool newly_adding) { | 2076 bool newly_adding) { |
2061 DCHECK(template_url); | 2077 DCHECK(template_url); |
2062 | 2078 |
2063 if (newly_adding) { | 2079 if (newly_adding) { |
2064 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); | 2080 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
2065 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), | 2081 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), |
2066 template_url) == template_urls_.end()); | 2082 template_url) == template_urls_.end()); |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2501 | 2517 |
2502 if (most_recently_intalled_default) { | 2518 if (most_recently_intalled_default) { |
2503 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 2519 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
2504 &dsp_change_origin_, DSP_CHANGE_OVERRIDE_SETTINGS_EXTENSION); | 2520 &dsp_change_origin_, DSP_CHANGE_OVERRIDE_SETTINGS_EXTENSION); |
2505 default_search_manager_.SetExtensionControlledDefaultSearchEngine( | 2521 default_search_manager_.SetExtensionControlledDefaultSearchEngine( |
2506 most_recently_intalled_default->data()); | 2522 most_recently_intalled_default->data()); |
2507 } else { | 2523 } else { |
2508 default_search_manager_.ClearExtensionControlledDefaultSearchEngine(); | 2524 default_search_manager_.ClearExtensionControlledDefaultSearchEngine(); |
2509 } | 2525 } |
2510 } | 2526 } |
OLD | NEW |