Index: content/browser/download/save_file_manager.cc |
diff --git a/content/browser/download/save_file_manager.cc b/content/browser/download/save_file_manager.cc |
index cf2e59ce3f15c4da2c3f88020dc9051b9034181c..0c7130e51c9e7645128323d0a32d0ee937c3cf7f 100644 |
--- a/content/browser/download/save_file_manager.cc |
+++ b/content/browser/download/save_file_manager.cc |
@@ -74,6 +74,10 @@ void SaveFileManager::SaveURL(SaveItemId save_item_id, |
SavePackage* save_package) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ // Insert started saving job to tracking list. |
+ DCHECK(packages_.find(save_item_id) == packages_.end()); |
+ packages_[save_item_id] = save_package; |
+ |
// Register a saving job. |
if (save_source == SaveFileCreateInfo::SAVE_FILE_FROM_NET) { |
DCHECK(url.is_valid()); |
@@ -201,19 +205,29 @@ void SaveFileManager::SaveFinished(SaveItemId save_item_id, |
<< " save_package_id = " << save_package_id |
<< " is_success = " << is_success; |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ |
+ int64_t bytes_so_far; |
SaveFile* save_file = LookupSaveFile(save_item_id); |
if (save_file != nullptr) { |
DCHECK(save_file->InProgress()); |
DVLOG(20) << " " << __FUNCTION__ << "()" |
<< " save_file = " << save_file->DebugString(); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&SaveFileManager::OnSaveFinished, this, save_item_id, |
- save_file->BytesSoFar(), is_success)); |
- |
+ bytes_so_far = save_file->BytesSoFar(); |
save_file->Finish(); |
save_file->Detach(); |
+ } else { |
+ // We got called before StartSave - this should only happen if |
+ // ResourceHandler failed before it got a chance to parse headers |
+ // and metadata. |
+ DCHECK(!is_success); |
+ |
+ bytes_so_far = 0; |
} |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&SaveFileManager::OnSaveFinished, this, save_item_id, |
+ bytes_so_far, is_success)); |
} |
// Notifications sent from the file thread and run on the UI thread. |
@@ -228,10 +242,6 @@ void SaveFileManager::OnStartSave(const SaveFileCreateInfo& info) { |
return; |
} |
- // Insert started saving job to tracking list. |
- DCHECK(packages_.find(info.save_item_id) == packages_.end()); |
- packages_[info.save_item_id] = save_package; |
- |
// Forward this message to SavePackage. |
save_package->StartSave(&info); |
} |