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

Side by Side Diff: chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc

Issue 2918053003: Settings reset prompt: Fetch default settings only when needed. (Closed)
Patch Set: Addressed Chris's comment Created 3 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 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/prefs/session_startup_pref.h" 13 #include "chrome/browser/prefs/session_startup_pref.h"
14 #include "chrome/browser/profile_resetter/brandcoded_default_settings.h" 14 #include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
15 #include "chrome/browser/profile_resetter/profile_resetter.h"
15 #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h" 16 #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h"
16 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/safe_browsing/settings_reset_prompt/default_settings_fe tcher.h"
18 #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"
19 #include "chrome/browser/search_engines/template_url_service_factory.h" 19 #include "chrome/browser/search_engines/template_url_service_factory.h"
20 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler. h" 20 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler. h"
21 #include "chrome/common/pref_names.h" 21 #include "chrome/common/pref_names.h"
22 #include "components/prefs/pref_service.h" 22 #include "components/prefs/pref_service.h"
23 #include "components/search_engines/template_url_service.h" 23 #include "components/search_engines/template_url_service.h"
24 #include "components/url_formatter/url_fixer.h" 24 #include "components/url_formatter/url_fixer.h"
25 #include "content/public/browser/browser_thread.h" 25 #include "content/public/browser/browser_thread.h"
26 #include "extensions/browser/extension_registry.h" 26 #include "extensions/browser/extension_registry.h"
27 #include "extensions/browser/extension_system.h" 27 #include "extensions/browser/extension_system.h"
(...skipping 30 matching lines...) Expand all
58 return extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension( 58 return extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension(
59 extension_id); 59 extension_id);
60 } 60 }
61 61
62 GURL FixupUrl(const std::string& url_text) { 62 GURL FixupUrl(const std::string& url_text) {
63 return url_formatter::FixupURL(url_text, /*desired_tld=*/std::string()); 63 return url_formatter::FixupURL(url_text, /*desired_tld=*/std::string());
64 } 64 }
65 65
66 } // namespace 66 } // namespace
67 67
68 // static 68 SettingsResetPromptModel::SettingsResetPromptModel(
69 void SettingsResetPromptModel::Create(
70 Profile* profile, 69 Profile* profile,
71 std::unique_ptr<SettingsResetPromptConfig> prompt_config, 70 std::unique_ptr<SettingsResetPromptConfig> prompt_config,
72 CreateCallback callback) { 71 std::unique_ptr<ProfileResetter> profile_resetter)
72 : profile_(profile),
73 prefs_manager_(profile, prompt_config->prompt_wave()),
74 prompt_config_(std::move(prompt_config)),
75 settings_snapshot_(base::MakeUnique<ResettableSettingsSnapshot>(profile)),
76 profile_resetter_(std::move(profile_resetter)),
77 time_since_last_prompt_(base::Time::Now() -
78 prefs_manager_.LastTriggeredPrompt()) {
73 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 79 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
74 DCHECK(profile); 80 DCHECK(profile_);
75 DCHECK(prompt_config); 81 DCHECK(prompt_config_);
82 DCHECK(settings_snapshot_);
83 DCHECK(profile_resetter_);
76 84
77 DefaultSettingsFetcher::FetchDefaultSettings( 85 InitDefaultSearchData();
78 base::Bind(SettingsResetPromptModel::OnSettingsFetched, profile, 86 InitStartupUrlsData();
79 base::Passed(&prompt_config), base::Passed(&callback))); 87 InitHomepageData();
80 } 88 DCHECK_EQ(settings_types_initialized_, SETTINGS_TYPE_ALL);
81 89
82 // static 90 InitExtensionData();
83 std::unique_ptr<SettingsResetPromptModel> 91
84 SettingsResetPromptModel::CreateForTesting( 92 if (!SomeSettingRequiresReset())
85 Profile* profile, 93 return;
86 std::unique_ptr<SettingsResetPromptConfig> prompt_config, 94
87 std::unique_ptr<ResettableSettingsSnapshot> settings_snapshot, 95 // For now, during the experimental phase, if policy controls any of the
88 std::unique_ptr<BrandcodedDefaultSettings> default_settings, 96 // settings that we consider for reset (search, startup pages, homepage) or if
89 std::unique_ptr<ProfileResetter> profile_resetter) { 97 // an extension that needs to be disabled is managed by policy, then we do not
90 return base::WrapUnique(new SettingsResetPromptModel( 98 // show the reset prompt.
91 profile, std::move(prompt_config), std::move(settings_snapshot), 99 //
92 std::move(default_settings), std::move(profile_resetter))); 100 // TODO(alito): Consider how clients with policies should be prompted for
101 // reset.
102 if (SomeSettingIsManaged() || SomeExtensionMustRemainEnabled()) {
103 if (homepage_reset_state_ == RESET_REQUIRED)
104 homepage_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
105 if (default_search_reset_state_ == RESET_REQUIRED)
106 default_search_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
107 if (startup_urls_reset_state_ == RESET_REQUIRED)
108 startup_urls_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
109 }
93 } 110 }
94 111
95 SettingsResetPromptModel::~SettingsResetPromptModel() {} 112 SettingsResetPromptModel::~SettingsResetPromptModel() {}
96 113
97 Profile* SettingsResetPromptModel::profile() const { 114 Profile* SettingsResetPromptModel::profile() const {
98 return profile_; 115 return profile_;
99 } 116 }
100 117
101 SettingsResetPromptConfig* SettingsResetPromptModel::config() const { 118 SettingsResetPromptConfig* SettingsResetPromptModel::config() const {
102 return prompt_config_.get(); 119 return prompt_config_.get();
103 } 120 }
104 121
105 bool SettingsResetPromptModel::ShouldPromptForReset() const { 122 bool SettingsResetPromptModel::ShouldPromptForReset() const {
106 return SomeSettingRequiresReset(); 123 return SomeSettingRequiresReset();
107 } 124 }
108 125
109 void SettingsResetPromptModel::PerformReset( 126 void SettingsResetPromptModel::PerformReset(
127 std::unique_ptr<BrandcodedDefaultSettings> default_settings,
110 const base::Closure& done_callback) { 128 const base::Closure& done_callback) {
111 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 129 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
112 // |default_settings_| is set in the constructor and will be passed on to 130 DCHECK(default_settings);
113 // |profile_resetter_| who will take over ownership. This method should never
114 // be called more than once during the lifetime of this object.
115 DCHECK(default_settings_);
116 131
117 // Disable all extensions that override settings that need to be reset. 132 // Disable all extensions that override settings that need to be reset.
118 ExtensionService* extension_service = 133 ExtensionService* extension_service =
119 extensions::ExtensionSystem::Get(profile_)->extension_service(); 134 extensions::ExtensionSystem::Get(profile_)->extension_service();
120 DCHECK(extension_service); 135 DCHECK(extension_service);
121 for (const auto& item : extensions_to_disable()) { 136 for (const auto& item : extensions_to_disable()) {
122 const extensions::ExtensionId& extension_id = item.first; 137 const extensions::ExtensionId& extension_id = item.first;
123 extension_service->DisableExtension( 138 extension_service->DisableExtension(
124 extension_id, extensions::Extension::DISABLE_USER_ACTION); 139 extension_id, extensions::Extension::DISABLE_USER_ACTION);
125 } 140 }
(...skipping 12 matching lines...) Expand all
138 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset", 153 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset",
139 SETTINGS_RESET_DEFAULT_SEARCH, 154 SETTINGS_RESET_DEFAULT_SEARCH,
140 SETTINGS_RESET_MAX); 155 SETTINGS_RESET_MAX);
141 } 156 }
142 if (startup_urls_reset_state() == RESET_REQUIRED) { 157 if (startup_urls_reset_state() == RESET_REQUIRED) {
143 reset_flags |= ProfileResetter::STARTUP_PAGES; 158 reset_flags |= ProfileResetter::STARTUP_PAGES;
144 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset", 159 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset",
145 SETTINGS_RESET_STARTUP_URLS, SETTINGS_RESET_MAX); 160 SETTINGS_RESET_STARTUP_URLS, SETTINGS_RESET_MAX);
146 } 161 }
147 162
148 profile_resetter_->Reset(reset_flags, std::move(default_settings_), 163 profile_resetter_->Reset(reset_flags, std::move(default_settings),
149 done_callback); 164 done_callback);
150 } 165 }
151 166
152 void SettingsResetPromptModel::DialogShown() { 167 void SettingsResetPromptModel::DialogShown() {
153 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 168 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
154 DCHECK(SomeSettingRequiresReset()); 169 DCHECK(SomeSettingRequiresReset());
155 170
156 base::Time now = base::Time::Now(); 171 base::Time now = base::Time::Now();
157 if (default_search_reset_state() == RESET_REQUIRED) 172 if (default_search_reset_state() == RESET_REQUIRED)
158 prefs_manager_.RecordPromptShownForDefaultSearch(now); 173 prefs_manager_.RecordPromptShownForDefaultSearch(now);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 startup_urls_reset_state(), RESET_STATE_MAX); 227 startup_urls_reset_state(), RESET_STATE_MAX);
213 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_Homepage", 228 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_Homepage",
214 homepage_reset_state(), RESET_STATE_MAX); 229 homepage_reset_state(), RESET_STATE_MAX);
215 UMA_HISTOGRAM_COUNTS_100("SettingsResetPrompt.NumberOfExtensionsToDisable", 230 UMA_HISTOGRAM_COUNTS_100("SettingsResetPrompt.NumberOfExtensionsToDisable",
216 extensions_to_disable().size()); 231 extensions_to_disable().size());
217 UMA_HISTOGRAM_SPARSE_SLOWLY( 232 UMA_HISTOGRAM_SPARSE_SLOWLY(
218 "SettingsResetPrompt.DelayBeforePromptParam", 233 "SettingsResetPrompt.DelayBeforePromptParam",
219 prompt_config_->delay_before_prompt().InSeconds()); 234 prompt_config_->delay_before_prompt().InSeconds());
220 } 235 }
221 236
222 // static
223 void SettingsResetPromptModel::OnSettingsFetched(
224 Profile* profile,
225 std::unique_ptr<SettingsResetPromptConfig> prompt_config,
226 SettingsResetPromptModel::CreateCallback callback,
227 std::unique_ptr<BrandcodedDefaultSettings> default_settings) {
228 DCHECK(profile);
229 DCHECK(prompt_config);
230 DCHECK(default_settings);
231
232 callback.Run(base::WrapUnique(new SettingsResetPromptModel(
233 profile, std::move(prompt_config),
234 base::MakeUnique<ResettableSettingsSnapshot>(profile),
235 std::move(default_settings),
236 base::MakeUnique<ProfileResetter>(profile))));
237 }
238
239 SettingsResetPromptModel::SettingsResetPromptModel(
240 Profile* profile,
241 std::unique_ptr<SettingsResetPromptConfig> prompt_config,
242 std::unique_ptr<ResettableSettingsSnapshot> settings_snapshot,
243 std::unique_ptr<BrandcodedDefaultSettings> default_settings,
244 std::unique_ptr<ProfileResetter> profile_resetter)
245 : profile_(profile),
246 prefs_manager_(profile, prompt_config->prompt_wave()),
247 prompt_config_(std::move(prompt_config)),
248 settings_snapshot_(std::move(settings_snapshot)),
249 default_settings_(std::move(default_settings)),
250 profile_resetter_(std::move(profile_resetter)),
251 time_since_last_prompt_(base::Time::Now() -
252 prefs_manager_.LastTriggeredPrompt()),
253 settings_types_initialized_(0),
254 homepage_reset_domain_id_(-1),
255 homepage_reset_state_(NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED),
256 default_search_reset_domain_id_(-1),
257 default_search_reset_state_(NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED),
258 startup_urls_reset_state_(NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED) {
259 DCHECK(profile_);
260 DCHECK(prompt_config_);
261 DCHECK(settings_snapshot_);
262 DCHECK(default_settings_);
263 DCHECK(profile_resetter_);
264
265 InitDefaultSearchData();
266 InitStartupUrlsData();
267 InitHomepageData();
268 DCHECK_EQ(settings_types_initialized_, SETTINGS_TYPE_ALL);
269
270 InitExtensionData();
271
272 if (!SomeSettingRequiresReset())
273 return;
274
275 // For now, during the experimental phase, if policy controls any of the
276 // settings that we consider for reset (search, startup pages, homepage) or if
277 // an extension that needs to be disabled is managed by policy, then we do not
278 // show the reset prompt.
279 //
280 // TODO(alito): Consider how clients with policies should be prompted for
281 // reset.
282 if (SomeSettingIsManaged() || SomeExtensionMustRemainEnabled()) {
283 if (homepage_reset_state_ == RESET_REQUIRED)
284 homepage_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
285 if (default_search_reset_state_ == RESET_REQUIRED)
286 default_search_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
287 if (startup_urls_reset_state_ == RESET_REQUIRED)
288 startup_urls_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
289 }
290 }
291
292 void SettingsResetPromptModel::InitDefaultSearchData() { 237 void SettingsResetPromptModel::InitDefaultSearchData() {
293 // Default search data must be the first setting type to be initialized. 238 // Default search data must be the first setting type to be initialized.
294 DCHECK_EQ(settings_types_initialized_, 0U); 239 DCHECK_EQ(settings_types_initialized_, 0U);
295 240
296 settings_types_initialized_ |= SETTINGS_TYPE_DEFAULT_SEARCH; 241 settings_types_initialized_ |= SETTINGS_TYPE_DEFAULT_SEARCH;
297 242
298 default_search_url_ = FixupUrl(settings_snapshot_->dse_url()); 243 default_search_url_ = FixupUrl(settings_snapshot_->dse_url());
299 default_search_reset_domain_id_ = 244 default_search_reset_domain_id_ =
300 prompt_config_->UrlToResetDomainId(default_search_url_); 245 prompt_config_->UrlToResetDomainId(default_search_url_);
301 if (default_search_reset_domain_id_ < 0) 246 if (default_search_reset_domain_id_ < 0)
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 GetExtension(profile_, extension_id); 402 GetExtension(profile_, extension_id);
458 if (extension && management_policy->MustRemainEnabled(extension, nullptr)) 403 if (extension && management_policy->MustRemainEnabled(extension, nullptr))
459 return true; 404 return true;
460 } 405 }
461 } 406 }
462 407
463 return false; 408 return false;
464 } 409 }
465 410
466 } // namespace safe_browsing. 411 } // namespace safe_browsing.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698