| Index: chrome/browser/download/download_item.cc
|
| diff --git a/chrome/browser/download/download_item.cc b/chrome/browser/download/download_item.cc
|
| index f87045109c37ee804255d3b9a655d902ef12a2ab..32fb77da80692e8d622451bc80bbd2ba3f8d4465 100644
|
| --- a/chrome/browser/download/download_item.cc
|
| +++ b/chrome/browser/download/download_item.cc
|
| @@ -27,6 +27,23 @@
|
| #include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/pref_names.h"
|
|
|
| +// A DownloadItem normally goes through the following states:
|
| +// * Created (when download starts)
|
| +// * Made visible to consumers (e.g. Javascript) after the
|
| +// destination file has been determined.
|
| +// * Entered into the history database.
|
| +// * Made visible in the download shelf.
|
| +// * All data is received. Note that the actual data download occurs
|
| +// in parallel with the above steps, but until those steps are
|
| +// complete, completion of the data download will be ignored.
|
| +// * Download file is renamed to its final name, and possibly
|
| +// auto-opened.
|
| +// TODO(rdsmith): This progress should be reflected in
|
| +// DownloadItem::DownloadState and a state transition table/state diagram.
|
| +//
|
| +// TODO(rdsmith): This description should be updated to reflect the cancel
|
| +// pathways.
|
| +
|
| namespace {
|
|
|
| // Update frequency (milliseconds).
|
| @@ -101,9 +118,12 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| is_extension_install_(info.is_extension_install),
|
| name_finalized_(false),
|
| is_temporary_(false),
|
| + all_data_saved_(false),
|
| opened_(false) {
|
| if (state_ == IN_PROGRESS)
|
| state_ = CANCELLED;
|
| + if (state_ == COMPLETE)
|
| + all_data_saved_ = true;
|
| Init(false /* don't start progress timer */);
|
| }
|
|
|
| @@ -137,6 +157,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| is_extension_install_(info.is_extension_install),
|
| name_finalized_(false),
|
| is_temporary_(!info.save_info.file_path.empty()),
|
| + all_data_saved_(false),
|
| opened_(false) {
|
| Init(true /* start progress timer */);
|
| }
|
| @@ -171,6 +192,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| is_extension_install_(false),
|
| name_finalized_(false),
|
| is_temporary_(false),
|
| + all_data_saved_(false),
|
| opened_(false) {
|
| Init(true /* start progress timer */);
|
| }
|
| @@ -296,8 +318,14 @@ void DownloadItem::Cancel(bool update_history) {
|
| download_manager_->DownloadCancelled(id_);
|
| }
|
|
|
| -void DownloadItem::OnAllDataSaved(int64 size) {
|
| +void DownloadItem::MarkAsComplete() {
|
| + DCHECK(all_data_saved_);
|
| state_ = COMPLETE;
|
| +}
|
| +
|
| +void DownloadItem::OnAllDataSaved(int64 size) {
|
| + DCHECK(!all_data_saved_);
|
| + all_data_saved_ = true;
|
| UpdateSize(size);
|
| StopProgressTimer();
|
| }
|
| @@ -321,7 +349,7 @@ void DownloadItem::Finished() {
|
| auto_opened_ = true;
|
| }
|
|
|
| - // Notify our observers that we are complete (the call to OnAllDataSaved()
|
| + // Notify our observers that we are complete (the call to MarkAsComplete()
|
| // set the state to complete but did not notify).
|
| UpdateObservers();
|
|
|
|
|