OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browsing_data/browsing_data_remover.h" | 5 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 remove_mask_(-1), | 292 remove_mask_(-1), |
293 origin_type_mask_(-1), | 293 origin_type_mask_(-1), |
294 #if BUILDFLAG(ANDROID_JAVA_UI) | 294 #if BUILDFLAG(ANDROID_JAVA_UI) |
295 webapp_registry_(new WebappRegistry()), | 295 webapp_registry_(new WebappRegistry()), |
296 #endif | 296 #endif |
297 weak_ptr_factory_(this) { | 297 weak_ptr_factory_(this) { |
298 DCHECK(browser_context); | 298 DCHECK(browser_context); |
299 } | 299 } |
300 | 300 |
301 BrowsingDataRemover::~BrowsingDataRemover() { | 301 BrowsingDataRemover::~BrowsingDataRemover() { |
302 // If we are still removing data, notify observers so they can remove | 302 if (!task_queue_.empty()) { |
303 // themselves from the observer list. | 303 VLOG(1) << "BrowsingDataRemover shuts down with " << task_queue_.size() |
| 304 << " pending tasks"; |
| 305 } |
| 306 |
| 307 // If we are still removing data, notify observers that their task has been |
| 308 // (albeit unsucessfuly) processed, so they can unregister themselves. |
304 // TODO(bauerb): If it becomes a problem that browsing data might not actually | 309 // TODO(bauerb): If it becomes a problem that browsing data might not actually |
305 // be fully cleared when an observer is notified, add a success flag. | 310 // be fully cleared when an observer is notified, add a success flag. |
306 if (is_removing_) | 311 while (!task_queue_.empty()) { |
307 Notify(); | 312 if (observer_list_.HasObserver(task_queue_.front().observer)) |
| 313 task_queue_.front().observer->OnBrowsingDataRemoverDone(); |
| 314 task_queue_.pop(); |
| 315 } |
308 } | 316 } |
309 | 317 |
310 void BrowsingDataRemover::Shutdown() { | 318 void BrowsingDataRemover::Shutdown() { |
311 history_task_tracker_.TryCancelAll(); | 319 history_task_tracker_.TryCancelAll(); |
312 template_url_sub_.reset(); | 320 template_url_sub_.reset(); |
313 } | 321 } |
314 | 322 |
315 void BrowsingDataRemover::SetRemoving(bool is_removing) { | 323 void BrowsingDataRemover::SetRemoving(bool is_removing) { |
316 DCHECK_NE(is_removing_, is_removing); | 324 DCHECK_NE(is_removing_, is_removing); |
317 is_removing_ = is_removing; | 325 is_removing_ = is_removing; |
318 FOR_EACH_OBSERVER(Observer, observer_list_, | 326 FOR_EACH_OBSERVER(Observer, observer_list_, |
319 OnBrowsingDataRemoving(is_removing)); | 327 OnBrowsingDataRemoving(is_removing)); |
320 } | 328 } |
321 | 329 |
322 void BrowsingDataRemover::Remove(const TimeRange& time_range, | 330 void BrowsingDataRemover::Remove(const TimeRange& time_range, |
323 int remove_mask, | 331 int remove_mask, |
324 int origin_type_mask) { | 332 int origin_type_mask) { |
325 // Any instance of BrowsingDataFilterBuilder that |IsEmptyBlacklist()| | 333 RemoveInternal(time_range, remove_mask, origin_type_mask, |
326 // is OK to pass here. | 334 std::unique_ptr<RegistrableDomainFilterBuilder>(), nullptr); |
327 RegistrableDomainFilterBuilder builder( | 335 } |
328 RegistrableDomainFilterBuilder::BLACKLIST); | 336 |
329 DCHECK(builder.IsEmptyBlacklist()); | 337 void BrowsingDataRemover::RemoveAndReply( |
330 RemoveImpl(time_range, remove_mask, builder, origin_type_mask); | 338 const TimeRange& time_range, |
| 339 int remove_mask, |
| 340 int origin_type_mask, |
| 341 Observer* observer) { |
| 342 DCHECK(observer); |
| 343 RemoveInternal(time_range, remove_mask, origin_type_mask, |
| 344 std::unique_ptr<RegistrableDomainFilterBuilder>(), observer); |
331 } | 345 } |
332 | 346 |
333 void BrowsingDataRemover::RemoveWithFilter( | 347 void BrowsingDataRemover::RemoveWithFilter( |
334 const TimeRange& time_range, | 348 const TimeRange& time_range, |
335 int remove_mask, | 349 int remove_mask, |
336 int origin_type_mask, | 350 int origin_type_mask, |
337 const BrowsingDataFilterBuilder& filter_builder) { | 351 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) { |
338 RemoveImpl(time_range, remove_mask, filter_builder, origin_type_mask); | 352 DCHECK(filter_builder); |
| 353 RemoveInternal(time_range, remove_mask, origin_type_mask, |
| 354 std::move(filter_builder), nullptr); |
| 355 } |
| 356 |
| 357 void BrowsingDataRemover::RemoveWithFilterAndReply( |
| 358 const TimeRange& time_range, |
| 359 int remove_mask, |
| 360 int origin_type_mask, |
| 361 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, |
| 362 Observer* observer) { |
| 363 DCHECK(filter_builder); |
| 364 DCHECK(observer); |
| 365 RemoveInternal(time_range, remove_mask, origin_type_mask, |
| 366 std::move(filter_builder), observer); |
| 367 } |
| 368 |
| 369 void BrowsingDataRemover::RemoveInternal( |
| 370 const TimeRange& time_range, |
| 371 int remove_mask, |
| 372 int origin_type_mask, |
| 373 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, |
| 374 Observer* observer) { |
| 375 DCHECK(!observer || observer_list_.HasObserver(observer)) |
| 376 << "Every observer must register itself (by calling AddObserver()) " |
| 377 << "before observing a removal task."; |
| 378 |
| 379 // Remove() and RemoveAndReply() pass a null pointer to indicate no filter. |
| 380 // No filter is equivalent to one that |IsEmptyBlacklist()|. |
| 381 if (!filter_builder) { |
| 382 filter_builder = base::WrapUnique(new RegistrableDomainFilterBuilder( |
| 383 RegistrableDomainFilterBuilder::BLACKLIST)); |
| 384 DCHECK(filter_builder->IsEmptyBlacklist()); |
| 385 } |
| 386 |
| 387 task_queue_.emplace( |
| 388 time_range, |
| 389 remove_mask, |
| 390 origin_type_mask, |
| 391 std::move(filter_builder), |
| 392 observer); |
| 393 |
| 394 // If this is the only scheduled task, execute it immediately. Otherwise, |
| 395 // it will be automatically executed when all tasks scheduled before it |
| 396 // finish. |
| 397 if (task_queue_.size() == 1) { |
| 398 SetRemoving(true); |
| 399 RunNextTask(); |
| 400 } |
| 401 } |
| 402 |
| 403 void BrowsingDataRemover::RunNextTask() { |
| 404 DCHECK(!task_queue_.empty()); |
| 405 const RemovalTask& removal_task = task_queue_.front(); |
| 406 |
| 407 RemoveImpl(removal_task.time_range, |
| 408 removal_task.remove_mask, |
| 409 *removal_task.filter_builder, |
| 410 removal_task.origin_type_mask); |
339 } | 411 } |
340 | 412 |
341 void BrowsingDataRemover::RemoveImpl( | 413 void BrowsingDataRemover::RemoveImpl( |
342 const TimeRange& time_range, | 414 const TimeRange& time_range, |
343 int remove_mask, | 415 int remove_mask, |
344 const BrowsingDataFilterBuilder& filter_builder, | 416 const BrowsingDataFilterBuilder& filter_builder, |
345 int origin_type_mask) { | 417 int origin_type_mask) { |
346 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 418 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
347 waiting_for_synchronous_clear_operations_ = true; | 419 waiting_for_synchronous_clear_operations_ = true; |
348 | 420 |
349 // crbug.com/140910: Many places were calling this with base::Time() as | 421 // crbug.com/140910: Many places were calling this with base::Time() as |
350 // delete_end, even though they should've used base::Time::Max(). | 422 // delete_end, even though they should've used base::Time::Max(). |
351 DCHECK_NE(base::Time(), time_range.end); | 423 DCHECK_NE(base::Time(), time_range.end); |
352 | 424 |
353 SetRemoving(true); | |
354 delete_begin_ = time_range.begin; | 425 delete_begin_ = time_range.begin; |
355 delete_end_ = time_range.end; | 426 delete_end_ = time_range.end; |
356 remove_mask_ = remove_mask; | 427 remove_mask_ = remove_mask; |
357 origin_type_mask_ = origin_type_mask; | 428 origin_type_mask_ = origin_type_mask; |
358 | 429 |
359 base::Callback<bool(const GURL& url)> filter = | 430 base::Callback<bool(const GURL& url)> filter = |
360 filter_builder.BuildGeneralFilter(); | 431 filter_builder.BuildGeneralFilter(); |
361 base::Callback<bool(const ContentSettingsPattern& url)> same_pattern_filter = | 432 base::Callback<bool(const ContentSettingsPattern& url)> same_pattern_filter = |
362 filter_builder.BuildWebsiteSettingsPatternMatchesFilter(); | 433 filter_builder.BuildWebsiteSettingsPatternMatchesFilter(); |
363 | 434 |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1042 } | 1113 } |
1043 | 1114 |
1044 int BrowsingDataRemover::GetLastUsedRemovalMask() { | 1115 int BrowsingDataRemover::GetLastUsedRemovalMask() { |
1045 return remove_mask_; | 1116 return remove_mask_; |
1046 } | 1117 } |
1047 | 1118 |
1048 int BrowsingDataRemover::GetLastUsedOriginTypeMask() { | 1119 int BrowsingDataRemover::GetLastUsedOriginTypeMask() { |
1049 return origin_type_mask_; | 1120 return origin_type_mask_; |
1050 } | 1121 } |
1051 | 1122 |
| 1123 BrowsingDataRemover::RemovalTask::RemovalTask( |
| 1124 const TimeRange& time_range, |
| 1125 int remove_mask, |
| 1126 int origin_type_mask, |
| 1127 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, |
| 1128 Observer* observer) |
| 1129 : time_range(time_range), |
| 1130 remove_mask(remove_mask), |
| 1131 origin_type_mask(origin_type_mask), |
| 1132 filter_builder(std::move(filter_builder)), |
| 1133 observer(observer) {} |
| 1134 |
| 1135 BrowsingDataRemover::RemovalTask::~RemovalTask() {} |
1052 | 1136 |
1053 void BrowsingDataRemover::ClearSettingsForOneTypeWithPredicate( | 1137 void BrowsingDataRemover::ClearSettingsForOneTypeWithPredicate( |
1054 HostContentSettingsMap* content_settings_map, | 1138 HostContentSettingsMap* content_settings_map, |
1055 ContentSettingsType content_type, | 1139 ContentSettingsType content_type, |
1056 const base::Callback<bool(const ContentSettingsPattern& primary_pattern, | 1140 const base::Callback<bool(const ContentSettingsPattern& primary_pattern, |
1057 const ContentSettingsPattern& secondary_pattern)>& | 1141 const ContentSettingsPattern& secondary_pattern)>& |
1058 predicate) { | 1142 predicate) { |
1059 ContentSettingsForOneType settings; | 1143 ContentSettingsForOneType settings; |
1060 content_settings_map->GetSettingsForOneType(content_type, std::string(), | 1144 content_settings_map->GetSettingsForOneType(content_type, std::string(), |
1061 &settings); | 1145 &settings); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 // else notifies observers and deletes this BrowsingDataRemover. | 1185 // else notifies observers and deletes this BrowsingDataRemover. |
1102 TemplateURLService* model = | 1186 TemplateURLService* model = |
1103 TemplateURLServiceFactory::GetForProfile(profile_); | 1187 TemplateURLServiceFactory::GetForProfile(profile_); |
1104 model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); | 1188 model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); |
1105 waiting_for_clear_keyword_data_ = false; | 1189 waiting_for_clear_keyword_data_ = false; |
1106 template_url_sub_.reset(); | 1190 template_url_sub_.reset(); |
1107 NotifyIfDone(); | 1191 NotifyIfDone(); |
1108 } | 1192 } |
1109 | 1193 |
1110 void BrowsingDataRemover::Notify() { | 1194 void BrowsingDataRemover::Notify() { |
1111 SetRemoving(false); | 1195 // Some tests call |RemoveImpl| directly, without using the task scheduler. |
1112 FOR_EACH_OBSERVER(Observer, observer_list_, OnBrowsingDataRemoverDone()); | 1196 // TODO(msramek): Improve those tests so we don't have to do this. Tests |
| 1197 // relying on |RemoveImpl| do so because they need to pass in |
| 1198 // BrowsingDataFilterBuilder while still keeping ownership of it. Making |
| 1199 // BrowsingDataFilterBuilder copyable would solve this. |
| 1200 if (!is_removing_) { |
| 1201 DCHECK(task_queue_.empty()); |
| 1202 return; |
| 1203 } |
| 1204 |
| 1205 // Inform the observer of the current task unless it has unregistered |
| 1206 // itself in the meantime. |
| 1207 DCHECK(!task_queue_.empty()); |
| 1208 |
| 1209 if (task_queue_.front().observer != nullptr && |
| 1210 observer_list_.HasObserver(task_queue_.front().observer)) { |
| 1211 task_queue_.front().observer->OnBrowsingDataRemoverDone(); |
| 1212 } |
| 1213 |
| 1214 task_queue_.pop(); |
| 1215 |
| 1216 if (task_queue_.empty()) { |
| 1217 // All removal tasks have finished. Inform the observers that we're idle. |
| 1218 SetRemoving(false); |
| 1219 return; |
| 1220 } |
| 1221 |
| 1222 // Yield to the UI thread before executing the next removal task. |
| 1223 // TODO(msramek): Consider also adding a backoff if too many tasks |
| 1224 // are scheduled. |
| 1225 BrowserThread::PostTask( |
| 1226 BrowserThread::UI, FROM_HERE, |
| 1227 base::Bind(&BrowsingDataRemover::RunNextTask, |
| 1228 weak_ptr_factory_.GetWeakPtr())); |
1113 } | 1229 } |
1114 | 1230 |
1115 void BrowsingDataRemover::NotifyIfDone() { | 1231 void BrowsingDataRemover::NotifyIfDone() { |
1116 // TODO(brettw) http://crbug.com/305259: This should also observe session | 1232 // TODO(brettw) http://crbug.com/305259: This should also observe session |
1117 // clearing (what about other things such as passwords, etc.?) and wait for | 1233 // clearing (what about other things such as passwords, etc.?) and wait for |
1118 // them to complete before continuing. | 1234 // them to complete before continuing. |
1119 | 1235 |
1120 if (!AllDone()) | 1236 if (!AllDone()) |
1121 return; | 1237 return; |
1122 | 1238 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 waiting_for_clear_offline_page_data_ = false; | 1407 waiting_for_clear_offline_page_data_ = false; |
1292 NotifyIfDone(); | 1408 NotifyIfDone(); |
1293 } | 1409 } |
1294 #endif | 1410 #endif |
1295 | 1411 |
1296 void BrowsingDataRemover::OnClearedDomainReliabilityMonitor() { | 1412 void BrowsingDataRemover::OnClearedDomainReliabilityMonitor() { |
1297 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1413 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1298 waiting_for_clear_domain_reliability_monitor_ = false; | 1414 waiting_for_clear_domain_reliability_monitor_ = false; |
1299 NotifyIfDone(); | 1415 NotifyIfDone(); |
1300 } | 1416 } |
OLD | NEW |