| 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 |