Chromium Code Reviews| 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/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 Loading... | |
| 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()), | |
| 79 settings_types_initialized_(0), | |
|
csharp
2017/06/02 18:18:27
Worth moving the initialization of these values th
alito
2017/06/02 18:54:26
Done.
| |
| 80 homepage_reset_domain_id_(-1), | |
| 81 homepage_reset_state_(NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED), | |
| 82 default_search_reset_domain_id_(-1), | |
| 83 default_search_reset_state_(NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED), | |
| 84 startup_urls_reset_state_(NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED) { | |
| 73 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 85 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 74 DCHECK(profile); | 86 DCHECK(profile_); |
| 75 DCHECK(prompt_config); | 87 DCHECK(prompt_config_); |
| 88 DCHECK(settings_snapshot_); | |
| 89 DCHECK(profile_resetter_); | |
| 76 | 90 |
| 77 DefaultSettingsFetcher::FetchDefaultSettings( | 91 InitDefaultSearchData(); |
| 78 base::Bind(SettingsResetPromptModel::OnSettingsFetched, profile, | 92 InitStartupUrlsData(); |
| 79 base::Passed(&prompt_config), base::Passed(&callback))); | 93 InitHomepageData(); |
| 80 } | 94 DCHECK_EQ(settings_types_initialized_, SETTINGS_TYPE_ALL); |
| 81 | 95 |
| 82 // static | 96 InitExtensionData(); |
| 83 std::unique_ptr<SettingsResetPromptModel> | 97 |
| 84 SettingsResetPromptModel::CreateForTesting( | 98 if (!SomeSettingRequiresReset()) |
| 85 Profile* profile, | 99 return; |
| 86 std::unique_ptr<SettingsResetPromptConfig> prompt_config, | 100 |
| 87 std::unique_ptr<ResettableSettingsSnapshot> settings_snapshot, | 101 // For now, during the experimental phase, if policy controls any of the |
| 88 std::unique_ptr<BrandcodedDefaultSettings> default_settings, | 102 // settings that we consider for reset (search, startup pages, homepage) or if |
| 89 std::unique_ptr<ProfileResetter> profile_resetter) { | 103 // an extension that needs to be disabled is managed by policy, then we do not |
| 90 return base::WrapUnique(new SettingsResetPromptModel( | 104 // show the reset prompt. |
| 91 profile, std::move(prompt_config), std::move(settings_snapshot), | 105 // |
| 92 std::move(default_settings), std::move(profile_resetter))); | 106 // TODO(alito): Consider how clients with policies should be prompted for |
| 107 // reset. | |
| 108 if (SomeSettingIsManaged() || SomeExtensionMustRemainEnabled()) { | |
| 109 if (homepage_reset_state_ == RESET_REQUIRED) | |
| 110 homepage_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY; | |
| 111 if (default_search_reset_state_ == RESET_REQUIRED) | |
| 112 default_search_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY; | |
| 113 if (startup_urls_reset_state_ == RESET_REQUIRED) | |
| 114 startup_urls_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY; | |
| 115 } | |
| 93 } | 116 } |
| 94 | 117 |
| 95 SettingsResetPromptModel::~SettingsResetPromptModel() {} | 118 SettingsResetPromptModel::~SettingsResetPromptModel() {} |
| 96 | 119 |
| 97 Profile* SettingsResetPromptModel::profile() const { | 120 Profile* SettingsResetPromptModel::profile() const { |
| 98 return profile_; | 121 return profile_; |
| 99 } | 122 } |
| 100 | 123 |
| 101 SettingsResetPromptConfig* SettingsResetPromptModel::config() const { | 124 SettingsResetPromptConfig* SettingsResetPromptModel::config() const { |
| 102 return prompt_config_.get(); | 125 return prompt_config_.get(); |
| 103 } | 126 } |
| 104 | 127 |
| 105 bool SettingsResetPromptModel::ShouldPromptForReset() const { | 128 bool SettingsResetPromptModel::ShouldPromptForReset() const { |
| 106 return SomeSettingRequiresReset(); | 129 return SomeSettingRequiresReset(); |
| 107 } | 130 } |
| 108 | 131 |
| 109 void SettingsResetPromptModel::PerformReset( | 132 void SettingsResetPromptModel::PerformReset( |
| 133 std::unique_ptr<BrandcodedDefaultSettings> default_settings, | |
| 110 const base::Closure& done_callback) { | 134 const base::Closure& done_callback) { |
| 111 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 135 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 112 // |default_settings_| is set in the constructor and will be passed on to | 136 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 | 137 |
| 117 // Disable all extensions that override settings that need to be reset. | 138 // Disable all extensions that override settings that need to be reset. |
| 118 ExtensionService* extension_service = | 139 ExtensionService* extension_service = |
| 119 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 140 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 120 DCHECK(extension_service); | 141 DCHECK(extension_service); |
| 121 for (const auto& item : extensions_to_disable()) { | 142 for (const auto& item : extensions_to_disable()) { |
| 122 const extensions::ExtensionId& extension_id = item.first; | 143 const extensions::ExtensionId& extension_id = item.first; |
| 123 extension_service->DisableExtension( | 144 extension_service->DisableExtension( |
| 124 extension_id, extensions::Extension::DISABLE_USER_ACTION); | 145 extension_id, extensions::Extension::DISABLE_USER_ACTION); |
| 125 } | 146 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 138 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset", | 159 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset", |
| 139 SETTINGS_RESET_DEFAULT_SEARCH, | 160 SETTINGS_RESET_DEFAULT_SEARCH, |
| 140 SETTINGS_RESET_MAX); | 161 SETTINGS_RESET_MAX); |
| 141 } | 162 } |
| 142 if (startup_urls_reset_state() == RESET_REQUIRED) { | 163 if (startup_urls_reset_state() == RESET_REQUIRED) { |
| 143 reset_flags |= ProfileResetter::STARTUP_PAGES; | 164 reset_flags |= ProfileResetter::STARTUP_PAGES; |
| 144 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset", | 165 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.SettingsReset", |
| 145 SETTINGS_RESET_STARTUP_URLS, SETTINGS_RESET_MAX); | 166 SETTINGS_RESET_STARTUP_URLS, SETTINGS_RESET_MAX); |
| 146 } | 167 } |
| 147 | 168 |
| 148 profile_resetter_->Reset(reset_flags, std::move(default_settings_), | 169 profile_resetter_->Reset(reset_flags, std::move(default_settings), |
| 149 done_callback); | 170 done_callback); |
| 150 } | 171 } |
| 151 | 172 |
| 152 void SettingsResetPromptModel::DialogShown() { | 173 void SettingsResetPromptModel::DialogShown() { |
| 153 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 174 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 154 DCHECK(SomeSettingRequiresReset()); | 175 DCHECK(SomeSettingRequiresReset()); |
| 155 | 176 |
| 156 base::Time now = base::Time::Now(); | 177 base::Time now = base::Time::Now(); |
| 157 if (default_search_reset_state() == RESET_REQUIRED) | 178 if (default_search_reset_state() == RESET_REQUIRED) |
| 158 prefs_manager_.RecordPromptShownForDefaultSearch(now); | 179 prefs_manager_.RecordPromptShownForDefaultSearch(now); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 startup_urls_reset_state(), RESET_STATE_MAX); | 233 startup_urls_reset_state(), RESET_STATE_MAX); |
| 213 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_Homepage", | 234 UMA_HISTOGRAM_ENUMERATION("SettingsResetPrompt.ResetState_Homepage", |
| 214 homepage_reset_state(), RESET_STATE_MAX); | 235 homepage_reset_state(), RESET_STATE_MAX); |
| 215 UMA_HISTOGRAM_COUNTS_100("SettingsResetPrompt.NumberOfExtensionsToDisable", | 236 UMA_HISTOGRAM_COUNTS_100("SettingsResetPrompt.NumberOfExtensionsToDisable", |
| 216 extensions_to_disable().size()); | 237 extensions_to_disable().size()); |
| 217 UMA_HISTOGRAM_SPARSE_SLOWLY( | 238 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 218 "SettingsResetPrompt.DelayBeforePromptParam", | 239 "SettingsResetPrompt.DelayBeforePromptParam", |
| 219 prompt_config_->delay_before_prompt().InSeconds()); | 240 prompt_config_->delay_before_prompt().InSeconds()); |
| 220 } | 241 } |
| 221 | 242 |
| 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() { | 243 void SettingsResetPromptModel::InitDefaultSearchData() { |
| 293 // Default search data must be the first setting type to be initialized. | 244 // Default search data must be the first setting type to be initialized. |
| 294 DCHECK_EQ(settings_types_initialized_, 0U); | 245 DCHECK_EQ(settings_types_initialized_, 0U); |
| 295 | 246 |
| 296 settings_types_initialized_ |= SETTINGS_TYPE_DEFAULT_SEARCH; | 247 settings_types_initialized_ |= SETTINGS_TYPE_DEFAULT_SEARCH; |
| 297 | 248 |
| 298 default_search_url_ = FixupUrl(settings_snapshot_->dse_url()); | 249 default_search_url_ = FixupUrl(settings_snapshot_->dse_url()); |
| 299 default_search_reset_domain_id_ = | 250 default_search_reset_domain_id_ = |
| 300 prompt_config_->UrlToResetDomainId(default_search_url_); | 251 prompt_config_->UrlToResetDomainId(default_search_url_); |
| 301 if (default_search_reset_domain_id_ < 0) | 252 if (default_search_reset_domain_id_ < 0) |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 457 GetExtension(profile_, extension_id); | 408 GetExtension(profile_, extension_id); |
| 458 if (extension && management_policy->MustRemainEnabled(extension, nullptr)) | 409 if (extension && management_policy->MustRemainEnabled(extension, nullptr)) |
| 459 return true; | 410 return true; |
| 460 } | 411 } |
| 461 } | 412 } |
| 462 | 413 |
| 463 return false; | 414 return false; |
| 464 } | 415 } |
| 465 | 416 |
| 466 } // namespace safe_browsing. | 417 } // namespace safe_browsing. |
| OLD | NEW |