Chromium Code Reviews| 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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 245 domain_predicate, delete_begin, delete_end, | 245 domain_predicate, delete_begin, delete_end, |
| 246 base::Bind(&OnClearedChannelIDsOnIOThread, | 246 base::Bind(&OnClearedChannelIDsOnIOThread, |
| 247 base::RetainedRef(std::move(rq_context)), callback)); | 247 base::RetainedRef(std::move(rq_context)), callback)); |
| 248 } | 248 } |
| 249 | 249 |
| 250 } // namespace | 250 } // namespace |
| 251 | 251 |
| 252 BrowsingDataRemover::CompletionInhibitor* | 252 BrowsingDataRemover::CompletionInhibitor* |
| 253 BrowsingDataRemover::completion_inhibitor_ = nullptr; | 253 BrowsingDataRemover::completion_inhibitor_ = nullptr; |
| 254 | 254 |
| 255 BrowsingDataRemover::RemovalTask::RemovalTask( | |
| 256 const TimeRange& time_range, | |
| 257 int remove_mask, | |
| 258 int origin_type_mask, | |
| 259 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
| 260 Observer* observer) | |
| 261 : time_range(time_range), | |
| 262 remove_mask(remove_mask), | |
| 263 origin_type_mask(origin_type_mask), | |
| 264 filter_builder(std::move(filter_builder)), | |
| 265 observer(observer) {} | |
| 266 | |
| 267 BrowsingDataRemover::RemovalTask::~RemovalTask() {} | |
| 268 | |
| 269 BrowsingDataRemover::RemovalTask::RemovalTask( | |
| 270 RemovalTask&& removalTask) = default; | |
| 271 BrowsingDataRemover::RemovalTask& BrowsingDataRemover::RemovalTask::operator=( | |
| 272 RemovalTask&& removalTask) = default; | |
| 273 | |
| 255 bool BrowsingDataRemover::TimeRange::operator==( | 274 bool BrowsingDataRemover::TimeRange::operator==( |
| 256 const BrowsingDataRemover::TimeRange& other) const { | 275 const BrowsingDataRemover::TimeRange& other) const { |
| 257 return begin == other.begin && end == other.end; | 276 return begin == other.begin && end == other.end; |
| 258 } | 277 } |
| 259 | 278 |
| 260 // static | 279 // static |
| 261 BrowsingDataRemover::TimeRange BrowsingDataRemover::Unbounded() { | 280 BrowsingDataRemover::TimeRange BrowsingDataRemover::Unbounded() { |
| 262 return TimeRange(base::Time(), base::Time::Max()); | 281 return TimeRange(base::Time(), base::Time::Max()); |
| 263 } | 282 } |
| 264 | 283 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 290 : profile_(Profile::FromBrowserContext(browser_context)), | 309 : profile_(Profile::FromBrowserContext(browser_context)), |
| 291 is_removing_(false), | 310 is_removing_(false), |
| 292 #if BUILDFLAG(ANDROID_JAVA_UI) | 311 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 293 webapp_registry_(new WebappRegistry()), | 312 webapp_registry_(new WebappRegistry()), |
| 294 #endif | 313 #endif |
| 295 weak_ptr_factory_(this) { | 314 weak_ptr_factory_(this) { |
| 296 DCHECK(browser_context); | 315 DCHECK(browser_context); |
| 297 } | 316 } |
| 298 | 317 |
| 299 BrowsingDataRemover::~BrowsingDataRemover() { | 318 BrowsingDataRemover::~BrowsingDataRemover() { |
| 300 // If we are still removing data, notify observers so they can remove | 319 if (!task_queue_.empty()) { |
| 301 // themselves from the observer list. | 320 VLOG(1) << "BrowsingDataRemover shuts down with " << task_queue_.size() |
| 321 << " pending tasks"; | |
| 322 } | |
| 323 | |
| 324 // If we are still removing data, notify observers that their task has been | |
| 325 // (albeit unsucessfuly) processed, so they can unregister themselves. | |
| 302 // TODO(bauerb): If it becomes a problem that browsing data might not actually | 326 // TODO(bauerb): If it becomes a problem that browsing data might not actually |
| 303 // be fully cleared when an observer is notified, add a success flag. | 327 // be fully cleared when an observer is notified, add a success flag. |
| 304 if (is_removing_) | 328 while (!task_queue_.empty()) { |
| 305 Notify(); | 329 if (observer_list_.HasObserver(task_queue_.front().observer)) |
| 330 task_queue_.front().observer->OnBrowsingDataRemoverDone(); | |
| 331 task_queue_.pop(); | |
| 332 } | |
| 306 } | 333 } |
| 307 | 334 |
| 308 void BrowsingDataRemover::Shutdown() { | 335 void BrowsingDataRemover::Shutdown() { |
| 309 history_task_tracker_.TryCancelAll(); | 336 history_task_tracker_.TryCancelAll(); |
| 310 template_url_sub_.reset(); | 337 template_url_sub_.reset(); |
| 311 } | 338 } |
| 312 | 339 |
| 313 void BrowsingDataRemover::SetRemoving(bool is_removing) { | 340 void BrowsingDataRemover::SetRemoving(bool is_removing) { |
| 314 DCHECK_NE(is_removing_, is_removing); | 341 DCHECK_NE(is_removing_, is_removing); |
| 315 is_removing_ = is_removing; | 342 is_removing_ = is_removing; |
| 316 FOR_EACH_OBSERVER(Observer, observer_list_, | 343 FOR_EACH_OBSERVER(Observer, observer_list_, |
| 317 OnBrowsingDataRemoving(is_removing)); | 344 OnBrowsingDataRemoving(is_removing)); |
| 318 } | 345 } |
| 319 | 346 |
| 320 void BrowsingDataRemover::Remove(const TimeRange& time_range, | 347 void BrowsingDataRemover::Remove(const TimeRange& time_range, |
| 321 int remove_mask, | 348 int remove_mask, |
| 322 int origin_type_mask) { | 349 int origin_type_mask) { |
| 350 RemoveAndReply(time_range, remove_mask, origin_type_mask, nullptr); | |
| 351 } | |
| 352 | |
| 353 void BrowsingDataRemover::RemoveAndReply( | |
| 354 const TimeRange& time_range, | |
| 355 int remove_mask, | |
| 356 int origin_type_mask, | |
| 357 Observer* observer) { | |
| 323 // Any instance of BrowsingDataFilterBuilder that |IsEmptyBlacklist()| | 358 // Any instance of BrowsingDataFilterBuilder that |IsEmptyBlacklist()| |
| 324 // is OK to pass here. | 359 // is OK to pass here. |
| 325 RegistrableDomainFilterBuilder builder( | 360 std::unique_ptr<RegistrableDomainFilterBuilder> filter_builder = |
| 326 RegistrableDomainFilterBuilder::BLACKLIST); | 361 base::WrapUnique(new RegistrableDomainFilterBuilder( |
| 327 DCHECK(builder.IsEmptyBlacklist()); | 362 RegistrableDomainFilterBuilder::BLACKLIST)); |
| 328 RemoveImpl(time_range, remove_mask, builder, origin_type_mask); | 363 DCHECK(filter_builder->IsEmptyBlacklist()); |
| 364 RemoveWithFilterAndReply(time_range, remove_mask, origin_type_mask, | |
| 365 std::move(filter_builder), observer); | |
| 329 } | 366 } |
| 330 | 367 |
| 331 void BrowsingDataRemover::RemoveWithFilter( | 368 void BrowsingDataRemover::RemoveWithFilter( |
| 332 const TimeRange& time_range, | 369 const TimeRange& time_range, |
| 333 int remove_mask, | 370 int remove_mask, |
| 334 int origin_type_mask, | 371 int origin_type_mask, |
| 335 const BrowsingDataFilterBuilder& filter_builder) { | 372 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) { |
| 336 RemoveImpl(time_range, remove_mask, filter_builder, origin_type_mask); | 373 RemoveWithFilterAndReply(time_range, remove_mask, origin_type_mask, |
| 374 std::move(filter_builder), nullptr); | |
| 375 } | |
| 376 | |
| 377 void BrowsingDataRemover::RemoveWithFilterAndReply( | |
| 378 const TimeRange& time_range, | |
| 379 int remove_mask, | |
| 380 int origin_type_mask, | |
| 381 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
| 382 Observer* observer) { | |
| 383 DCHECK(!observer || observer_list_.HasObserver(observer)) | |
|
Bernhard Bauer
2016/07/26 14:51:38
If you allow the |observer| to be null, do you eve
msramek
2016/07/28 09:57:42
All methods can be reduced to the last one, as dem
Bernhard Bauer
2016/08/03 16:42:46
Hm, could we make one method that takes no observe
msramek
2016/08/03 21:16:44
Yep, that makes more sense actually. Done.
| |
| 384 << "Every observer must register itself (by calling AddObserver()) " | |
| 385 << "before observing a removal task."; | |
| 386 | |
| 387 task_queue_.push(RemovalTask( | |
|
Bernhard Bauer
2016/07/26 14:51:38
You could use emplace() for that.
msramek
2016/07/28 09:57:42
Done. Nice :)
| |
| 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); | |
| 337 } | 411 } |
| 338 | 412 |
| 339 void BrowsingDataRemover::RemoveImpl( | 413 void BrowsingDataRemover::RemoveImpl( |
| 340 const TimeRange& time_range, | 414 const TimeRange& time_range, |
| 341 int remove_mask, | 415 int remove_mask, |
| 342 const BrowsingDataFilterBuilder& filter_builder, | 416 const BrowsingDataFilterBuilder& filter_builder, |
| 343 int origin_type_mask) { | 417 int origin_type_mask) { |
| 344 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 418 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 345 waiting_for_synchronous_clear_operations_ = true; | 419 waiting_for_synchronous_clear_operations_ = true; |
| 346 | 420 |
| 347 // 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 |
| 348 // delete_end, even though they should've used base::Time::Max(). | 422 // delete_end, even though they should've used base::Time::Max(). |
| 349 DCHECK_NE(base::Time(), time_range.end); | 423 DCHECK_NE(base::Time(), time_range.end); |
| 350 | 424 |
| 351 SetRemoving(true); | |
| 352 delete_begin_ = time_range.begin; | 425 delete_begin_ = time_range.begin; |
| 353 delete_end_ = time_range.end; | 426 delete_end_ = time_range.end; |
| 354 remove_mask_ = remove_mask; | 427 remove_mask_ = remove_mask; |
| 355 origin_type_mask_ = origin_type_mask; | 428 origin_type_mask_ = origin_type_mask; |
| 356 | 429 |
| 357 base::Callback<bool(const GURL& url)> filter = | 430 base::Callback<bool(const GURL& url)> filter = |
| 358 filter_builder.BuildGeneralFilter(); | 431 filter_builder.BuildGeneralFilter(); |
| 359 base::Callback<bool(const ContentSettingsPattern& url)> same_pattern_filter = | 432 base::Callback<bool(const ContentSettingsPattern& url)> same_pattern_filter = |
| 360 filter_builder.BuildWebsiteSettingsPatternMatchesFilter(); | 433 filter_builder.BuildWebsiteSettingsPatternMatchesFilter(); |
| 361 | 434 |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1099 // else notifies observers and deletes this BrowsingDataRemover. | 1172 // else notifies observers and deletes this BrowsingDataRemover. |
| 1100 TemplateURLService* model = | 1173 TemplateURLService* model = |
| 1101 TemplateURLServiceFactory::GetForProfile(profile_); | 1174 TemplateURLServiceFactory::GetForProfile(profile_); |
| 1102 model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); | 1175 model->RemoveAutoGeneratedBetween(delete_begin_, delete_end_); |
| 1103 waiting_for_clear_keyword_data_ = false; | 1176 waiting_for_clear_keyword_data_ = false; |
| 1104 template_url_sub_.reset(); | 1177 template_url_sub_.reset(); |
| 1105 NotifyIfDone(); | 1178 NotifyIfDone(); |
| 1106 } | 1179 } |
| 1107 | 1180 |
| 1108 void BrowsingDataRemover::Notify() { | 1181 void BrowsingDataRemover::Notify() { |
| 1109 SetRemoving(false); | 1182 // Some tests call |RemoveImpl| directly, without using the task scheduler. |
| 1110 FOR_EACH_OBSERVER(Observer, observer_list_, OnBrowsingDataRemoverDone()); | 1183 // TODO(msramek): Improve those tests so we don't have to do this. Tests |
| 1184 // relying on |RemoveImpl| do so because they need to pass in | |
| 1185 // BrowsingDataFilterBuilder while still keeping ownership of it. Making | |
| 1186 // BrowsingDataFilterBuilder copyable would solve this. | |
| 1187 if (!is_removing_) { | |
| 1188 DCHECK(task_queue_.empty()); | |
| 1189 return; | |
| 1190 } | |
| 1191 | |
| 1192 // Inform the observer of the current task unless it has unregistered | |
| 1193 // itself in the meantime. | |
| 1194 DCHECK(!task_queue_.empty()); | |
| 1195 | |
| 1196 if (task_queue_.front().observer != nullptr && | |
| 1197 observer_list_.HasObserver(task_queue_.front().observer)) { | |
| 1198 task_queue_.front().observer->OnBrowsingDataRemoverDone(); | |
| 1199 } | |
| 1200 | |
| 1201 task_queue_.pop(); | |
| 1202 | |
| 1203 if (task_queue_.empty()) { | |
| 1204 // All removal tasks have finished. Inform the observers that we're idle. | |
| 1205 SetRemoving(false); | |
| 1206 return; | |
| 1207 } | |
| 1208 | |
| 1209 // Yield to the UI thread before executing the next removal task. | |
| 1210 // TODO(msramek): Consider also adding a backoff if too many tasks | |
| 1211 // are scheduled. | |
| 1212 BrowserThread::PostTask( | |
| 1213 BrowserThread::UI, FROM_HERE, | |
| 1214 base::Bind(&BrowsingDataRemover::RunNextTask, | |
| 1215 weak_ptr_factory_.GetWeakPtr())); | |
| 1111 } | 1216 } |
| 1112 | 1217 |
| 1113 void BrowsingDataRemover::NotifyIfDone() { | 1218 void BrowsingDataRemover::NotifyIfDone() { |
| 1114 // TODO(brettw) http://crbug.com/305259: This should also observe session | 1219 // TODO(brettw) http://crbug.com/305259: This should also observe session |
| 1115 // clearing (what about other things such as passwords, etc.?) and wait for | 1220 // clearing (what about other things such as passwords, etc.?) and wait for |
| 1116 // them to complete before continuing. | 1221 // them to complete before continuing. |
| 1117 | 1222 |
| 1118 if (!AllDone()) | 1223 if (!AllDone()) |
| 1119 return; | 1224 return; |
| 1120 | 1225 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1289 waiting_for_clear_offline_page_data_ = false; | 1394 waiting_for_clear_offline_page_data_ = false; |
| 1290 NotifyIfDone(); | 1395 NotifyIfDone(); |
| 1291 } | 1396 } |
| 1292 #endif | 1397 #endif |
| 1293 | 1398 |
| 1294 void BrowsingDataRemover::OnClearedDomainReliabilityMonitor() { | 1399 void BrowsingDataRemover::OnClearedDomainReliabilityMonitor() { |
| 1295 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1400 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1296 waiting_for_clear_domain_reliability_monitor_ = false; | 1401 waiting_for_clear_domain_reliability_monitor_ = false; |
| 1297 NotifyIfDone(); | 1402 NotifyIfDone(); |
| 1298 } | 1403 } |
| OLD | NEW |