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

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: change ImportantSite type declaration Created 3 years, 7 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"
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698