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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_ 6 #define CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/containers/hash_tables.h" 10 #include "base/memory/ref_counted.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "chrome/browser/download/download_path_reservation_tracker.h" 13 #include "chrome/browser/download/download_target_determiner_delegate.h" 14 #include "chrome/browser/safe_browsing/download_protection_service.h" 15 #include "content/public/browser/download_danger_type.h" 16 #include "content/public/browser/download_item.h" 17 #include "content/public/browser/download_manager_delegate.h" 18 #include "content/public/browser/notification_observer.h" 19 #include "content/public/browser/notification_registrar.h" 20 21 class DownloadPrefs; 22 class Profile; 23 24 namespace content { 25 class DownloadManager; 26 } 27 28 namespace extensions { 29 class CrxInstaller; 30 } 31 32 namespace user_prefs { 33 class PrefRegistrySyncable; 34 } 35 36 #if defined(COMPILER_GCC) 37 namespace BASE_HASH_NAMESPACE { 38 template<> 39 struct hash<extensions::CrxInstaller*> { 40 std::size_t operator()(extensions::CrxInstaller* const& p) const { 41 return reinterpret_cast<std::size_t>(p); 42 } 43 }; 44 } // namespace BASE_HASH_NAMESPACE 45 #endif 46 47 // This is the Chrome side helper for the download system. 48 class ChromeDownloadManagerDelegate 49 : public base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>, 50 public content::DownloadManagerDelegate, 51 public content::NotificationObserver, 52 public DownloadTargetDeterminerDelegate { 53 public: 54 explicit ChromeDownloadManagerDelegate(Profile* profile); 55 56 // Should be called before the first call to ShouldCompleteDownload() to 57 // disable SafeBrowsing checks for |item|. 58 static void DisableSafeBrowsing(content::DownloadItem* item); 59 60 void SetDownloadManager(content::DownloadManager* dm); 61 62 // Callbacks passed to GetNextId() will not be called until SetNextId() is 63 // called. 64 void SetNextId(uint32 next_id); 65 66 // content::DownloadManagerDelegate 67 virtual void Shutdown() OVERRIDE; 68 virtual void GetNextId(const content::DownloadIdCallback& callback) OVERRIDE; 69 virtual bool DetermineDownloadTarget( 70 content::DownloadItem* item, 71 const content::DownloadTargetCallback& callback) OVERRIDE; 72 virtual bool ShouldOpenFileBasedOnExtension( 73 const base::FilePath& path) OVERRIDE; 74 virtual bool ShouldCompleteDownload( 75 content::DownloadItem* item, 76 const base::Closure& complete_callback) OVERRIDE; 77 virtual bool ShouldOpenDownload( 78 content::DownloadItem* item, 79 const content::DownloadOpenDelayedCallback& callback) OVERRIDE; 80 virtual bool GenerateFileHash() OVERRIDE; 81 virtual void GetSaveDir(content::BrowserContext* browser_context, 82 base::FilePath* website_save_dir, 83 base::FilePath* download_save_dir, 84 bool* skip_dir_check) OVERRIDE; 85 virtual void ChooseSavePath( 86 content::WebContents* web_contents, 87 const base::FilePath& suggested_path, 88 const base::FilePath::StringType& default_extension, 89 bool can_save_as_complete, 90 const content::SavePackagePathPickedCallback& callback) OVERRIDE; 91 virtual void OpenDownload(content::DownloadItem* download) OVERRIDE; 92 virtual void ShowDownloadInShell(content::DownloadItem* download) OVERRIDE; 93 virtual void CheckForFileExistence( 94 content::DownloadItem* download, 95 const content::CheckForFileExistenceCallback& callback) OVERRIDE; 96 virtual std::string ApplicationClientIdForFileScanning() const OVERRIDE; 97 98 DownloadPrefs* download_prefs() { return download_prefs_.get(); } 99 100 protected: 101 // So that test classes can inherit from this for override purposes. 102 virtual ~ChromeDownloadManagerDelegate(); 103 104 // So that test classes that inherit from this for override purposes 105 // can call back into the DownloadManager. 106 content::DownloadManager* download_manager_; 107 108 virtual safe_browsing::DownloadProtectionService* 109 GetDownloadProtectionService(); 110 111 // DownloadTargetDeterminerDelegate. Protected for testing. 112 virtual void NotifyExtensions( 113 content::DownloadItem* download, 114 const base::FilePath& suggested_virtual_path, 115 const NotifyExtensionsCallback& callback) OVERRIDE; 116 virtual void ReserveVirtualPath( 117 content::DownloadItem* download, 118 const base::FilePath& virtual_path, 119 bool create_directory, 120 DownloadPathReservationTracker::FilenameConflictAction conflict_action, 121 const ReservedPathCallback& callback) OVERRIDE; 122 virtual void PromptUserForDownloadPath( 123 content::DownloadItem* download, 124 const base::FilePath& suggested_virtual_path, 125 const FileSelectedCallback& callback) OVERRIDE; 126 virtual void DetermineLocalPath( 127 content::DownloadItem* download, 128 const base::FilePath& virtual_path, 129 const LocalPathCallback& callback) OVERRIDE; 130 virtual void CheckDownloadUrl( 131 content::DownloadItem* download, 132 const base::FilePath& suggested_virtual_path, 133 const CheckDownloadUrlCallback& callback) OVERRIDE; 134 135 private: 136 friend class base::RefCountedThreadSafe<ChromeDownloadManagerDelegate>; 137 138 typedef std::vector<content::DownloadIdCallback> IdCallbackVector; 139 140 // content::NotificationObserver implementation. 141 virtual void Observe(int type, 142 const content::NotificationSource& source, 143 const content::NotificationDetails& details) OVERRIDE; 144 145 // Callback function after the DownloadProtectionService completes. 146 void CheckClientDownloadDone( 147 uint32 download_id, 148 safe_browsing::DownloadProtectionService::DownloadCheckResult result); 149 150 // Internal gateways for ShouldCompleteDownload(). 151 bool IsDownloadReadyForCompletion( 152 content::DownloadItem* item, 153 const base::Closure& internal_complete_callback); 154 void ShouldCompleteDownloadInternal( 155 uint32 download_id, 156 const base::Closure& user_complete_callback); 157 158 void ReturnNextId(const content::DownloadIdCallback& callback); 159 160 Profile* profile_; 161 uint32 next_download_id_; 162 IdCallbackVector id_callbacks_; 163 scoped_ptr<DownloadPrefs> download_prefs_; 164 165 // Maps from pending extension installations to DownloadItem IDs. 166 typedef base::hash_map<extensions::CrxInstaller*, 167 content::DownloadOpenDelayedCallback> CrxInstallerMap; 168 CrxInstallerMap crx_installers_; 169 170 content::NotificationRegistrar registrar_; 171 172 DISALLOW_COPY_AND_ASSIGN(ChromeDownloadManagerDelegate); 173 }; 174 175 #endif // CHROME_BROWSER_DOWNLOAD_CHROME_DOWNLOAD_MANAGER_DELEGATE_H_ 176