| Index: content/browser/download/save_package.cc
|
| diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
|
| index 65fe474558373d2e5474459ab0d5f40e5c79671e..65ecac77114b0f15d49c35c176c0ba68652698a8 100644
|
| --- a/content/browser/download/save_package.cc
|
| +++ b/content/browser/download/save_package.cc
|
| @@ -141,8 +141,9 @@ SavePackage::SavePackage(WebContents* web_contents,
|
| wrote_to_completed_file_(false),
|
| wrote_to_failed_file_(false) {
|
| DCHECK(page_url_.is_valid());
|
| - DCHECK(save_type_ == content::SAVE_PAGE_TYPE_AS_ONLY_HTML ||
|
| - save_type_ == content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML);
|
| + DCHECK((save_type_ == content::SAVE_PAGE_TYPE_AS_ONLY_HTML) ||
|
| + (save_type_ == content::SAVE_PAGE_TYPE_AS_MHTML) ||
|
| + (save_type_ == content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML));
|
| DCHECK(!saved_main_file_path_.empty() &&
|
| saved_main_file_path_.value().length() <= kMaxFilePathLength);
|
| DCHECK(!saved_main_directory_path_.empty() &&
|
| @@ -290,6 +291,10 @@ bool SavePackage::Init() {
|
| // Get directory
|
| DCHECK(!saved_main_directory_path_.empty());
|
| GetAllSavableResourceLinksForCurrentPage();
|
| + } else if (save_type_ == content::SAVE_PAGE_TYPE_AS_MHTML) {
|
| + download_->SetTotalBytes(1);
|
| + web_contents()->GenerateMHTML(saved_main_file_path_, base::Bind(
|
| + &SavePackage::OnMHTMLGenerated, this));
|
| } else {
|
| wait_state_ = NET_FILES;
|
| SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ?
|
| @@ -310,6 +315,16 @@ bool SavePackage::Init() {
|
| return true;
|
| }
|
|
|
| +void SavePackage::OnMHTMLGenerated(const FilePath& path, int64 size) {
|
| + if (size <= 0) {
|
| + Cancel(false);
|
| + } else {
|
| + download_->UpdateProgress(1, 0, "");
|
| + wrote_to_completed_file_ = true;
|
| + Finish();
|
| + }
|
| +}
|
| +
|
| // On POSIX, the length of |pure_file_name| + |file_name_ext| is further
|
| // restricted by NAME_MAX. The maximum allowed path looks like:
|
| // '/path/to/save_dir' + '/' + NAME_MAX.
|
| @@ -705,8 +720,10 @@ void SavePackage::Finish() {
|
| save_ids));
|
|
|
| if (download_) {
|
| - download_->OnAllDataSaved(all_save_items_count_,
|
| - DownloadItem::kEmptyFileHash);
|
| + download_->OnAllDataSaved(
|
| + ((save_type_ != content::SAVE_PAGE_TYPE_AS_MHTML) ?
|
| + all_save_items_count_ : 1),
|
| + DownloadItem::kEmptyFileHash);
|
| download_->MarkAsComplete();
|
| FinalizeDownloadEntry();
|
| }
|
| @@ -774,8 +791,9 @@ void SavePackage::SaveFailed(const GURL& save_url) {
|
| if (download_)
|
| download_->UpdateProgress(completed_count(), CurrentSpeed(), "");
|
|
|
| - if (save_type_ == content::SAVE_PAGE_TYPE_AS_ONLY_HTML ||
|
| - save_item->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_DOM) {
|
| + if ((save_type_ == content::SAVE_PAGE_TYPE_AS_ONLY_HTML) ||
|
| + (save_type_ == content::SAVE_PAGE_TYPE_AS_MHTML) ||
|
| + (save_item->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_DOM)) {
|
| // We got error when saving page. Treat it as disk error.
|
| Cancel(true);
|
| }
|
| @@ -881,9 +899,10 @@ void SavePackage::DoSavingProcess() {
|
| DCHECK(wait_state_ == HTML_DATA);
|
| }
|
| } else {
|
| - // Save as HTML only.
|
| + // Save as HTML only or MHTML.
|
| DCHECK(wait_state_ == NET_FILES);
|
| - DCHECK(save_type_ == content::SAVE_PAGE_TYPE_AS_ONLY_HTML);
|
| + DCHECK((save_type_ == content::SAVE_PAGE_TYPE_AS_ONLY_HTML) ||
|
| + (save_type_ == content::SAVE_PAGE_TYPE_AS_MHTML));
|
| if (waiting_item_queue_.size()) {
|
| DCHECK(all_save_items_count_ == waiting_item_queue_.size());
|
| SaveNextFile(false);
|
|
|