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