| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // The DownloadManager object manages the process of downloading, including | 5 // The DownloadManager object manages the process of downloading, including |
| 6 // updates to the history system and providing the information for displaying | 6 // updates to the history system and providing the information for displaying |
| 7 // the downloads view in the Destinations tab. There is one DownloadManager per | 7 // the downloads view in the Destinations tab. There is one DownloadManager per |
| 8 // active profile in Chrome. | 8 // active profile in Chrome. |
| 9 // | 9 // |
| 10 // Download observers: | 10 // Download observers: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 #include <map> | 31 #include <map> |
| 32 #include <set> | 32 #include <set> |
| 33 #include <string> | 33 #include <string> |
| 34 #include <vector> | 34 #include <vector> |
| 35 | 35 |
| 36 #include "base/basictypes.h" | 36 #include "base/basictypes.h" |
| 37 #include "base/file_path.h" | 37 #include "base/file_path.h" |
| 38 #include "base/observer_list.h" | 38 #include "base/observer_list.h" |
| 39 #include "base/ref_counted.h" | 39 #include "base/ref_counted.h" |
| 40 #include "base/scoped_ptr.h" |
| 40 #include "base/time.h" | 41 #include "base/time.h" |
| 41 #include "chrome/browser/cancelable_request.h" | 42 #include "chrome/browser/download/download_history.h" |
| 42 #include "chrome/browser/history/history.h" | |
| 43 #include "chrome/browser/pref_member.h" | 43 #include "chrome/browser/pref_member.h" |
| 44 #include "chrome/browser/shell_dialogs.h" | 44 #include "chrome/browser/shell_dialogs.h" |
| 45 | 45 |
| 46 class DownloadFileManager; | 46 class DownloadFileManager; |
| 47 class DownloadItem; | 47 class DownloadItem; |
| 48 class GURL; | 48 class GURL; |
| 49 class PrefService; | 49 class PrefService; |
| 50 class Profile; | 50 class Profile; |
| 51 class ResourceDispatcherHost; | 51 class ResourceDispatcherHost; |
| 52 class URLRequestContextGetter; | 52 class URLRequestContextGetter; |
| 53 class TabContents; | 53 class TabContents; |
| 54 struct DownloadCreateInfo; |
| 54 struct DownloadSaveInfo; | 55 struct DownloadSaveInfo; |
| 55 | 56 |
| 56 // Browser's download manager: manages all downloads and destination view. | 57 // Browser's download manager: manages all downloads and destination view. |
| 57 class DownloadManager : public base::RefCountedThreadSafe<DownloadManager>, | 58 class DownloadManager : public base::RefCountedThreadSafe<DownloadManager>, |
| 59 public DownloadHistory::DownloadItemMapper, |
| 58 public SelectFileDialog::Listener { | 60 public SelectFileDialog::Listener { |
| 59 // For testing. | 61 // For testing. |
| 60 friend class DownloadManagerTest; | 62 friend class DownloadManagerTest; |
| 61 friend class MockDownloadManager; | 63 friend class MockDownloadManager; |
| 62 | 64 |
| 63 public: | 65 public: |
| 64 // A fake download table ID which representas a download that has started, | |
| 65 // but is not yet in the table. | |
| 66 static const int kUninitializedHandle; | |
| 67 | |
| 68 DownloadManager(); | 66 DownloadManager(); |
| 69 | 67 |
| 70 static void RegisterUserPrefs(PrefService* prefs); | 68 static void RegisterUserPrefs(PrefService* prefs); |
| 71 | 69 |
| 72 // Interface to implement for observers that wish to be informed of changes | 70 // Interface to implement for observers that wish to be informed of changes |
| 73 // to the DownloadManager's collection of downloads. | 71 // to the DownloadManager's collection of downloads. |
| 74 class Observer { | 72 class Observer { |
| 75 public: | 73 public: |
| 76 // New or deleted download, observers should query us for the current set | 74 // New or deleted download, observers should query us for the current set |
| 77 // of downloads. | 75 // of downloads. |
| 78 virtual void ModelChanged() = 0; | 76 virtual void ModelChanged() = 0; |
| 79 | 77 |
| 80 // A callback once the DownloadManager has retrieved the requested set of | |
| 81 // downloads. The DownloadManagerObserver must copy the vector, but does not | |
| 82 // own the individual DownloadItems, when this call is made. | |
| 83 virtual void SetDownloads(std::vector<DownloadItem*>& downloads) = 0; | |
| 84 | |
| 85 // Called when the DownloadManager is being destroyed to prevent Observers | 78 // Called when the DownloadManager is being destroyed to prevent Observers |
| 86 // from calling back to a stale pointer. | 79 // from calling back to a stale pointer. |
| 87 virtual void ManagerGoingDown() {} | 80 virtual void ManagerGoingDown() {} |
| 88 | 81 |
| 89 protected: | 82 protected: |
| 90 virtual ~Observer() {} | 83 virtual ~Observer() {} |
| 91 }; | 84 }; |
| 92 | 85 |
| 93 // Public API | |
| 94 | |
| 95 // If this download manager has an incognito profile, find all incognito | |
| 96 // downloads and pass them along to the parent profile's download manager | |
| 97 // via DoGetDownloads. Otherwise, just call DoGetDownloads(). | |
| 98 void GetDownloads(Observer* observer, | |
| 99 const std::wstring& search_text); | |
| 100 | |
| 101 // Begin a search for all downloads matching 'search_text'. If 'search_text' | |
| 102 // is empty, return all known downloads. The results are returned in the | |
| 103 // 'SetDownloads' observer callback. | |
| 104 void DoGetDownloads(Observer* observer, | |
| 105 const std::wstring& search_text, | |
| 106 std::vector<DownloadItem*>& otr_downloads); | |
| 107 | |
| 108 // Return all temporary downloads that reside in the specified directory. | 86 // Return all temporary downloads that reside in the specified directory. |
| 109 void GetTemporaryDownloads(Observer* observer, | 87 void GetTemporaryDownloads(const FilePath& dir_path, |
| 110 const FilePath& dir_path); | 88 std::vector<DownloadItem*>* result); |
| 111 | 89 |
| 112 // Return all non-temporary downloads in the specified directory that are | 90 // Return all non-temporary downloads in the specified directory that are |
| 113 // are in progress or have finished. | 91 // are in progress or have finished. |
| 114 void GetAllDownloads(Observer* observer, const FilePath& dir_path); | 92 void GetAllDownloads(const FilePath& dir_path, |
| 93 std::vector<DownloadItem*>* result); |
| 115 | 94 |
| 116 // Return all non-temporary downloads in the specified directory that are | 95 // Return all non-temporary downloads in the specified directory that are |
| 117 // either in-progress or finished but still waiting for user confirmation. | 96 // either in-progress or finished but still waiting for user confirmation. |
| 118 void GetCurrentDownloads(Observer* observer, const FilePath& dir_path); | 97 void GetCurrentDownloads(const FilePath& dir_path, |
| 98 std::vector<DownloadItem*>* result); |
| 119 | 99 |
| 120 // Returns true if initialized properly. | 100 // Returns true if initialized properly. |
| 121 bool Init(Profile* profile); | 101 bool Init(Profile* profile); |
| 122 | 102 |
| 123 // Schedule a query of the history service to retrieve all downloads. | |
| 124 void QueryHistoryForDownloads(); | |
| 125 | |
| 126 // Cleans up IN_PROGRESS history entries as these entries are corrupt because | |
| 127 // of the sudden exit. Changes them to CANCELED. Executed only when called | |
| 128 // first time, subsequent calls a no op. | |
| 129 void CleanUpInProgressHistoryEntries(); | |
| 130 | |
| 131 // Notifications sent from the download thread to the UI thread | 103 // Notifications sent from the download thread to the UI thread |
| 132 void StartDownload(DownloadCreateInfo* info); | 104 void StartDownload(DownloadCreateInfo* info); |
| 133 void UpdateDownload(int32 download_id, int64 size); | 105 void UpdateDownload(int32 download_id, int64 size); |
| 134 void DownloadFinished(int32 download_id, int64 size); | 106 void DownloadFinished(int32 download_id, int64 size); |
| 135 | 107 |
| 136 // Called from a view when a user clicks a UI button or link. | 108 // Called from a view when a user clicks a UI button or link. |
| 137 void DownloadCancelled(int32 download_id); | 109 void DownloadCancelled(int32 download_id); |
| 138 void PauseDownload(int32 download_id, bool pause); | 110 void PauseDownload(int32 download_id, bool pause); |
| 139 void RemoveDownload(int64 download_handle); | 111 void RemoveDownload(int64 download_handle); |
| 140 | 112 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 // Allow objects to observe the download creation process. | 146 // Allow objects to observe the download creation process. |
| 175 void AddObserver(Observer* observer); | 147 void AddObserver(Observer* observer); |
| 176 | 148 |
| 177 // Remove a download observer from ourself. | 149 // Remove a download observer from ourself. |
| 178 void RemoveObserver(Observer* observer); | 150 void RemoveObserver(Observer* observer); |
| 179 | 151 |
| 180 // Methods called on completion of a query sent to the history system. | 152 // Methods called on completion of a query sent to the history system. |
| 181 void OnQueryDownloadEntriesComplete( | 153 void OnQueryDownloadEntriesComplete( |
| 182 std::vector<DownloadCreateInfo>* entries); | 154 std::vector<DownloadCreateInfo>* entries); |
| 183 void OnCreateDownloadEntryComplete(DownloadCreateInfo info, int64 db_handle); | 155 void OnCreateDownloadEntryComplete(DownloadCreateInfo info, int64 db_handle); |
| 184 void OnSearchComplete(HistoryService::Handle handle, | |
| 185 std::vector<int64>* results); | |
| 186 | 156 |
| 187 // Display a new download in the appropriate browser UI. | 157 // Display a new download in the appropriate browser UI. |
| 188 void ShowDownloadInBrowser(const DownloadCreateInfo& info, | 158 void ShowDownloadInBrowser(const DownloadCreateInfo& info, |
| 189 DownloadItem* download); | 159 DownloadItem* download); |
| 190 | 160 |
| 191 // Opens a download. For Chrome extensions call | 161 // Opens a download. For Chrome extensions call |
| 192 // ExtensionsServices::InstallExtension, for everything else call | 162 // ExtensionsServices::InstallExtension, for everything else call |
| 193 // OpenDownloadInShell. | 163 // OpenDownloadInShell. |
| 194 void OpenDownload(const DownloadItem* download, | 164 void OpenDownload(const DownloadItem* download, |
| 195 gfx::NativeView parent_window); | 165 gfx::NativeView parent_window); |
| 196 | 166 |
| 197 // Show a download via the Windows shell. | 167 // Show a download via the Windows shell. |
| 198 void ShowDownloadInShell(const DownloadItem* download); | 168 void ShowDownloadInShell(const DownloadItem* download); |
| 199 | 169 |
| 200 // The number of in progress (including paused) downloads. | 170 // The number of in progress (including paused) downloads. |
| 201 int in_progress_count() const { | 171 int in_progress_count() const { |
| 202 return static_cast<int>(in_progress_.size()); | 172 return static_cast<int>(in_progress_.size()); |
| 203 } | 173 } |
| 204 | 174 |
| 205 FilePath download_path() { return *download_path_; } | 175 FilePath download_path() { return *download_path_; } |
| 206 | 176 |
| 177 DownloadHistory* download_history() { return download_history_.get(); } |
| 178 |
| 207 // Clears the last download path, used to initialize "save as" dialogs. | 179 // Clears the last download path, used to initialize "save as" dialogs. |
| 208 void ClearLastDownloadPath(); | 180 void ClearLastDownloadPath(); |
| 209 | 181 |
| 210 // Registers this file extension for automatic opening upon download | 182 // Registers this file extension for automatic opening upon download |
| 211 // completion if 'open' is true, or prevents the extension from automatic | 183 // completion if 'open' is true, or prevents the extension from automatic |
| 212 // opening if 'open' is false. | 184 // opening if 'open' is false. |
| 213 void OpenFilesBasedOnExtension(const FilePath& path, bool open); | 185 void OpenFilesBasedOnExtension(const FilePath& path, bool open); |
| 214 | 186 |
| 215 // Tests if a file type should be opened automatically. | 187 // Tests if a file type should be opened automatically. |
| 216 bool ShouldOpenFileBasedOnExtension(const FilePath& path) const; | 188 bool ShouldOpenFileBasedOnExtension(const FilePath& path) const; |
| 217 | 189 |
| 218 // Tests if we think the server means for this mime_type to be executable. | 190 // Tests if we think the server means for this mime_type to be executable. |
| 219 static bool IsExecutableMimeType(const std::string& mime_type); | 191 static bool IsExecutableMimeType(const std::string& mime_type); |
| 220 | 192 |
| 221 // Tests if a file is considered executable, based on its type. | 193 // Tests if a file is considered executable, based on its type. |
| 222 bool IsExecutableFile(const FilePath& path) const; | 194 bool IsExecutableFile(const FilePath& path) const; |
| 223 | 195 |
| 224 // Tests if a file type is considered executable. | 196 // Tests if a file type is considered executable. |
| 225 static bool IsExecutableExtension(const FilePath::StringType& extension); | 197 static bool IsExecutableExtension(const FilePath::StringType& extension); |
| 226 | 198 |
| 227 // Resets the automatic open preference. | 199 // Resets the automatic open preference. |
| 228 void ResetAutoOpenFiles(); | 200 void ResetAutoOpenFiles(); |
| 229 | 201 |
| 230 // Returns true if there are automatic handlers registered for any file | 202 // Returns true if there are automatic handlers registered for any file |
| 231 // types. | 203 // types. |
| 232 bool HasAutoOpenFileTypesRegistered() const; | 204 bool HasAutoOpenFileTypesRegistered() const; |
| 233 | 205 |
| 206 // Overridden from DownloadHistory::DownloadItemMapper: |
| 207 virtual DownloadItem* GetDownloadItemFromDbHandle(int64 db_handle); |
| 208 |
| 234 // Overridden from SelectFileDialog::Listener: | 209 // Overridden from SelectFileDialog::Listener: |
| 235 virtual void FileSelected(const FilePath& path, int index, void* params); | 210 virtual void FileSelected(const FilePath& path, int index, void* params); |
| 236 virtual void FileSelectionCanceled(void* params); | 211 virtual void FileSelectionCanceled(void* params); |
| 237 | 212 |
| 238 // Deletes the specified path on the file thread. | 213 // Deletes the specified path on the file thread. |
| 239 void DeleteDownload(const FilePath& path); | 214 void DeleteDownload(const FilePath& path); |
| 240 | 215 |
| 241 // Called when the user has validated the download of a dangerous file. | 216 // Called when the user has validated the download of a dangerous file. |
| 242 void DangerousDownloadValidated(DownloadItem* download); | 217 void DangerousDownloadValidated(DownloadItem* download); |
| 243 | 218 |
| 244 // Used to make sure we have a safe file extension and filename for a | 219 // Used to make sure we have a safe file extension and filename for a |
| 245 // download. |file_name| can either be just the file name or it can be a | 220 // download. |file_name| can either be just the file name or it can be a |
| 246 // full path to a file. | 221 // full path to a file. |
| 247 static void GenerateSafeFileName(const std::string& mime_type, | 222 static void GenerateSafeFileName(const std::string& mime_type, |
| 248 FilePath* file_name); | 223 FilePath* file_name); |
| 249 | 224 |
| 250 // Create a file name based on the response from the server. | 225 // Create a file name based on the response from the server. |
| 251 static void GenerateFileName(const GURL& url, | 226 static void GenerateFileName(const GURL& url, |
| 252 const std::string& content_disposition, | 227 const std::string& content_disposition, |
| 253 const std::string& referrer_charset, | 228 const std::string& referrer_charset, |
| 254 const std::string& mime_type, | 229 const std::string& mime_type, |
| 255 FilePath* generated_name); | 230 FilePath* generated_name); |
| 256 | 231 |
| 257 private: | 232 private: |
| 258 class FakeDbHandleGenerator { | |
| 259 public: | |
| 260 explicit FakeDbHandleGenerator(int64 start_value) : value_(start_value) {} | |
| 261 | |
| 262 int64 GetNext() { return value_--; } | |
| 263 private: | |
| 264 int64 value_; | |
| 265 }; | |
| 266 | |
| 267 // This class is used to let an incognito DownloadManager observe changes to | 233 // This class is used to let an incognito DownloadManager observe changes to |
| 268 // a normal DownloadManager, to propagate ModelChanged() calls from the parent | 234 // a normal DownloadManager, to propagate ModelChanged() calls from the parent |
| 269 // DownloadManager to the observers of the incognito DownloadManager. | 235 // DownloadManager to the observers of the incognito DownloadManager. |
| 270 class OtherDownloadManagerObserver : public Observer { | 236 class OtherDownloadManagerObserver : public Observer { |
| 271 public: | 237 public: |
| 272 explicit OtherDownloadManagerObserver( | 238 explicit OtherDownloadManagerObserver( |
| 273 DownloadManager* observing_download_manager); | 239 DownloadManager* observing_download_manager); |
| 274 virtual ~OtherDownloadManagerObserver(); | 240 virtual ~OtherDownloadManagerObserver(); |
| 275 | 241 |
| 276 // Observer interface. | 242 // Observer interface. |
| 277 virtual void ModelChanged(); | 243 virtual void ModelChanged(); |
| 278 virtual void SetDownloads(std::vector<DownloadItem*>& downloads); | |
| 279 virtual void ManagerGoingDown(); | 244 virtual void ManagerGoingDown(); |
| 280 | 245 |
| 281 private: | 246 private: |
| 282 // The incognito download manager. | 247 // The incognito download manager. |
| 283 DownloadManager* observing_download_manager_; | 248 DownloadManager* observing_download_manager_; |
| 284 | 249 |
| 285 // The original profile's download manager. | 250 // The original profile's download manager. |
| 286 DownloadManager* observed_download_manager_; | 251 DownloadManager* observed_download_manager_; |
| 287 }; | 252 }; |
| 288 | 253 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 312 // Called on the UI thread once the DownloadManager has determined whether the | 277 // Called on the UI thread once the DownloadManager has determined whether the |
| 313 // suggested file path exists. | 278 // suggested file path exists. |
| 314 void OnPathExistenceAvailable(DownloadCreateInfo* info); | 279 void OnPathExistenceAvailable(DownloadCreateInfo* info); |
| 315 | 280 |
| 316 // Called back after a target path for the file to be downloaded to has been | 281 // Called back after a target path for the file to be downloaded to has been |
| 317 // determined, either automatically based on the suggested file name, or by | 282 // determined, either automatically based on the suggested file name, or by |
| 318 // the user in a Save As dialog box. | 283 // the user in a Save As dialog box. |
| 319 void ContinueStartDownload(DownloadCreateInfo* info, | 284 void ContinueStartDownload(DownloadCreateInfo* info, |
| 320 const FilePath& target_path); | 285 const FilePath& target_path); |
| 321 | 286 |
| 322 // Update the history service for a particular download. | |
| 323 // Marked virtual for testing. | |
| 324 virtual void UpdateHistoryForDownload(DownloadItem* download); | |
| 325 void RemoveDownloadFromHistory(DownloadItem* download); | |
| 326 void RemoveDownloadsFromHistoryBetween(const base::Time remove_begin, | |
| 327 const base::Time remove_before); | |
| 328 | |
| 329 // Create an extension based on the file name and mime type. | 287 // Create an extension based on the file name and mime type. |
| 330 static void GenerateExtension(const FilePath& file_name, | 288 static void GenerateExtension(const FilePath& file_name, |
| 331 const std::string& mime_type, | 289 const std::string& mime_type, |
| 332 FilePath::StringType* generated_extension); | 290 FilePath::StringType* generated_extension); |
| 333 | 291 |
| 334 // Create a file name based on the response from the server. | 292 // Create a file name based on the response from the server. |
| 335 static void GenerateFileNameFromInfo(DownloadCreateInfo* info, | 293 static void GenerateFileNameFromInfo(DownloadCreateInfo* info, |
| 336 FilePath* generated_name); | 294 FilePath* generated_name); |
| 337 | 295 |
| 338 // Persist the automatic opening preference. | 296 // Persist the automatic opening preference. |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 // True if the download manager has been initialized and requires a shutdown. | 376 // True if the download manager has been initialized and requires a shutdown. |
| 419 bool shutdown_needed_; | 377 bool shutdown_needed_; |
| 420 | 378 |
| 421 // Observers that want to be notified of changes to the set of downloads. | 379 // Observers that want to be notified of changes to the set of downloads. |
| 422 ObserverList<Observer> observers_; | 380 ObserverList<Observer> observers_; |
| 423 | 381 |
| 424 // The current active profile. | 382 // The current active profile. |
| 425 Profile* profile_; | 383 Profile* profile_; |
| 426 scoped_refptr<URLRequestContextGetter> request_context_getter_; | 384 scoped_refptr<URLRequestContextGetter> request_context_getter_; |
| 427 | 385 |
| 428 // Used for history service request management. | 386 scoped_ptr<DownloadHistory> download_history_; |
| 429 CancelableRequestConsumerTSimple<Observer*> cancelable_consumer_; | |
| 430 | 387 |
| 431 // Non-owning pointer for handling file writing on the download_thread_. | 388 // Non-owning pointer for handling file writing on the download_thread_. |
| 432 DownloadFileManager* file_manager_; | 389 DownloadFileManager* file_manager_; |
| 433 | 390 |
| 434 // User preferences | 391 // User preferences |
| 435 BooleanPrefMember prompt_for_download_; | 392 BooleanPrefMember prompt_for_download_; |
| 436 FilePathPrefMember download_path_; | 393 FilePathPrefMember download_path_; |
| 437 | 394 |
| 438 // The user's last choice for download directory. This is only used when the | 395 // The user's last choice for download directory. This is only used when the |
| 439 // user wants us to prompt for a save location for each download. | 396 // user wants us to prompt for a save location for each download. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 454 // after this determination is made. | 411 // after this determination is made. |
| 455 // The map is of download_id->remaining size (bytes), both of which are | 412 // The map is of download_id->remaining size (bytes), both of which are |
| 456 // required when calling DownloadFinished. | 413 // required when calling DownloadFinished. |
| 457 typedef std::map<int32, int64> PendingFinishedMap; | 414 typedef std::map<int32, int64> PendingFinishedMap; |
| 458 PendingFinishedMap pending_finished_downloads_; | 415 PendingFinishedMap pending_finished_downloads_; |
| 459 | 416 |
| 460 // The "Save As" dialog box used to ask the user where a file should be | 417 // The "Save As" dialog box used to ask the user where a file should be |
| 461 // saved. | 418 // saved. |
| 462 scoped_refptr<SelectFileDialog> select_file_dialog_; | 419 scoped_refptr<SelectFileDialog> select_file_dialog_; |
| 463 | 420 |
| 464 // In case we don't have a valid db_handle, we use |fake_db_handle_| instead. | |
| 465 // This is useful for incognito mode or when the history database is offline. | |
| 466 // Downloads are expected to have unique handles, so FakeDbHandleGenerator | |
| 467 // automatically decrement the handle value on every use. | |
| 468 FakeDbHandleGenerator fake_db_handle_; | |
| 469 | |
| 470 scoped_ptr<OtherDownloadManagerObserver> other_download_manager_observer_; | 421 scoped_ptr<OtherDownloadManagerObserver> other_download_manager_observer_; |
| 471 | 422 |
| 472 DISALLOW_COPY_AND_ASSIGN(DownloadManager); | 423 DISALLOW_COPY_AND_ASSIGN(DownloadManager); |
| 473 }; | 424 }; |
| 474 | 425 |
| 475 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_ | 426 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_ |
| OLD | NEW |