| 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()) { |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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. |
| OLD | NEW |