| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/ui/webui/settings/settings_clear_browsing_data_handler.
h" | 5 #include "chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.
h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <vector> |
| 8 | 9 |
| 10 #include "base/feature_list.h" |
| 9 #include "base/macros.h" | 11 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
| 11 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
| 12 #include "base/metrics/sparse_histogram.h" | 14 #include "base/metrics/sparse_histogram.h" |
| 15 #include "base/values.h" |
| 13 #include "chrome/browser/browsing_data/browsing_data_counter_factory.h" | 16 #include "chrome/browser/browsing_data/browsing_data_counter_factory.h" |
| 14 #include "chrome/browser/browsing_data/browsing_data_counter_utils.h" | 17 #include "chrome/browser/browsing_data/browsing_data_counter_utils.h" |
| 15 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 18 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| 19 #include "chrome/browser/browsing_data/browsing_data_important_sites_util.h" |
| 16 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" | 20 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" |
| 21 #include "chrome/browser/engagement/important_sites_util.h" |
| 17 #include "chrome/browser/history/web_history_service_factory.h" | 22 #include "chrome/browser/history/web_history_service_factory.h" |
| 18 #include "chrome/browser/sync/profile_sync_service_factory.h" | 23 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 19 #include "chrome/common/channel_info.h" | 24 #include "chrome/common/channel_info.h" |
| 25 #include "chrome/common/chrome_features.h" |
| 20 #include "chrome/common/pref_names.h" | 26 #include "chrome/common/pref_names.h" |
| 21 #include "components/browsing_data/core/history_notice_utils.h" | 27 #include "components/browsing_data/core/history_notice_utils.h" |
| 22 #include "components/browsing_data/core/pref_names.h" | 28 #include "components/browsing_data/core/pref_names.h" |
| 23 #include "components/prefs/pref_service.h" | 29 #include "components/prefs/pref_service.h" |
| 30 #include "content/public/browser/browsing_data_filter_builder.h" |
| 24 #include "content/public/browser/web_ui.h" | 31 #include "content/public/browser/web_ui.h" |
| 25 | 32 |
| 26 namespace { | 33 namespace { |
| 27 | 34 |
| 28 const int kMaxTimesHistoryNoticeShown = 1; | 35 const int kMaxTimesHistoryNoticeShown = 1; |
| 29 | 36 |
| 37 const int kMaxImportantSites = 10; |
| 38 |
| 30 // TODO(msramek): Get the list of deletion preferences from the JS side. | 39 // TODO(msramek): Get the list of deletion preferences from the JS side. |
| 31 const char* kCounterPrefs[] = { | 40 const char* kCounterPrefs[] = { |
| 32 browsing_data::prefs::kDeleteBrowsingHistory, | 41 browsing_data::prefs::kDeleteBrowsingHistory, |
| 33 browsing_data::prefs::kDeleteCache, | 42 browsing_data::prefs::kDeleteCache, |
| 34 browsing_data::prefs::kDeleteDownloadHistory, | 43 browsing_data::prefs::kDeleteDownloadHistory, |
| 35 browsing_data::prefs::kDeleteFormData, | 44 browsing_data::prefs::kDeleteFormData, |
| 36 browsing_data::prefs::kDeleteHostedAppsData, | 45 browsing_data::prefs::kDeleteHostedAppsData, |
| 37 browsing_data::prefs::kDeleteMediaLicenses, | 46 browsing_data::prefs::kDeleteMediaLicenses, |
| 38 browsing_data::prefs::kDeletePasswords, | 47 browsing_data::prefs::kDeletePasswords, |
| 39 }; | 48 }; |
| 40 | 49 |
| 50 const char* REGISTERABLE_DOMAIN_FIELD = "registerableDomain"; |
| 51 const char* REASON_BITFIELD_FIELD = "reasonBitfield"; |
| 52 const char* EXAMPLE_ORIGIN_FIELD = "exampleOrigin"; |
| 53 const char* DIALOG_DISABLED_FIELD = "dialogDisabled"; |
| 54 const char* IMPORTANT_SITES_FIELD = "importantSites"; |
| 55 const char* IS_CHECKED_FIELD = "isChecked"; |
| 56 const char* STORAGE_SIZE_FIELD = "storageSize"; |
| 57 const char* HAS_NOTIFICATIONS_FIELD = "hasNotifications"; |
| 58 |
| 41 } // namespace | 59 } // namespace |
| 42 | 60 |
| 43 namespace settings { | 61 namespace settings { |
| 44 | 62 |
| 45 // TaskObserver ---------------------------------------------------------------- | 63 // TaskObserver ---------------------------------------------------------------- |
| 46 | 64 |
| 47 class ClearBrowsingDataHandler::TaskObserver | 65 class ClearBrowsingDataHandler::TaskObserver |
| 48 : public BrowsingDataRemover::Observer { | 66 : public BrowsingDataRemover::Observer { |
| 49 public: | 67 public: |
| 50 TaskObserver(BrowsingDataRemover* remover, const base::Closure& callback); | 68 TaskObserver(BrowsingDataRemover* remover, |
| 69 const base::Closure& callback, |
| 70 int task_count); |
| 51 ~TaskObserver() override; | 71 ~TaskObserver() override; |
| 52 | 72 |
| 53 void OnBrowsingDataRemoverDone() override; | 73 void OnBrowsingDataRemoverDone() override; |
| 54 | 74 |
| 55 private: | 75 private: |
| 56 base::Closure callback_; | 76 base::Closure callback_; |
| 57 ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> | 77 ScopedObserver<BrowsingDataRemover, BrowsingDataRemover::Observer> |
| 58 remover_observer_; | 78 remover_observer_; |
| 79 int task_count_; |
| 59 | 80 |
| 60 DISALLOW_COPY_AND_ASSIGN(TaskObserver); | 81 DISALLOW_COPY_AND_ASSIGN(TaskObserver); |
| 61 }; | 82 }; |
| 62 | 83 |
| 63 ClearBrowsingDataHandler::TaskObserver::TaskObserver( | 84 ClearBrowsingDataHandler::TaskObserver::TaskObserver( |
| 64 BrowsingDataRemover* remover, const base::Closure& callback) | 85 BrowsingDataRemover* remover, |
| 65 : callback_(callback), | 86 const base::Closure& callback, |
| 66 remover_observer_(this) { | 87 int task_count) |
| 88 : callback_(callback), remover_observer_(this), task_count_(task_count) { |
| 67 remover_observer_.Add(remover); | 89 remover_observer_.Add(remover); |
| 68 } | 90 } |
| 69 | 91 |
| 70 ClearBrowsingDataHandler::TaskObserver::~TaskObserver() {} | 92 ClearBrowsingDataHandler::TaskObserver::~TaskObserver() {} |
| 71 | 93 |
| 72 void ClearBrowsingDataHandler::TaskObserver::OnBrowsingDataRemoverDone() { | 94 void ClearBrowsingDataHandler::TaskObserver::OnBrowsingDataRemoverDone() { |
| 95 DCHECK(task_count_); |
| 96 if (--task_count_) |
| 97 return; |
| 73 remover_observer_.RemoveAll(); | 98 remover_observer_.RemoveAll(); |
| 74 callback_.Run(); | 99 callback_.Run(); |
| 75 } | 100 } |
| 76 | 101 |
| 77 // ClearBrowsingDataHandler ---------------------------------------------------- | 102 // ClearBrowsingDataHandler ---------------------------------------------------- |
| 78 | 103 |
| 79 ClearBrowsingDataHandler::ClearBrowsingDataHandler(content::WebUI* webui) | 104 ClearBrowsingDataHandler::ClearBrowsingDataHandler(content::WebUI* webui) |
| 80 : profile_(Profile::FromWebUI(webui)), | 105 : profile_(Profile::FromWebUI(webui)), |
| 81 sync_service_(ProfileSyncServiceFactory::GetForProfile(profile_)), | 106 sync_service_(ProfileSyncServiceFactory::GetForProfile(profile_)), |
| 82 sync_service_observer_(this), | 107 sync_service_observer_(this), |
| 83 show_history_footer_(false), | 108 show_history_footer_(false), |
| 84 show_history_deletion_dialog_(false), | 109 show_history_deletion_dialog_(false), |
| 85 weak_ptr_factory_(this) {} | 110 weak_ptr_factory_(this) {} |
| 86 | 111 |
| 87 ClearBrowsingDataHandler::~ClearBrowsingDataHandler() { | 112 ClearBrowsingDataHandler::~ClearBrowsingDataHandler() { |
| 88 } | 113 } |
| 89 | 114 |
| 90 void ClearBrowsingDataHandler::RegisterMessages() { | 115 void ClearBrowsingDataHandler::RegisterMessages() { |
| 91 web_ui()->RegisterMessageCallback( | 116 web_ui()->RegisterMessageCallback( |
| 92 "clearBrowsingData", | 117 "clearBrowsingData", |
| 93 base::Bind(&ClearBrowsingDataHandler::HandleClearBrowsingData, | 118 base::Bind(&ClearBrowsingDataHandler::HandleClearBrowsingData, |
| 94 base::Unretained(this))); | 119 base::Unretained(this))); |
| 95 | 120 |
| 96 web_ui()->RegisterMessageCallback( | 121 web_ui()->RegisterMessageCallback( |
| 122 "fetchImportantSites", |
| 123 base::Bind(&ClearBrowsingDataHandler::HandleFetchImportantSites, |
| 124 base::Unretained(this))); |
| 125 |
| 126 web_ui()->RegisterMessageCallback( |
| 97 "initializeClearBrowsingData", | 127 "initializeClearBrowsingData", |
| 98 base::Bind(&ClearBrowsingDataHandler::HandleInitialize, | 128 base::Bind(&ClearBrowsingDataHandler::HandleInitialize, |
| 99 base::Unretained(this))); | 129 base::Unretained(this))); |
| 100 } | 130 } |
| 101 | 131 |
| 102 void ClearBrowsingDataHandler::OnJavascriptAllowed() { | 132 void ClearBrowsingDataHandler::OnJavascriptAllowed() { |
| 103 if (sync_service_) | 133 if (sync_service_) |
| 104 sync_service_observer_.Add(sync_service_); | 134 sync_service_observer_.Add(sync_service_); |
| 105 | 135 |
| 106 DCHECK(counters_.empty()); | 136 DCHECK(counters_.empty()); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 [prefs](const std::string& pref) { return prefs->GetBoolean(pref); }); | 220 [prefs](const std::string& pref) { return prefs->GetBoolean(pref); }); |
| 191 UMA_HISTOGRAM_SPARSE_SLOWLY( | 221 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 192 "History.ClearBrowsingData.PasswordsDeletion.AdditionalDatatypesCount", | 222 "History.ClearBrowsingData.PasswordsDeletion.AdditionalDatatypesCount", |
| 193 checked_other_types); | 223 checked_other_types); |
| 194 } | 224 } |
| 195 | 225 |
| 196 int period_selected = | 226 int period_selected = |
| 197 prefs->GetInteger(browsing_data::prefs::kDeleteTimePeriod); | 227 prefs->GetInteger(browsing_data::prefs::kDeleteTimePeriod); |
| 198 | 228 |
| 199 std::string webui_callback_id; | 229 std::string webui_callback_id; |
| 200 CHECK_EQ(1U, args->GetSize()); | 230 CHECK_EQ(2U, args->GetSize()); |
| 201 CHECK(args->GetString(0, &webui_callback_id)); | 231 CHECK(args->GetString(0, &webui_callback_id)); |
| 202 | 232 |
| 233 std::vector<std::string> excluding_domains; |
| 234 std::vector<int32_t> excluding_domain_reasons; |
| 235 std::vector<std::string> ignoring_domains; |
| 236 std::vector<int32_t> ignoring_domain_reasons; |
| 237 const base::ListValue* important_sites = nullptr; |
| 238 CHECK(args->GetList(1, &important_sites)); |
| 239 for (const auto& item : *important_sites) { |
| 240 const base::DictionaryValue* site = nullptr; |
| 241 CHECK(item->GetAsDictionary(&site)); |
| 242 bool is_checked = false; |
| 243 CHECK(site->GetBoolean(IS_CHECKED_FIELD, &is_checked)); |
| 244 std::string domain; |
| 245 int domain_reason = -1; |
| 246 CHECK(site->GetString(REGISTERABLE_DOMAIN_FIELD, &domain)); |
| 247 CHECK(site->GetInteger(REASON_BITFIELD_FIELD, &domain_reason)); |
| 248 if (is_checked) { // Selected important sites should be deleted. |
| 249 ignoring_domains.push_back(domain); |
| 250 ignoring_domain_reasons.push_back(domain_reason); |
| 251 } else { // Unselected sites should be kept. |
| 252 excluding_domains.push_back(domain); |
| 253 excluding_domain_reasons.push_back(domain_reason); |
| 254 } |
| 255 } |
| 256 |
| 257 std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder( |
| 258 content::BrowsingDataFilterBuilder::Create( |
| 259 content::BrowsingDataFilterBuilder::BLACKLIST)); |
| 260 for (const std::string& domain : excluding_domains) { |
| 261 filter_builder->AddRegisterableDomain(domain); |
| 262 } |
| 263 |
| 264 if (!excluding_domains.empty() || !ignoring_domains.empty()) { |
| 265 ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites( |
| 266 profile_->GetOriginalProfile(), excluding_domains, |
| 267 excluding_domain_reasons, ignoring_domains, ignoring_domain_reasons); |
| 268 } |
| 269 |
| 203 BrowsingDataRemover* remover = | 270 BrowsingDataRemover* remover = |
| 204 BrowsingDataRemoverFactory::GetForBrowserContext(profile_); | 271 BrowsingDataRemoverFactory::GetForBrowserContext(profile_); |
| 205 task_observer_ = base::MakeUnique<TaskObserver>( | 272 task_observer_ = base::MakeUnique<TaskObserver>( |
| 206 remover, | 273 remover, |
| 207 base::Bind(&ClearBrowsingDataHandler::OnClearingTaskFinished, | 274 base::Bind(&ClearBrowsingDataHandler::OnClearingTaskFinished, |
| 208 base::Unretained(this), webui_callback_id)); | 275 base::Unretained(this), webui_callback_id), |
| 276 /*task_count=*/2); |
| 209 browsing_data::TimePeriod time_period = | 277 browsing_data::TimePeriod time_period = |
| 210 static_cast<browsing_data::TimePeriod>(period_selected); | 278 static_cast<browsing_data::TimePeriod>(period_selected); |
| 211 browsing_data::RecordDeletionForPeriod(time_period); | 279 |
| 212 remover->RemoveAndReply( | 280 browsing_data_important_sites_util::Remove( |
| 213 browsing_data::CalculateBeginDeleteTime(time_period), | 281 remove_mask, origin_mask, time_period, std::move(filter_builder), remover, |
| 214 browsing_data::CalculateEndDeleteTime(time_period), | 282 task_observer_.get()); |
| 215 remove_mask, origin_mask, task_observer_.get()); | |
| 216 } | 283 } |
| 217 | 284 |
| 218 void ClearBrowsingDataHandler::OnClearingTaskFinished( | 285 void ClearBrowsingDataHandler::OnClearingTaskFinished( |
| 219 const std::string& webui_callback_id) { | 286 const std::string& webui_callback_id) { |
| 220 PrefService* prefs = profile_->GetPrefs(); | 287 PrefService* prefs = profile_->GetPrefs(); |
| 221 int notice_shown_times = prefs->GetInteger( | 288 int notice_shown_times = prefs->GetInteger( |
| 222 browsing_data::prefs::kClearBrowsingDataHistoryNoticeShownTimes); | 289 browsing_data::prefs::kClearBrowsingDataHistoryNoticeShownTimes); |
| 223 | 290 |
| 224 // When the deletion is complete, we might show an additional dialog with | 291 // When the deletion is complete, we might show an additional dialog with |
| 225 // a notice about other forms of browsing history. This is the case if | 292 // a notice about other forms of browsing history. This is the case if |
| (...skipping 13 matching lines...) Expand all Loading... |
| 239 } | 306 } |
| 240 | 307 |
| 241 UMA_HISTOGRAM_BOOLEAN( | 308 UMA_HISTOGRAM_BOOLEAN( |
| 242 "History.ClearBrowsingData.ShownHistoryNoticeAfterClearing", show_notice); | 309 "History.ClearBrowsingData.ShownHistoryNoticeAfterClearing", show_notice); |
| 243 | 310 |
| 244 ResolveJavascriptCallback(base::Value(webui_callback_id), | 311 ResolveJavascriptCallback(base::Value(webui_callback_id), |
| 245 base::Value(show_notice)); | 312 base::Value(show_notice)); |
| 246 task_observer_.reset(); | 313 task_observer_.reset(); |
| 247 } | 314 } |
| 248 | 315 |
| 316 void ClearBrowsingDataHandler::HandleFetchImportantSites( |
| 317 const base::ListValue* args) { |
| 318 AllowJavascript(); |
| 319 const base::Value* callback_id; |
| 320 CHECK(args->Get(0, &callback_id)); |
| 321 |
| 322 Profile* profile = profile_->GetOriginalProfile(); |
| 323 bool dialog_disabled = |
| 324 ImportantSitesUtil::IsDialogDisabled(profile) || |
| 325 !base::FeatureList::IsEnabled(features::kImportantSitesInCBD); |
| 326 auto important_sites_list = base::MakeUnique<base::ListValue>(); |
| 327 |
| 328 if (!dialog_disabled) { |
| 329 std::vector<ImportantSitesUtil::ImportantDomainInfo> important_sites = |
| 330 ImportantSitesUtil::GetImportantRegisterableDomains(profile, |
| 331 kMaxImportantSites); |
| 332 for (const auto& info : important_sites) { |
| 333 auto entry = base::MakeUnique<base::DictionaryValue>(); |
| 334 entry->SetString(REGISTERABLE_DOMAIN_FIELD, info.registerable_domain); |
| 335 entry->SetInteger(REASON_BITFIELD_FIELD, info.reason_bitfield); |
| 336 entry->SetString(EXAMPLE_ORIGIN_FIELD, info.example_origin.spec()); |
| 337 // Initially all sites are selected for deletion. |
| 338 entry->SetBoolean(IS_CHECKED_FIELD, true); |
| 339 // TODO(dullweber): Get size. |
| 340 entry->SetInteger(STORAGE_SIZE_FIELD, 0); |
| 341 bool has_notifications = |
| 342 (info.reason_bitfield & |
| 343 (1 << ImportantSitesUtil::ImportantReason::NOTIFICATIONS)) != 0; |
| 344 entry->SetBoolean(HAS_NOTIFICATIONS_FIELD, has_notifications); |
| 345 important_sites_list->Append(std::move(entry)); |
| 346 } |
| 347 } |
| 348 |
| 349 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
| 350 result->SetBoolean(DIALOG_DISABLED_FIELD, dialog_disabled); |
| 351 result->Set(IMPORTANT_SITES_FIELD, std::move(important_sites_list)); |
| 352 |
| 353 ResolveJavascriptCallback(*callback_id, *result); |
| 354 } |
| 355 |
| 249 void ClearBrowsingDataHandler::HandleInitialize(const base::ListValue* args) { | 356 void ClearBrowsingDataHandler::HandleInitialize(const base::ListValue* args) { |
| 250 AllowJavascript(); | 357 AllowJavascript(); |
| 251 const base::Value* callback_id; | 358 const base::Value* callback_id; |
| 252 CHECK(args->Get(0, &callback_id)); | 359 CHECK(args->Get(0, &callback_id)); |
| 253 | 360 |
| 254 // Needed because WebUI doesn't handle renderer crashes. See crbug.com/610450. | 361 // Needed because WebUI doesn't handle renderer crashes. See crbug.com/610450. |
| 255 task_observer_.reset(); | 362 task_observer_.reset(); |
| 256 | 363 |
| 257 UpdateSyncState(); | 364 UpdateSyncState(); |
| 258 RefreshHistoryNotice(); | 365 RefreshHistoryNotice(); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 | 432 |
| 326 void ClearBrowsingDataHandler::UpdateCounterText( | 433 void ClearBrowsingDataHandler::UpdateCounterText( |
| 327 std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) { | 434 std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) { |
| 328 CallJavascriptFunction( | 435 CallJavascriptFunction( |
| 329 "cr.webUIListenerCallback", base::Value("update-counter-text"), | 436 "cr.webUIListenerCallback", base::Value("update-counter-text"), |
| 330 base::Value(result->source()->GetPrefName()), | 437 base::Value(result->source()->GetPrefName()), |
| 331 base::Value(GetChromeCounterTextFromResult(result.get()))); | 438 base::Value(GetChromeCounterTextFromResult(result.get()))); |
| 332 } | 439 } |
| 333 | 440 |
| 334 } // namespace settings | 441 } // namespace settings |
| OLD | NEW |