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

Side by Side Diff: chrome/browser/download/download_manager.h

Issue 7294013: Modified cancel and interrupt processing to avoid race with history. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 bool Init(Profile* profile); 115 bool Init(Profile* profile);
116 116
117 // Notifications sent from the download thread to the UI thread 117 // Notifications sent from the download thread to the UI thread
118 void StartDownload(int32 id); 118 void StartDownload(int32 id);
119 void UpdateDownload(int32 download_id, int64 size); 119 void UpdateDownload(int32 download_id, int64 size);
120 // |hash| is sha256 hash for the downloaded file. It is empty when the hash 120 // |hash| is sha256 hash for the downloaded file. It is empty when the hash
121 // is not available. 121 // is not available.
122 void OnResponseCompleted(int32 download_id, int64 size, int os_error, 122 void OnResponseCompleted(int32 download_id, int64 size, int os_error,
123 const std::string& hash); 123 const std::string& hash);
124 124
125 // Called from a view when a user clicks a UI button or link. 125 // Called to initiate download cancel on behalf of an off-thread portion
126 void DownloadCancelled(int32 download_id); 126 // of the download system; redirects to DownloadItem.
127 void RemoveDownload(int64 download_handle); 127 void CancelDownload(int32 download_handle);
128
129 // This routine is called from the DownloadItem when a
130 // request is cancelled or interrupted. It removes the download
131 // from all internal queues, and takes care of the off-thread aspects
Randy Smith (Not in Mondays) 2011/06/30 23:05:13 Not all internal queues, just the ones representin
Randy Smith (Not in Mondays) 2011/07/05 20:28:44 Done.
132 // of the cancel (stopping the request, cancelling the download on
133 // the file thread).
134 void DownloadStopped(int32 download_id);
135
136 // Called from DownloadItem when the download is being removed.
Randy Smith (Not in Mondays) 2011/06/30 23:05:13 A bit more detail as to what it does.
Randy Smith (Not in Mondays) 2011/07/05 20:28:44 Done.
137 void RemoveDownload(DownloadItem* download);
128 138
129 // Determine if the download is ready for completion, i.e. has had 139 // Determine if the download is ready for completion, i.e. has had
130 // all data saved, and completed the filename determination and 140 // all data saved, and completed the filename determination and
131 // history insertion. 141 // history insertion.
132 bool IsDownloadReadyForCompletion(DownloadItem* download); 142 bool IsDownloadReadyForCompletion(DownloadItem* download);
133 143
134 // If all pre-requisites have been met, complete download processing, i.e. 144 // If all pre-requisites have been met, complete download processing, i.e.
135 // do internal cleanup, file rename, and potentially auto-open. 145 // do internal cleanup, file rename, and potentially auto-open.
136 // (Dangerous downloads still may block on user acceptance after this 146 // (Dangerous downloads still may block on user acceptance after this
137 // point.) 147 // point.)
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 269
260 // Assert the named download item is on the correct queues 270 // Assert the named download item is on the correct queues
261 // in the DownloadManager. For debugging. 271 // in the DownloadManager. For debugging.
262 void AssertQueueStateConsistent(DownloadItem* download); 272 void AssertQueueStateConsistent(DownloadItem* download);
263 273
264 // Get the download item from the history map. Useful after the item has 274 // Get the download item from the history map. Useful after the item has
265 // been removed from the active map, or was retrieved from the history DB. 275 // been removed from the active map, or was retrieved from the history DB.
266 DownloadItem* GetDownloadItem(int id); 276 DownloadItem* GetDownloadItem(int id);
267 277
268 private: 278 private:
269 // For testing.
270 friend class DownloadManagerTest;
271 friend class MockDownloadManager;
272
273 // This class is used to let an incognito DownloadManager observe changes to 279 // This class is used to let an incognito DownloadManager observe changes to
274 // a normal DownloadManager, to propagate ModelChanged() calls from the parent 280 // a normal DownloadManager, to propagate ModelChanged() calls from the parent
275 // DownloadManager to the observers of the incognito DownloadManager. 281 // DownloadManager to the observers of the incognito DownloadManager.
276 class OtherDownloadManagerObserver : public Observer { 282 class OtherDownloadManagerObserver : public Observer {
277 public: 283 public:
278 explicit OtherDownloadManagerObserver( 284 explicit OtherDownloadManagerObserver(
279 DownloadManager* observing_download_manager); 285 DownloadManager* observing_download_manager);
280 virtual ~OtherDownloadManagerObserver(); 286 virtual ~OtherDownloadManagerObserver();
281 287
282 // Observer interface. 288 // Observer interface.
283 virtual void ModelChanged(); 289 virtual void ModelChanged();
284 virtual void ManagerGoingDown(); 290 virtual void ManagerGoingDown();
285 291
286 private: 292 private:
287 // The incognito download manager. 293 // The incognito download manager.
288 DownloadManager* observing_download_manager_; 294 DownloadManager* observing_download_manager_;
289 295
290 // The original profile's download manager. 296 // The original profile's download manager.
291 DownloadManager* observed_download_manager_; 297 DownloadManager* observed_download_manager_;
292 }; 298 };
293 299
294 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 300 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
295 friend class DeleteTask<DownloadManager>; 301 friend class DeleteTask<DownloadManager>;
296 friend class OtherDownloadManagerObserver; 302 friend class OtherDownloadManagerObserver;
297 303
304 // For testing.
305 friend class DownloadManagerTest;
306 friend class MockDownloadManager;
307 FRIEND_TEST_ALL_PREFIXES(DownloadTest, CancelFromFileSelection);
308 FRIEND_TEST_ALL_PREFIXES(DownloadTest, RemoveFromFileSelection);
309 FRIEND_TEST_ALL_PREFIXES(DownloadTest, InterruptFromFileSelection);
310
298 virtual ~DownloadManager(); 311 virtual ~DownloadManager();
299 312
300 // Called on the FILE thread to check the existence of a downloaded file. 313 // Called on the FILE thread to check the existence of a downloaded file.
301 void CheckForFileRemovalOnFileThread(int64 db_handle, const FilePath& path); 314 void CheckForFileRemovalOnFileThread(int64 db_handle, const FilePath& path);
302 315
303 // Called on the UI thread if the FILE thread detects the removal of 316 // Called on the UI thread if the FILE thread detects the removal of
304 // the downloaded file. The UI thread updates the state of the file 317 // the downloaded file. The UI thread updates the state of the file
305 // and then notifies this update to the file's observer. 318 // and then notifies this update to the file's observer.
306 void OnFileRemovalDetected(int64 db_handle); 319 void OnFileRemovalDetected(int64 db_handle);
307 320
308 // Called on the download thread to check whether the suggested file path 321 // Called on the download thread to check whether the suggested file path
309 // exists. We don't check if the file exists on the UI thread to avoid UI 322 // exists. We don't check if the file exists on the UI thread to avoid UI
310 // stalls from interacting with the file system. 323 // stalls from interacting with the file system.
311 void CheckIfSuggestedPathExists(int32 download_id, 324 void CheckIfSuggestedPathExists(int32 download_id,
312 DownloadStateInfo state, 325 DownloadStateInfo state,
313 const FilePath& default_path); 326 const FilePath& default_path);
314 327
315 // Called on the UI thread once the DownloadManager has determined whether the 328 // Called on the UI thread once the DownloadManager has determined whether the
316 // suggested file path exists. 329 // suggested file path exists.
317 void OnPathExistenceAvailable(int32 download_id, 330 void OnPathExistenceAvailable(int32 download_id,
318 DownloadStateInfo new_state); 331 DownloadStateInfo new_state);
319 332
320 // Called back after a target path for the file to be downloaded to has been 333 // Called back after a target path for the file to be downloaded to has been
321 // determined, either automatically based on the suggested file name, or by 334 // determined, either automatically based on the suggested file name, or by
322 // the user in a Save As dialog box. 335 // the user in a Save As dialog box.
323 void ContinueDownloadWithPath(DownloadItem* download, 336 void ContinueDownloadWithPath(DownloadItem* download,
324 const FilePath& chosen_file); 337 const FilePath& chosen_file);
325 338
326 // Download cancel helper function.
327 // |request_handle| is passed by value because it is ultimately passed to
328 // other threads, and this way we don't have to worry about object lifetimes.
329 void DownloadCancelledInternal(int download_id,
330 DownloadRequestHandle request_handle);
331
332 // All data has been downloaded. 339 // All data has been downloaded.
333 // |hash| is sha256 hash for the downloaded file. It is empty when the hash 340 // |hash| is sha256 hash for the downloaded file. It is empty when the hash
334 // is not available. 341 // is not available.
335 void OnAllDataSaved(int32 download_id, int64 size, const std::string& hash); 342 void OnAllDataSaved(int32 download_id, int64 size, const std::string& hash);
336 343
337 // An error occurred in the download. 344 // An error occurred in the download.
338 void OnDownloadError(int32 download_id, int64 size, int os_error); 345 void OnDownloadError(int32 download_id, int64 size, int os_error);
339 346
340 // Updates the app icon about the overall download progress. 347 // Updates the app icon about the overall download progress.
341 void UpdateAppIcon(); 348 void UpdateAppIcon();
342 349
343 // Inform observers that the model has changed. 350 // Inform observers that the model has changed.
344 void NotifyModelChanged(); 351 void NotifyModelChanged();
345 352
353 // Return all in progress downloads. This includes downloads that
354 // have not yet been entered into the history (all other accessors
355 // only return downloads that have been entered into the history).
356 // This is intended to be used for testing only.
357 void GetInProgressDownloads(std::vector<DownloadItem*>* result);
358
346 // Get the download item from the active map. Useful when the item is not 359 // Get the download item from the active map. Useful when the item is not
347 // yet in the history map. 360 // yet in the history map.
348 DownloadItem* GetActiveDownloadItem(int id); 361 DownloadItem* GetActiveDownloadItem(int id);
349 362
350 // Debugging routine to confirm relationship between below 363 // Debugging routine to confirm relationship between below
351 // containers; no-op if NDEBUG. 364 // containers; no-op if NDEBUG.
352 void AssertContainersConsistent() const; 365 void AssertContainersConsistent() const;
353 366
354 // |downloads_| is the owning set for all downloads known to the 367 // |downloads_| is the owning set for all downloads known to the
355 // DownloadManager. This includes downloads started by the user in 368 // DownloadManager. This includes downloads started by the user in
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 // The "Save As" dialog box used to ask the user where a file should be 437 // The "Save As" dialog box used to ask the user where a file should be
425 // saved. 438 // saved.
426 scoped_refptr<SelectFileDialog> select_file_dialog_; 439 scoped_refptr<SelectFileDialog> select_file_dialog_;
427 440
428 scoped_ptr<OtherDownloadManagerObserver> other_download_manager_observer_; 441 scoped_ptr<OtherDownloadManagerObserver> other_download_manager_observer_;
429 442
430 DISALLOW_COPY_AND_ASSIGN(DownloadManager); 443 DISALLOW_COPY_AND_ASSIGN(DownloadManager);
431 }; 444 };
432 445
433 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_ 446 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698