OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/safe_browsing/incident_reporting/download_metadata_mana
ger.h" | 5 #include "chrome/browser/safe_browsing/incident_reporting/download_metadata_mana
ger.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 write_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( | 286 write_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( |
287 token, base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | 287 token, base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
288 } | 288 } |
289 | 289 |
290 DownloadMetadataManager::DownloadMetadataManager( | 290 DownloadMetadataManager::DownloadMetadataManager( |
291 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 291 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
292 : read_runner_(task_runner), write_runner_(task_runner) { | 292 : read_runner_(task_runner), write_runner_(task_runner) { |
293 } | 293 } |
294 | 294 |
295 DownloadMetadataManager::~DownloadMetadataManager() { | 295 DownloadMetadataManager::~DownloadMetadataManager() { |
296 // All download managers must have gone down prior to this. | 296 // Destruction may have taken place before managers have gone down. |
297 DCHECK(contexts_.empty()); | 297 for (const auto& value : contexts_) { |
| 298 value.first->RemoveObserver(this); |
| 299 value.second->Detach(); |
| 300 } |
| 301 contexts_.clear(); |
298 } | 302 } |
299 | 303 |
300 void DownloadMetadataManager::AddDownloadManager( | 304 void DownloadMetadataManager::AddDownloadManager( |
301 content::DownloadManager* download_manager) { | 305 content::DownloadManager* download_manager) { |
302 DCHECK_EQ(contexts_.count(download_manager), 0U); | 306 DCHECK_EQ(contexts_.count(download_manager), 0U); |
303 download_manager->AddObserver(this); | 307 download_manager->AddObserver(this); |
304 contexts_[download_manager] = | 308 contexts_[download_manager] = |
305 new ManagerContext(read_runner_, write_runner_, download_manager); | 309 new ManagerContext(read_runner_, write_runner_, download_manager); |
306 } | 310 } |
307 | 311 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 else | 502 else |
499 iter->second.item = nullptr; | 503 iter->second.item = nullptr; |
500 } else if (item_) { | 504 } else if (item_) { |
501 // This item is no longer being observed. | 505 // This item is no longer being observed. |
502 DCHECK_EQ(item_, download); | 506 DCHECK_EQ(item_, download); |
503 item_ = nullptr; | 507 item_ = nullptr; |
504 } | 508 } |
505 } | 509 } |
506 | 510 |
507 DownloadMetadataManager::ManagerContext::~ManagerContext() { | 511 DownloadMetadataManager::ManagerContext::~ManagerContext() { |
508 // All downloads must have been destroyed prior to deleting the context and | 512 // A context should not be deleted while waiting for a load to complete. |
509 // all recorded operations and callbacks must have been handled. | |
510 DCHECK(pending_items_.empty()); | 513 DCHECK(pending_items_.empty()); |
511 DCHECK_EQ(item_, static_cast<content::DownloadItem*>(nullptr)); | |
512 DCHECK(get_details_callbacks_.empty()); | 514 DCHECK(get_details_callbacks_.empty()); |
| 515 |
| 516 // The context may have detached while still observing the item of interest |
| 517 // since a DownloadManager announces that it's going down before it destroyes |
| 518 // its items. |
| 519 if (item_) { |
| 520 item_->RemoveObserver(this); |
| 521 item_ = nullptr; |
| 522 } |
513 } | 523 } |
514 | 524 |
515 void DownloadMetadataManager::ManagerContext::ClearPendingItems() { | 525 void DownloadMetadataManager::ManagerContext::ClearPendingItems() { |
516 for (const auto& value : pending_items_) { | 526 for (const auto& value : pending_items_) { |
517 if (value.second.item) | 527 if (value.second.item) |
518 value.second.item->RemoveObserver(this); | 528 value.second.item->RemoveObserver(this); |
519 } | 529 } |
520 pending_items_.clear(); | 530 pending_items_.clear(); |
521 } | 531 } |
522 | 532 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 | 615 |
606 void DownloadMetadataManager::ManagerContext::WriteMetadata() { | 616 void DownloadMetadataManager::ManagerContext::WriteMetadata() { |
607 write_runner_->PostTask( | 617 write_runner_->PostTask( |
608 FROM_HERE, | 618 FROM_HERE, |
609 base::Bind(&WriteMetadataOnWorkerPool, | 619 base::Bind(&WriteMetadataOnWorkerPool, |
610 metadata_path_, | 620 metadata_path_, |
611 base::Owned(new DownloadMetadata(*download_metadata_)))); | 621 base::Owned(new DownloadMetadata(*download_metadata_)))); |
612 } | 622 } |
613 | 623 |
614 } // namespace safe_browsing | 624 } // namespace safe_browsing |
OLD | NEW |