OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_model.h" | 5 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_model.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
12 #include "chrome/browser/extensions/extension_service.h" | 12 #include "chrome/browser/extensions/extension_service.h" |
13 #include "chrome/browser/google/google_brand.h" | |
14 #include "chrome/browser/prefs/session_startup_pref.h" | 13 #include "chrome/browser/prefs/session_startup_pref.h" |
15 #include "chrome/browser/profile_resetter/brandcode_config_fetcher.h" | |
16 #include "chrome/browser/profile_resetter/brandcoded_default_settings.h" | 14 #include "chrome/browser/profile_resetter/brandcoded_default_settings.h" |
17 #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h" | 15 #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h" |
18 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
| 17 #include "chrome/browser/safe_browsing/settings_reset_prompt/default_settings_fe
tcher.h" |
19 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_config.h" | 18 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prom
pt_config.h" |
20 #include "chrome/browser/search_engines/template_url_service_factory.h" | 19 #include "chrome/browser/search_engines/template_url_service_factory.h" |
21 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.
h" | 20 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.
h" |
22 #include "chrome/common/pref_names.h" | 21 #include "chrome/common/pref_names.h" |
23 #include "components/prefs/pref_service.h" | 22 #include "components/prefs/pref_service.h" |
24 #include "components/search_engines/template_url_service.h" | 23 #include "components/search_engines/template_url_service.h" |
25 #include "components/url_formatter/url_fixer.h" | 24 #include "components/url_formatter/url_fixer.h" |
26 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
27 #include "extensions/browser/extension_registry.h" | 26 #include "extensions/browser/extension_registry.h" |
28 #include "extensions/browser/extension_system.h" | 27 #include "extensions/browser/extension_system.h" |
29 #include "extensions/common/extension.h" | 28 #include "extensions/common/extension.h" |
30 #include "extensions/common/extension_id.h" | 29 #include "extensions/common/extension_id.h" |
31 #include "extensions/common/extension_set.h" | 30 #include "extensions/common/extension_set.h" |
32 | 31 |
33 namespace safe_browsing { | 32 namespace safe_browsing { |
34 | 33 |
35 namespace { | 34 namespace { |
36 | 35 |
37 #if defined(GOOGLE_CHROME_BUILD) | |
38 constexpr char kOmahaUrl[] = "https://tools.google.com/service/update2"; | |
39 #endif // defined(GOOGLE_CHROME_BUILD) | |
40 | |
41 // These values are used for UMA metrics reporting. New enum values can be | 36 // These values are used for UMA metrics reporting. New enum values can be |
42 // added, but existing enums must never be renumbered or deleted and reused. | 37 // added, but existing enums must never be renumbered or deleted and reused. |
43 enum SettingsReset { | 38 enum SettingsReset { |
44 SETTINGS_RESET_HOMEPAGE = 1, | 39 SETTINGS_RESET_HOMEPAGE = 1, |
45 SETTINGS_RESET_DEFAULT_SEARCH = 2, | 40 SETTINGS_RESET_DEFAULT_SEARCH = 2, |
46 SETTINGS_RESET_STARTUP_URLS = 3, | 41 SETTINGS_RESET_STARTUP_URLS = 3, |
47 SETTINGS_RESET_MAX, | 42 SETTINGS_RESET_MAX, |
48 }; | 43 }; |
49 | 44 |
50 // Used to keep track of which settings types have been initialized in | 45 // Used to keep track of which settings types have been initialized in |
51 // |SettingsResetPromptModel|. | 46 // |SettingsResetPromptModel|. |
52 enum SettingsType : uint32_t { | 47 enum SettingsType : uint32_t { |
53 SETTINGS_TYPE_HOMEPAGE = 1 << 0, | 48 SETTINGS_TYPE_HOMEPAGE = 1 << 0, |
54 SETTINGS_TYPE_DEFAULT_SEARCH = 1 << 1, | 49 SETTINGS_TYPE_DEFAULT_SEARCH = 1 << 1, |
55 SETTINGS_TYPE_STARTUP_URLS = 1 << 2, | 50 SETTINGS_TYPE_STARTUP_URLS = 1 << 2, |
56 SETTINGS_TYPE_ALL = SETTINGS_TYPE_HOMEPAGE | SETTINGS_TYPE_DEFAULT_SEARCH | | 51 SETTINGS_TYPE_ALL = SETTINGS_TYPE_HOMEPAGE | SETTINGS_TYPE_DEFAULT_SEARCH | |
57 SETTINGS_TYPE_STARTUP_URLS, | 52 SETTINGS_TYPE_STARTUP_URLS, |
58 }; | 53 }; |
59 | 54 |
60 // A helper class that fetches default settings to be used for the settings | |
61 // reset prompt. The static |FetchDefaultSettings()| function will create and | |
62 // manage the lifetime of |DefaultSettingsFetcher| instances. | |
63 class DefaultSettingsFetcher { | |
64 public: | |
65 using SettingsCallback = | |
66 base::Callback<void(std::unique_ptr<BrandcodedDefaultSettings>)>; | |
67 | |
68 // Fetches default settings and passes the corresponding | |
69 // |BrandcodedDefaultSettings| object to |callback| on the UI thread. The | |
70 // function should be called on the UI thread as well. | |
71 static void FetchDefaultSettings(SettingsCallback callback); | |
72 | |
73 private: | |
74 // Instances of |DefaultSettingsFetcher| own themselves and will delete | |
75 // themselves once default settings have been fetched and |callback| has been | |
76 // posted on the UI thread. | |
77 // | |
78 // The main reason for this design is that |BrandcodeConfigFetcher| takes a | |
79 // callback and initiates the fetching process in its constructor, and we need | |
80 // to hold on to the instance of the fetcher until settings have been | |
81 // fetched. This design saves us from having to explicitly manage global | |
82 // |BrandcodeConfigFetcher| instances. | |
83 explicit DefaultSettingsFetcher(SettingsCallback callback); | |
84 ~DefaultSettingsFetcher(); | |
85 | |
86 // Starts the process of fetching default settings and will ensure that | |
87 // |PostCallbackAndDeleteSelf| is called once settings have been fetched. | |
88 void Start(); | |
89 void OnSettingsFetched(); | |
90 // Posts a call to |callback_| on the UI thread, passing to it | |
91 // |default_settings|, and deletes |this|. | |
92 void PostCallbackAndDeleteSelf( | |
93 std::unique_ptr<BrandcodedDefaultSettings> default_settings); | |
94 | |
95 std::unique_ptr<BrandcodeConfigFetcher> config_fetcher_; | |
96 SettingsCallback callback_; | |
97 }; | |
98 | |
99 // static | |
100 void DefaultSettingsFetcher::FetchDefaultSettings(SettingsCallback callback) { | |
101 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
102 | |
103 // |settings_fetcher| will delete itself when default settings have been | |
104 // fetched after the call to |Start()|. | |
105 DefaultSettingsFetcher* settings_fetcher = | |
106 new DefaultSettingsFetcher(std::move(callback)); | |
107 settings_fetcher->Start(); | |
108 } | |
109 | |
110 DefaultSettingsFetcher::DefaultSettingsFetcher(SettingsCallback callback) | |
111 : callback_(std::move(callback)) {} | |
112 | |
113 DefaultSettingsFetcher::~DefaultSettingsFetcher() {} | |
114 | |
115 void DefaultSettingsFetcher::Start() { | |
116 DCHECK(!config_fetcher_); | |
117 | |
118 #if defined(GOOGLE_CHROME_BUILD) | |
119 std::string brandcode; | |
120 if (google_brand::GetBrand(&brandcode) && !brandcode.empty()) { | |
121 config_fetcher_.reset(new BrandcodeConfigFetcher( | |
122 base::Bind(&DefaultSettingsFetcher::OnSettingsFetched, | |
123 base::Unretained(this)), | |
124 GURL(kOmahaUrl), brandcode)); | |
125 return; | |
126 } | |
127 #endif // defined(GOOGLE_CHROME_BUILD) | |
128 | |
129 // For non Google Chrome builds and cases with an empty |brandcode|, we create | |
130 // a default-constructed |BrandcodedDefaultSettings| object and post the | |
131 // callback immediately. | |
132 PostCallbackAndDeleteSelf(base::MakeUnique<BrandcodedDefaultSettings>()); | |
133 } | |
134 | |
135 void DefaultSettingsFetcher::OnSettingsFetched() { | |
136 DCHECK(config_fetcher_); | |
137 DCHECK(!config_fetcher_->IsActive()); | |
138 | |
139 std::unique_ptr<BrandcodedDefaultSettings> settings( | |
140 config_fetcher_->GetSettings()); | |
141 // Use default settings if fetching of BrandcodedDefaultSettings fails. | |
142 if (!settings) | |
143 settings.reset(new BrandcodedDefaultSettings()); | |
144 | |
145 PostCallbackAndDeleteSelf(std::move(settings)); | |
146 } | |
147 | |
148 void DefaultSettingsFetcher::PostCallbackAndDeleteSelf( | |
149 std::unique_ptr<BrandcodedDefaultSettings> default_settings) { | |
150 DCHECK(default_settings); | |
151 content::BrowserThread::PostTask( | |
152 content::BrowserThread::UI, FROM_HERE, | |
153 base::BindOnce(std::move(callback_), base::Passed(&default_settings))); | |
154 delete this; | |
155 } | |
156 | |
157 const extensions::Extension* GetExtension( | 55 const extensions::Extension* GetExtension( |
158 Profile* profile, | 56 Profile* profile, |
159 const extensions::ExtensionId& extension_id) { | 57 const extensions::ExtensionId& extension_id) { |
160 return extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension( | 58 return extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension( |
161 extension_id); | 59 extension_id); |
162 } | 60 } |
163 | 61 |
164 GURL FixupUrl(const std::string& url_text) { | 62 GURL FixupUrl(const std::string& url_text) { |
165 return url_formatter::FixupURL(url_text, /*desired_tld=*/std::string()); | 63 return url_formatter::FixupURL(url_text, /*desired_tld=*/std::string()); |
166 } | 64 } |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 GetExtension(profile_, extension_id); | 457 GetExtension(profile_, extension_id); |
560 if (extension && management_policy->MustRemainEnabled(extension, nullptr)) | 458 if (extension && management_policy->MustRemainEnabled(extension, nullptr)) |
561 return true; | 459 return true; |
562 } | 460 } |
563 } | 461 } |
564 | 462 |
565 return false; | 463 return false; |
566 } | 464 } |
567 | 465 |
568 } // namespace safe_browsing. | 466 } // namespace safe_browsing. |
OLD | NEW |