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