1 // Copyright 2020 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h" 6 7 #include <vector> 8 9 #include "chrome/browser/profiles/profile.h" 10 #include "content/public/browser/browser_context.h" 11 12 namespace ash { 13 14 namespace { 15 16 content::DownloadManager* download_manager_for_testing = nullptr; 17 18 } // namespace 19 20 // HoldingSpaceDownloadsDelegate ----------------------------------------------- 21 HoldingSpaceDownloadsDelegate(Profile * profile,HoldingSpaceModel * model,ItemDownloadedCallback item_downloaded_callback)22HoldingSpaceDownloadsDelegate::HoldingSpaceDownloadsDelegate( 23 Profile* profile, 24 HoldingSpaceModel* model, 25 ItemDownloadedCallback item_downloaded_callback) 26 : HoldingSpaceKeyedServiceDelegate(profile, model), 27 item_downloaded_callback_(item_downloaded_callback) {} 28 29 HoldingSpaceDownloadsDelegate::~HoldingSpaceDownloadsDelegate() = default; 30 31 // static SetDownloadManagerForTesting(content::DownloadManager * download_manager)32void HoldingSpaceDownloadsDelegate::SetDownloadManagerForTesting( 33 content::DownloadManager* download_manager) { 34 download_manager_for_testing = download_manager; 35 } 36 Init()37void HoldingSpaceDownloadsDelegate::Init() { 38 download_manager_observer_.Add( 39 download_manager_for_testing 40 ? download_manager_for_testing 41 : content::BrowserContext::GetDownloadManager(profile())); 42 } 43 Shutdown()44void HoldingSpaceDownloadsDelegate::Shutdown() { 45 RemoveObservers(); 46 } 47 OnPersistenceRestored()48void HoldingSpaceDownloadsDelegate::OnPersistenceRestored() { 49 content::DownloadManager* download_manager = 50 download_manager_for_testing 51 ? download_manager_for_testing 52 : content::BrowserContext::GetDownloadManager(profile()); 53 54 if (download_manager->IsManagerInitialized()) 55 OnManagerInitialized(); 56 } 57 OnManagerInitialized()58void HoldingSpaceDownloadsDelegate::OnManagerInitialized() { 59 if (is_restoring_persistence()) 60 return; 61 62 content::DownloadManager* download_manager = 63 download_manager_for_testing 64 ? download_manager_for_testing 65 : content::BrowserContext::GetDownloadManager(profile()); 66 67 DCHECK(download_manager->IsManagerInitialized()); 68 69 download::SimpleDownloadManager::DownloadVector downloads; 70 download_manager->GetAllDownloads(&downloads); 71 72 for (auto* download : downloads) { 73 switch (download->GetState()) { 74 case download::DownloadItem::IN_PROGRESS: 75 download_item_observer_.Add(download); 76 break; 77 case download::DownloadItem::COMPLETE: 78 case download::DownloadItem::CANCELLED: 79 case download::DownloadItem::INTERRUPTED: 80 case download::DownloadItem::MAX_DOWNLOAD_STATE: 81 break; 82 } 83 } 84 } 85 ManagerGoingDown(content::DownloadManager * manager)86void HoldingSpaceDownloadsDelegate::ManagerGoingDown( 87 content::DownloadManager* manager) { 88 RemoveObservers(); 89 } 90 OnDownloadCreated(content::DownloadManager * manager,download::DownloadItem * item)91void HoldingSpaceDownloadsDelegate::OnDownloadCreated( 92 content::DownloadManager* manager, 93 download::DownloadItem* item) { 94 // Ignore `OnDownloadCreated()` events prior to `manager` initialization. For 95 // those events we bind any observers necessary in `OnManagerInitialized()`. 96 if (!is_restoring_persistence() && manager->IsManagerInitialized()) 97 download_item_observer_.Add(item); 98 } 99 OnDownloadUpdated(download::DownloadItem * item)100void HoldingSpaceDownloadsDelegate::OnDownloadUpdated( 101 download::DownloadItem* item) { 102 switch (item->GetState()) { 103 case download::DownloadItem::COMPLETE: 104 OnDownloadCompleted(item->GetFullPath()); 105 FALLTHROUGH; 106 case download::DownloadItem::CANCELLED: 107 case download::DownloadItem::INTERRUPTED: 108 download_item_observer_.Remove(item); 109 break; 110 case download::DownloadItem::IN_PROGRESS: 111 case download::DownloadItem::MAX_DOWNLOAD_STATE: 112 break; 113 } 114 } 115 OnDownloadCompleted(const base::FilePath & file_path)116void HoldingSpaceDownloadsDelegate::OnDownloadCompleted( 117 const base::FilePath& file_path) { 118 if (!is_restoring_persistence()) 119 item_downloaded_callback_.Run(file_path); 120 } 121 RemoveObservers()122void HoldingSpaceDownloadsDelegate::RemoveObservers() { 123 download_manager_observer_.RemoveAll(); 124 download_item_observer_.RemoveAll(); 125 } 126 127 } // namespace ash 128