Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc

Issue 2716333002: Implement important sites dialog for desktop. (Closed)
Patch Set: fix html formatting Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h ('k') | chrome/common/chrome_features.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698