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

Side by Side Diff: content/browser/download/download_manager_impl.cc

Issue 1781983002: [Downloads] Introduce GUIDs for downloads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments Created 4 years, 9 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 (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 "content/browser/download/download_manager_impl.h" 5 #include "content/browser/download/download_manager_impl.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 .release()); 99 .release());
100 } 100 }
101 101
102 class DownloadItemFactoryImpl : public DownloadItemFactory { 102 class DownloadItemFactoryImpl : public DownloadItemFactory {
103 public: 103 public:
104 DownloadItemFactoryImpl() {} 104 DownloadItemFactoryImpl() {}
105 ~DownloadItemFactoryImpl() override {} 105 ~DownloadItemFactoryImpl() override {}
106 106
107 DownloadItemImpl* CreatePersistedItem( 107 DownloadItemImpl* CreatePersistedItem(
108 DownloadItemImplDelegate* delegate, 108 DownloadItemImplDelegate* delegate,
109 const std::string& guid,
109 uint32_t download_id, 110 uint32_t download_id,
110 const base::FilePath& current_path, 111 const base::FilePath& current_path,
111 const base::FilePath& target_path, 112 const base::FilePath& target_path,
112 const std::vector<GURL>& url_chain, 113 const std::vector<GURL>& url_chain,
113 const GURL& referrer_url, 114 const GURL& referrer_url,
114 const std::string& mime_type, 115 const std::string& mime_type,
115 const std::string& original_mime_type, 116 const std::string& original_mime_type,
116 const base::Time& start_time, 117 const base::Time& start_time,
117 const base::Time& end_time, 118 const base::Time& end_time,
118 const std::string& etag, 119 const std::string& etag,
119 const std::string& last_modified, 120 const std::string& last_modified,
120 int64_t received_bytes, 121 int64_t received_bytes,
121 int64_t total_bytes, 122 int64_t total_bytes,
122 DownloadItem::DownloadState state, 123 DownloadItem::DownloadState state,
123 DownloadDangerType danger_type, 124 DownloadDangerType danger_type,
124 DownloadInterruptReason interrupt_reason, 125 DownloadInterruptReason interrupt_reason,
125 bool opened, 126 bool opened,
126 const net::BoundNetLog& bound_net_log) override { 127 const net::BoundNetLog& bound_net_log) override {
127 return new DownloadItemImpl( 128 return new DownloadItemImpl(delegate,
128 delegate, 129 guid,
129 download_id, 130 download_id,
130 current_path, 131 current_path,
131 target_path, 132 target_path,
132 url_chain, 133 url_chain,
133 referrer_url, 134 referrer_url,
134 mime_type, 135 mime_type,
135 original_mime_type, 136 original_mime_type,
136 start_time, 137 start_time,
137 end_time, 138 end_time,
138 etag, 139 etag,
139 last_modified, 140 last_modified,
140 received_bytes, 141 received_bytes,
141 total_bytes, 142 total_bytes,
142 state, 143 state,
143 danger_type, 144 danger_type,
144 interrupt_reason, 145 interrupt_reason,
145 opened, 146 opened,
146 bound_net_log); 147 bound_net_log);
147 } 148 }
148 149
149 DownloadItemImpl* CreateActiveItem( 150 DownloadItemImpl* CreateActiveItem(
150 DownloadItemImplDelegate* delegate, 151 DownloadItemImplDelegate* delegate,
151 uint32_t download_id, 152 uint32_t download_id,
152 const DownloadCreateInfo& info, 153 const DownloadCreateInfo& info,
153 const net::BoundNetLog& bound_net_log) override { 154 const net::BoundNetLog& bound_net_log) override {
154 return new DownloadItemImpl(delegate, download_id, info, bound_net_log); 155 return new DownloadItemImpl(delegate, download_id, info, bound_net_log);
155 } 156 }
156 157
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 DownloadItemImpl* DownloadManagerImpl::CreateActiveItem( 191 DownloadItemImpl* DownloadManagerImpl::CreateActiveItem(
191 uint32_t id, 192 uint32_t id,
192 const DownloadCreateInfo& info) { 193 const DownloadCreateInfo& info) {
193 DCHECK_CURRENTLY_ON(BrowserThread::UI); 194 DCHECK_CURRENTLY_ON(BrowserThread::UI);
194 DCHECK(!ContainsKey(downloads_, id)); 195 DCHECK(!ContainsKey(downloads_, id));
195 net::BoundNetLog bound_net_log = 196 net::BoundNetLog bound_net_log =
196 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); 197 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
197 DownloadItemImpl* download = 198 DownloadItemImpl* download =
198 item_factory_->CreateActiveItem(this, id, info, bound_net_log); 199 item_factory_->CreateActiveItem(this, id, info, bound_net_log);
199 downloads_[id] = download; 200 downloads_[id] = download;
201 downloads_by_guid_[download->GetGuid()] = download;
200 return download; 202 return download;
201 } 203 }
202 204
203 void DownloadManagerImpl::GetNextId(const DownloadIdCallback& callback) { 205 void DownloadManagerImpl::GetNextId(const DownloadIdCallback& callback) {
204 DCHECK_CURRENTLY_ON(BrowserThread::UI); 206 DCHECK_CURRENTLY_ON(BrowserThread::UI);
205 if (delegate_) { 207 if (delegate_) {
206 delegate_->GetNextId(callback); 208 delegate_->GetNextId(callback);
207 return; 209 return;
208 } 210 }
209 static uint32_t next_id = content::DownloadItem::kInvalidId + 1; 211 static uint32_t next_id = content::DownloadItem::kInvalidId + 1;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 // If there are in-progress downloads, cancel them. This also goes for 280 // If there are in-progress downloads, cancel them. This also goes for
279 // dangerous downloads which will remain in history if they aren't explicitly 281 // dangerous downloads which will remain in history if they aren't explicitly
280 // accepted or discarded. Canceling will remove the intermediate download 282 // accepted or discarded. Canceling will remove the intermediate download
281 // file. 283 // file.
282 for (const auto& it : downloads_) { 284 for (const auto& it : downloads_) {
283 DownloadItemImpl* download = it.second; 285 DownloadItemImpl* download = it.second;
284 if (download->GetState() == DownloadItem::IN_PROGRESS) 286 if (download->GetState() == DownloadItem::IN_PROGRESS)
285 download->Cancel(false); 287 download->Cancel(false);
286 } 288 }
287 STLDeleteValues(&downloads_); 289 STLDeleteValues(&downloads_);
290 downloads_by_guid_.clear();
288 url_downloaders_.clear(); 291 url_downloaders_.clear();
289 292
290 // We'll have nothing more to report to the observers after this point. 293 // We'll have nothing more to report to the observers after this point.
291 observers_.Clear(); 294 observers_.Clear();
292 295
293 if (delegate_) 296 if (delegate_)
294 delegate_->Shutdown(); 297 delegate_->Shutdown();
295 delegate_ = NULL; 298 delegate_ = NULL;
296 } 299 }
297 300
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 uint32_t id) { 446 uint32_t id) {
444 DCHECK_CURRENTLY_ON(BrowserThread::UI); 447 DCHECK_CURRENTLY_ON(BrowserThread::UI);
445 DCHECK_NE(content::DownloadItem::kInvalidId, id); 448 DCHECK_NE(content::DownloadItem::kInvalidId, id);
446 DCHECK(!ContainsKey(downloads_, id)); 449 DCHECK(!ContainsKey(downloads_, id));
447 net::BoundNetLog bound_net_log = 450 net::BoundNetLog bound_net_log =
448 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); 451 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
449 DownloadItemImpl* download_item = item_factory_->CreateSavePageItem( 452 DownloadItemImpl* download_item = item_factory_->CreateSavePageItem(
450 this, id, main_file_path, page_url, mime_type, std::move(request_handle), 453 this, id, main_file_path, page_url, mime_type, std::move(request_handle),
451 bound_net_log); 454 bound_net_log);
452 downloads_[download_item->GetId()] = download_item; 455 downloads_[download_item->GetId()] = download_item;
456 DCHECK(!ContainsKey(downloads_by_guid_, download_item->GetGuid()));
457 downloads_by_guid_[download_item->GetGuid()] = download_item;
453 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated( 458 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(
454 this, download_item)); 459 this, download_item));
455 if (!item_created.is_null()) 460 if (!item_created.is_null())
456 item_created.Run(download_item); 461 item_created.Run(download_item);
457 } 462 }
458 463
459 void DownloadManagerImpl::OnSavePackageSuccessfullyFinished( 464 void DownloadManagerImpl::OnSavePackageSuccessfullyFinished(
460 DownloadItem* download_item) { 465 DownloadItem* download_item) {
461 FOR_EACH_OBSERVER(Observer, observers_, 466 FOR_EACH_OBSERVER(Observer, observers_,
462 OnSavePackageSuccessfullyFinished(this, download_item)); 467 OnSavePackageSuccessfullyFinished(this, download_item));
(...skipping 25 matching lines...) Expand all
488 } 493 }
489 494
490 DownloadFileFactory* DownloadManagerImpl::GetDownloadFileFactoryForTesting() { 495 DownloadFileFactory* DownloadManagerImpl::GetDownloadFileFactoryForTesting() {
491 return file_factory_.get(); 496 return file_factory_.get();
492 } 497 }
493 498
494 void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) { 499 void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) {
495 if (!download) 500 if (!download)
496 return; 501 return;
497 502
503 downloads_by_guid_.erase(download->GetGuid());
504
498 uint32_t download_id = download->GetId(); 505 uint32_t download_id = download->GetId();
499 if (downloads_.erase(download_id) == 0) 506 if (downloads_.erase(download_id) == 0)
500 return; 507 return;
501 delete download; 508 delete download;
502 } 509 }
503 510
504 void DownloadManagerImpl::AddUrlDownloader( 511 void DownloadManagerImpl::AddUrlDownloader(
505 scoped_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> downloader) { 512 scoped_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> downloader) {
506 if (downloader) 513 if (downloader)
507 url_downloaders_.push_back(std::move(downloader)); 514 url_downloaders_.push_back(std::move(downloader));
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 596
590 void DownloadManagerImpl::AddObserver(Observer* observer) { 597 void DownloadManagerImpl::AddObserver(Observer* observer) {
591 observers_.AddObserver(observer); 598 observers_.AddObserver(observer);
592 } 599 }
593 600
594 void DownloadManagerImpl::RemoveObserver(Observer* observer) { 601 void DownloadManagerImpl::RemoveObserver(Observer* observer) {
595 observers_.RemoveObserver(observer); 602 observers_.RemoveObserver(observer);
596 } 603 }
597 604
598 DownloadItem* DownloadManagerImpl::CreateDownloadItem( 605 DownloadItem* DownloadManagerImpl::CreateDownloadItem(
606 const std::string& guid,
599 uint32_t id, 607 uint32_t id,
600 const base::FilePath& current_path, 608 const base::FilePath& current_path,
601 const base::FilePath& target_path, 609 const base::FilePath& target_path,
602 const std::vector<GURL>& url_chain, 610 const std::vector<GURL>& url_chain,
603 const GURL& referrer_url, 611 const GURL& referrer_url,
604 const std::string& mime_type, 612 const std::string& mime_type,
605 const std::string& original_mime_type, 613 const std::string& original_mime_type,
606 const base::Time& start_time, 614 const base::Time& start_time,
607 const base::Time& end_time, 615 const base::Time& end_time,
608 const std::string& etag, 616 const std::string& etag,
609 const std::string& last_modified, 617 const std::string& last_modified,
610 int64_t received_bytes, 618 int64_t received_bytes,
611 int64_t total_bytes, 619 int64_t total_bytes,
612 DownloadItem::DownloadState state, 620 DownloadItem::DownloadState state,
613 DownloadDangerType danger_type, 621 DownloadDangerType danger_type,
614 DownloadInterruptReason interrupt_reason, 622 DownloadInterruptReason interrupt_reason,
615 bool opened) { 623 bool opened) {
616 if (ContainsKey(downloads_, id)) { 624 if (ContainsKey(downloads_, id)) {
617 NOTREACHED(); 625 NOTREACHED();
618 return NULL; 626 return NULL;
619 } 627 }
628 DCHECK(!ContainsKey(downloads_by_guid_, guid));
620 DownloadItemImpl* item = item_factory_->CreatePersistedItem( 629 DownloadItemImpl* item = item_factory_->CreatePersistedItem(
621 this, 630 this,
631 guid,
622 id, 632 id,
623 current_path, 633 current_path,
624 target_path, 634 target_path,
625 url_chain, 635 url_chain,
626 referrer_url, 636 referrer_url,
627 mime_type, 637 mime_type,
628 original_mime_type, 638 original_mime_type,
629 start_time, 639 start_time,
630 end_time, 640 end_time,
631 etag, 641 etag,
632 last_modified, 642 last_modified,
633 received_bytes, 643 received_bytes,
634 total_bytes, 644 total_bytes,
635 state, 645 state,
636 danger_type, 646 danger_type,
637 interrupt_reason, 647 interrupt_reason,
638 opened, 648 opened,
639 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD)); 649 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD));
640 downloads_[id] = item; 650 downloads_[id] = item;
651 downloads_by_guid_[guid] = item;
641 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, item)); 652 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, item));
642 DVLOG(20) << __FUNCTION__ << "() download = " << item->DebugString(true); 653 DVLOG(20) << __FUNCTION__ << "() download = " << item->DebugString(true);
643 return item; 654 return item;
644 } 655 }
645 656
646 int DownloadManagerImpl::InProgressCount() const { 657 int DownloadManagerImpl::InProgressCount() const {
647 int count = 0; 658 int count = 0;
648 for (const auto& it : downloads_) { 659 for (const auto& it : downloads_) {
649 if (it.second->GetState() == DownloadItem::IN_PROGRESS) 660 if (it.second->GetState() == DownloadItem::IN_PROGRESS)
650 ++count; 661 ++count;
(...skipping 10 matching lines...) Expand all
661 it.second->GetDangerType() != DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST && 672 it.second->GetDangerType() != DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST &&
662 it.second->GetDangerType() != 673 it.second->GetDangerType() !=
663 DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED) { 674 DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED) {
664 ++count; 675 ++count;
665 } 676 }
666 } 677 }
667 return count; 678 return count;
668 } 679 }
669 680
670 DownloadItem* DownloadManagerImpl::GetDownload(uint32_t download_id) { 681 DownloadItem* DownloadManagerImpl::GetDownload(uint32_t download_id) {
671 return ContainsKey(downloads_, download_id) ? downloads_[download_id] : NULL; 682 return ContainsKey(downloads_, download_id) ? downloads_[download_id]
683 : nullptr;
684 }
685
686 DownloadItem* DownloadManagerImpl::GetDownloadByGuid(const std::string& guid) {
687 DCHECK(guid == base::ToUpperASCII(guid));
688 return ContainsKey(downloads_by_guid_, guid) ? downloads_by_guid_[guid]
689 : nullptr;
672 } 690 }
673 691
674 void DownloadManagerImpl::GetAllDownloads(DownloadVector* downloads) { 692 void DownloadManagerImpl::GetAllDownloads(DownloadVector* downloads) {
675 for (const auto& it : downloads_) { 693 for (const auto& it : downloads_) {
676 downloads->push_back(it.second); 694 downloads->push_back(it.second);
677 } 695 }
678 } 696 }
679 697
680 void DownloadManagerImpl::OpenDownload(DownloadItemImpl* download) { 698 void DownloadManagerImpl::OpenDownload(DownloadItemImpl* download) {
681 int num_unopened = 0; 699 int num_unopened = 0;
682 for (const auto& it : downloads_) { 700 for (const auto& it : downloads_) {
683 DownloadItemImpl* item = it.second; 701 DownloadItemImpl* item = it.second;
684 if ((item->GetState() == DownloadItem::COMPLETE) && 702 if ((item->GetState() == DownloadItem::COMPLETE) &&
685 !item->GetOpened()) 703 !item->GetOpened())
686 ++num_unopened; 704 ++num_unopened;
687 } 705 }
688 RecordOpensOutstanding(num_unopened); 706 RecordOpensOutstanding(num_unopened);
689 707
690 if (delegate_) 708 if (delegate_)
691 delegate_->OpenDownload(download); 709 delegate_->OpenDownload(download);
692 } 710 }
693 711
694 void DownloadManagerImpl::ShowDownloadInShell(DownloadItemImpl* download) { 712 void DownloadManagerImpl::ShowDownloadInShell(DownloadItemImpl* download) {
695 if (delegate_) 713 if (delegate_)
696 delegate_->ShowDownloadInShell(download); 714 delegate_->ShowDownloadInShell(download);
697 } 715 }
698 716
699 } // namespace content 717 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/download/download_manager_impl.h ('k') | content/browser/download/download_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698