| Index: content/browser/download/save_package.cc
|
| diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
|
| index b60c354a4b7229b960424a4dc2a2e83c4e238229..40ad19d56f1359a96e2aa223a7555bd7915d7864 100644
|
| --- a/content/browser/download/save_package.cc
|
| +++ b/content/browser/download/save_package.cc
|
| @@ -15,6 +15,7 @@
|
| #include "base/stl_util.h"
|
| #include "base/strings/string_piece.h"
|
| #include "base/strings/string_split.h"
|
| +#include "base/strings/stringprintf.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/threading/thread.h"
|
| @@ -1093,23 +1094,32 @@ void SavePackage::OnReceivedSerializedHtmlData(const GURL& frame_url,
|
| }
|
|
|
| SaveUrlItemMap::iterator it = in_progress_items_.find(frame_url.spec());
|
| - if (it == in_progress_items_.end()) {
|
| + SaveItem* save_item = NULL;
|
| + if (it != in_progress_items_.end()) {
|
| + save_item = it->second;
|
| + if (save_item->last_data_received()) {
|
| + OnWriteToFinishedFile(false, *save_item);
|
| + // No point in writing the received data in such case.
|
| + // Otherwise we might stop the process of writing the already existing
|
| + // file (of the save_item).
|
| + return;
|
| + }
|
| + } else {
|
| for (SavedItemMap::iterator saved_it = saved_success_items_.begin();
|
| - saved_it != saved_success_items_.end(); ++saved_it) {
|
| + saved_it != saved_success_items_.end(); ++saved_it) {
|
| if (saved_it->second->url() == frame_url) {
|
| - wrote_to_completed_file_ = true;
|
| + OnWriteToFinishedFile(false, *saved_it->second);
|
| break;
|
| }
|
| }
|
|
|
| it = saved_failed_items_.find(frame_url.spec());
|
| if (it != saved_failed_items_.end())
|
| - wrote_to_failed_file_ = true;
|
| + OnWriteToFinishedFile(true, *it->second);
|
|
|
| return;
|
| }
|
|
|
| - SaveItem* save_item = it->second;
|
| DCHECK(save_item->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_DOM);
|
|
|
| if (!data.empty()) {
|
| @@ -1132,6 +1142,9 @@ void SavePackage::OnReceivedSerializedHtmlData(const GURL& frame_url,
|
| VLOG(20) << " " << __FUNCTION__ << "()"
|
| << " save_id = " << save_item->save_id()
|
| << " url = \"" << save_item->url().spec() << "\"";
|
| +
|
| + save_item->SetLastDataReceived();
|
| +
|
| BrowserThread::PostTask(
|
| BrowserThread::FILE, FROM_HERE,
|
| base::Bind(&SaveFileManager::SaveFinished,
|
| @@ -1143,6 +1156,21 @@ void SavePackage::OnReceivedSerializedHtmlData(const GURL& frame_url,
|
| }
|
| }
|
|
|
| +void SavePackage::OnWriteToFinishedFile(bool failed, const SaveItem& item) {
|
| + std::string warning = base::StringPrintf(
|
| + "Received more data for save item with save_id = %d, url = \"%s\".",
|
| + item.save_id(),
|
| + item.url().spec().c_str());
|
| + if (failed) {
|
| + wrote_to_failed_file_ = true;
|
| + LOG(WARNING) << warning << " The item is failed - ignoring the data.";
|
| + } else {
|
| + wrote_to_completed_file_ = true;
|
| + LOG(WARNING) << warning
|
| + << " The item is already finished - ignoring the data.";
|
| + }
|
| +}
|
| +
|
| // Ask for all savable resource links from backend, include main frame and
|
| // sub-frame.
|
| void SavePackage::GetAllSavableResourceLinksForCurrentPage() {
|
| @@ -1446,7 +1474,8 @@ void SavePackage::FinalizeDownloadEntry() {
|
| DCHECK(download_);
|
| DCHECK(download_manager_);
|
|
|
| - download_manager_->OnSavePackageSuccessfullyFinished(download_);
|
| + download_manager_->OnSavePackageFinished(
|
| + wait_state_ == FAILED ? false : true, download_);
|
| StopObservation();
|
| }
|
|
|
|
|