| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "content/browser/download/save_package.h" | 5 #include "content/browser/download/save_package.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <utility> | 8 #include <utility> | 
| 9 | 9 | 
| 10 #include "base/bind.h" | 10 #include "base/bind.h" | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 51 #include "net/base/io_buffer.h" | 51 #include "net/base/io_buffer.h" | 
| 52 #include "net/base/mime_util.h" | 52 #include "net/base/mime_util.h" | 
| 53 #include "net/url_request/url_request_context.h" | 53 #include "net/url_request/url_request_context.h" | 
| 54 #include "url/url_constants.h" | 54 #include "url/url_constants.h" | 
| 55 | 55 | 
| 56 using base::Time; | 56 using base::Time; | 
| 57 | 57 | 
| 58 namespace content { | 58 namespace content { | 
| 59 namespace { | 59 namespace { | 
| 60 | 60 | 
| 61 // A counter for uniquely identifying each save package. | 61 // Generates unique ids for SavePackage::unique_id_ field. | 
| 62 int g_save_package_id = 0; | 62 SavePackageId GetNextSavePackageId() { | 
|  | 63   static int g_save_package_id = 0; | 
|  | 64   return SavePackageId::FromUnsafeValue(g_save_package_id++); | 
|  | 65 } | 
| 63 | 66 | 
| 64 // Default name which will be used when we can not get proper name from | 67 // Default name which will be used when we can not get proper name from | 
| 65 // resource URL. | 68 // resource URL. | 
| 66 const char kDefaultSaveName[] = "saved_resource"; | 69 const char kDefaultSaveName[] = "saved_resource"; | 
| 67 | 70 | 
| 68 // Maximum number of file ordinal number. I think it's big enough for resolving | 71 // Maximum number of file ordinal number. I think it's big enough for resolving | 
| 69 // name-conflict files which has same base file name. | 72 // name-conflict files which has same base file name. | 
| 70 const int32_t kMaxFileOrdinalNumber = 9999; | 73 const int32_t kMaxFileOrdinalNumber = 9999; | 
| 71 | 74 | 
| 72 // Maximum length for file path. Since Windows have MAX_PATH limitation for | 75 // Maximum length for file path. Since Windows have MAX_PATH limitation for | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 155       title_(web_contents->GetTitle()), | 158       title_(web_contents->GetTitle()), | 
| 156       start_tick_(base::TimeTicks::Now()), | 159       start_tick_(base::TimeTicks::Now()), | 
| 157       finished_(false), | 160       finished_(false), | 
| 158       mhtml_finishing_(false), | 161       mhtml_finishing_(false), | 
| 159       user_canceled_(false), | 162       user_canceled_(false), | 
| 160       disk_error_occurred_(false), | 163       disk_error_occurred_(false), | 
| 161       save_type_(save_type), | 164       save_type_(save_type), | 
| 162       all_save_items_count_(0), | 165       all_save_items_count_(0), | 
| 163       file_name_set_(&base::FilePath::CompareLessIgnoreCase), | 166       file_name_set_(&base::FilePath::CompareLessIgnoreCase), | 
| 164       wait_state_(INITIALIZE), | 167       wait_state_(INITIALIZE), | 
| 165       unique_id_(g_save_package_id++), | 168       unique_id_(GetNextSavePackageId()), | 
| 166       wrote_to_completed_file_(false), | 169       wrote_to_completed_file_(false), | 
| 167       wrote_to_failed_file_(false) { | 170       wrote_to_failed_file_(false) { | 
| 168   DCHECK(page_url_.is_valid()); | 171   DCHECK(page_url_.is_valid()); | 
| 169   DCHECK((save_type_ == SAVE_PAGE_TYPE_AS_ONLY_HTML) || | 172   DCHECK((save_type_ == SAVE_PAGE_TYPE_AS_ONLY_HTML) || | 
| 170          (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) || | 173          (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) || | 
| 171          (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML)) | 174          (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML)) | 
| 172       << save_type_; | 175       << save_type_; | 
| 173   DCHECK(!saved_main_file_path_.empty() && | 176   DCHECK(!saved_main_file_path_.empty() && | 
| 174          saved_main_file_path_.value().length() <= kMaxFilePathLength); | 177          saved_main_file_path_.value().length() <= kMaxFilePathLength); | 
| 175   DCHECK(!saved_main_directory_path_.empty() && | 178   DCHECK(!saved_main_directory_path_.empty() && | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 187       title_(web_contents->GetTitle()), | 190       title_(web_contents->GetTitle()), | 
| 188       start_tick_(base::TimeTicks::Now()), | 191       start_tick_(base::TimeTicks::Now()), | 
| 189       finished_(false), | 192       finished_(false), | 
| 190       mhtml_finishing_(false), | 193       mhtml_finishing_(false), | 
| 191       user_canceled_(false), | 194       user_canceled_(false), | 
| 192       disk_error_occurred_(false), | 195       disk_error_occurred_(false), | 
| 193       save_type_(SAVE_PAGE_TYPE_UNKNOWN), | 196       save_type_(SAVE_PAGE_TYPE_UNKNOWN), | 
| 194       all_save_items_count_(0), | 197       all_save_items_count_(0), | 
| 195       file_name_set_(&base::FilePath::CompareLessIgnoreCase), | 198       file_name_set_(&base::FilePath::CompareLessIgnoreCase), | 
| 196       wait_state_(INITIALIZE), | 199       wait_state_(INITIALIZE), | 
| 197       unique_id_(g_save_package_id++), | 200       unique_id_(GetNextSavePackageId()), | 
| 198       wrote_to_completed_file_(false), | 201       wrote_to_completed_file_(false), | 
| 199       wrote_to_failed_file_(false) { | 202       wrote_to_failed_file_(false) { | 
| 200   DCHECK(page_url_.is_valid()); | 203   DCHECK(page_url_.is_valid()); | 
| 201   InternalInit(); | 204   InternalInit(); | 
| 202 } | 205 } | 
| 203 | 206 | 
| 204 // This is for testing use. Set |finished_| as true because we don't want | 207 // This is for testing use. Set |finished_| as true because we don't want | 
| 205 // method Cancel to be be called in destructor in test mode. | 208 // method Cancel to be be called in destructor in test mode. | 
| 206 // We also don't call InternalInit(). | 209 // We also don't call InternalInit(). | 
| 207 SavePackage::SavePackage(WebContents* web_contents, | 210 SavePackage::SavePackage(WebContents* web_contents, | 
| 208                          const base::FilePath& file_full_path, | 211                          const base::FilePath& file_full_path, | 
| 209                          const base::FilePath& directory_full_path) | 212                          const base::FilePath& directory_full_path) | 
| 210     : WebContentsObserver(web_contents), | 213     : WebContentsObserver(web_contents), | 
| 211       number_of_frames_pending_response_(0), | 214       number_of_frames_pending_response_(0), | 
| 212       file_manager_(NULL), | 215       file_manager_(NULL), | 
| 213       download_manager_(NULL), | 216       download_manager_(NULL), | 
| 214       download_(NULL), | 217       download_(NULL), | 
| 215       saved_main_file_path_(file_full_path), | 218       saved_main_file_path_(file_full_path), | 
| 216       saved_main_directory_path_(directory_full_path), | 219       saved_main_directory_path_(directory_full_path), | 
| 217       start_tick_(base::TimeTicks::Now()), | 220       start_tick_(base::TimeTicks::Now()), | 
| 218       finished_(true), | 221       finished_(true), | 
| 219       mhtml_finishing_(false), | 222       mhtml_finishing_(false), | 
| 220       user_canceled_(false), | 223       user_canceled_(false), | 
| 221       disk_error_occurred_(false), | 224       disk_error_occurred_(false), | 
| 222       save_type_(SAVE_PAGE_TYPE_UNKNOWN), | 225       save_type_(SAVE_PAGE_TYPE_UNKNOWN), | 
| 223       all_save_items_count_(0), | 226       all_save_items_count_(0), | 
| 224       file_name_set_(&base::FilePath::CompareLessIgnoreCase), | 227       file_name_set_(&base::FilePath::CompareLessIgnoreCase), | 
| 225       wait_state_(INITIALIZE), | 228       wait_state_(INITIALIZE), | 
| 226       unique_id_(g_save_package_id++), | 229       unique_id_(GetNextSavePackageId()), | 
| 227       wrote_to_completed_file_(false), | 230       wrote_to_completed_file_(false), | 
| 228       wrote_to_failed_file_(false) {} | 231       wrote_to_failed_file_(false) {} | 
| 229 | 232 | 
| 230 SavePackage::~SavePackage() { | 233 SavePackage::~SavePackage() { | 
| 231   // Stop receiving saving job's updates | 234   // Stop receiving saving job's updates | 
| 232   if (!finished_ && !canceled()) { | 235   if (!finished_ && !canceled()) { | 
| 233     // Unexpected quit. | 236     // Unexpected quit. | 
| 234     Cancel(true); | 237     Cancel(true); | 
| 235   } | 238   } | 
| 236 | 239 | 
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 620 | 623 | 
| 621   // Check whether we begin to require serialized HTML data. | 624   // Check whether we begin to require serialized HTML data. | 
| 622   if (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML && | 625   if (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML && | 
| 623       wait_state_ == HTML_DATA) { | 626       wait_state_ == HTML_DATA) { | 
| 624     // Inform backend to serialize the all frames' DOM and send serialized | 627     // Inform backend to serialize the all frames' DOM and send serialized | 
| 625     // HTML data back. | 628     // HTML data back. | 
| 626     GetSerializedHtmlWithLocalLinks(); | 629     GetSerializedHtmlWithLocalLinks(); | 
| 627   } | 630   } | 
| 628 } | 631 } | 
| 629 | 632 | 
| 630 SaveItem* SavePackage::LookupSaveItemInProcess(int32_t save_item_id) { | 633 SaveItem* SavePackage::LookupSaveItemInProcess(SaveItemId save_item_id) { | 
| 631   auto it = in_progress_items_.find(save_item_id); | 634   auto it = in_progress_items_.find(save_item_id); | 
| 632   if (it != in_progress_items_.end()) { | 635   if (it != in_progress_items_.end()) { | 
| 633     SaveItem* save_item = it->second; | 636     SaveItem* save_item = it->second; | 
| 634     DCHECK_EQ(SaveItem::IN_PROGRESS, save_item->state()); | 637     DCHECK_EQ(SaveItem::IN_PROGRESS, save_item->state()); | 
| 635     return save_item; | 638     return save_item; | 
| 636   } | 639   } | 
| 637   return nullptr; | 640   return nullptr; | 
| 638 } | 641 } | 
| 639 | 642 | 
| 640 void SavePackage::PutInProgressItemToSavedMap(SaveItem* save_item) { | 643 void SavePackage::PutInProgressItemToSavedMap(SaveItem* save_item) { | 
| 641   SaveItemIdMap::iterator it = in_progress_items_.find(save_item->id()); | 644   SaveItemIdMap::iterator it = in_progress_items_.find(save_item->id()); | 
| 642   DCHECK(it != in_progress_items_.end()); | 645   DCHECK(it != in_progress_items_.end()); | 
| 643   DCHECK(save_item == it->second); | 646   DCHECK(save_item == it->second); | 
| 644   in_progress_items_.erase(it); | 647   in_progress_items_.erase(it); | 
| 645 | 648 | 
| 646   if (save_item->success()) { | 649   if (save_item->success()) { | 
| 647     // Add it to saved_success_items_. | 650     // Add it to saved_success_items_. | 
| 648     DCHECK(saved_success_items_.find(save_item->id()) == | 651     DCHECK(saved_success_items_.find(save_item->id()) == | 
| 649            saved_success_items_.end()); | 652            saved_success_items_.end()); | 
| 650     saved_success_items_[save_item->id()] = save_item; | 653     saved_success_items_[save_item->id()] = save_item; | 
| 651   } else { | 654   } else { | 
| 652     // Add it to saved_failed_items_. | 655     // Add it to saved_failed_items_. | 
| 653     DCHECK(saved_failed_items_.find(save_item->id()) == | 656     DCHECK(saved_failed_items_.find(save_item->id()) == | 
| 654            saved_failed_items_.end()); | 657            saved_failed_items_.end()); | 
| 655     saved_failed_items_[save_item->id()] = save_item; | 658     saved_failed_items_[save_item->id()] = save_item; | 
| 656   } | 659   } | 
| 657 } | 660 } | 
| 658 | 661 | 
| 659 // Called for updating saving state. | 662 // Called for updating saving state. | 
| 660 bool SavePackage::UpdateSaveProgress(int32_t save_item_id, | 663 bool SavePackage::UpdateSaveProgress(SaveItemId save_item_id, | 
| 661                                      int64_t size, | 664                                      int64_t size, | 
| 662                                      bool write_success) { | 665                                      bool write_success) { | 
| 663   // Because we might have canceled this saving job before, | 666   // Because we might have canceled this saving job before, | 
| 664   // so we might not find corresponding SaveItem. | 667   // so we might not find corresponding SaveItem. | 
| 665   SaveItem* save_item = LookupSaveItemInProcess(save_item_id); | 668   SaveItem* save_item = LookupSaveItemInProcess(save_item_id); | 
| 666   if (!save_item) | 669   if (!save_item) | 
| 667     return false; | 670     return false; | 
| 668 | 671 | 
| 669   save_item->Update(size); | 672   save_item->Update(size); | 
| 670 | 673 | 
| 671   // If we got disk error, cancel whole save page job. | 674   // If we got disk error, cancel whole save page job. | 
| 672   if (!write_success) { | 675   if (!write_success) { | 
| 673     // Cancel job with reason of disk error. | 676     // Cancel job with reason of disk error. | 
| 674     Cancel(false); | 677     Cancel(false); | 
| 675   } | 678   } | 
| 676   return true; | 679   return true; | 
| 677 } | 680 } | 
| 678 | 681 | 
| 679 // Stop all page saving jobs that are in progress and instruct the file thread | 682 // Stop all page saving jobs that are in progress and instruct the file thread | 
| 680 // to delete all saved  files. | 683 // to delete all saved  files. | 
| 681 void SavePackage::Stop() { | 684 void SavePackage::Stop() { | 
| 682   // If we haven't moved out of the initial state, there's nothing to cancel and | 685   // If we haven't moved out of the initial state, there's nothing to cancel and | 
| 683   // there won't be valid pointers for file_manager_ or download_. | 686   // there won't be valid pointers for file_manager_ or download_. | 
| 684   if (wait_state_ == INITIALIZE) | 687   if (wait_state_ == INITIALIZE) | 
| 685     return; | 688     return; | 
| 686 | 689 | 
| 687   // When stopping, if it still has some items in in_progress, cancel them. | 690   // When stopping, if it still has some items in in_progress, cancel them. | 
| 688   DCHECK(canceled()); | 691   DCHECK(canceled()); | 
| 689   if (in_process_count()) { | 692   if (in_process_count()) { | 
| 690     SaveItemIdMap::iterator it = in_progress_items_.begin(); | 693     for (const auto& it : in_progress_items_) { | 
| 691     for (; it != in_progress_items_.end(); ++it) { | 694       SaveItem* save_item = it.second; | 
| 692       SaveItem* save_item = it->second; |  | 
| 693       DCHECK_EQ(SaveItem::IN_PROGRESS, save_item->state()); | 695       DCHECK_EQ(SaveItem::IN_PROGRESS, save_item->state()); | 
| 694       save_item->Cancel(); | 696       save_item->Cancel(); | 
| 695     } | 697     } | 
| 696     // Remove all in progress item to saved map. For failed items, they will | 698     // Remove all in progress item to saved map. For failed items, they will | 
| 697     // be put into saved_failed_items_, for successful item, they will be put | 699     // be put into saved_failed_items_, for successful item, they will be put | 
| 698     // into saved_success_items_. | 700     // into saved_success_items_. | 
| 699     while (in_process_count()) | 701     while (in_process_count()) | 
| 700       PutInProgressItemToSavedMap(in_progress_items_.begin()->second); | 702       PutInProgressItemToSavedMap(in_progress_items_.begin()->second); | 
| 701   } | 703   } | 
| 702 | 704 | 
| 703   // This vector contains the save ids of the save files which SaveFileManager | 705   // This vector contains the save ids of the save files which SaveFileManager | 
| 704   // needs to remove from its save_file_map_. | 706   // needs to remove from its save_file_map_. | 
| 705   std::vector<int> save_item_ids; | 707   std::vector<SaveItemId> save_item_ids; | 
| 706   for (const auto& it : saved_success_items_) | 708   for (const auto& it : saved_success_items_) | 
| 707     save_item_ids.push_back(it.first); | 709     save_item_ids.push_back(it.first); | 
| 708   for (const auto& it : saved_failed_items_) | 710   for (const auto& it : saved_failed_items_) | 
| 709     save_item_ids.push_back(it.first); | 711     save_item_ids.push_back(it.first); | 
| 710 | 712 | 
| 711   BrowserThread::PostTask( | 713   BrowserThread::PostTask( | 
| 712       BrowserThread::FILE, FROM_HERE, | 714       BrowserThread::FILE, FROM_HERE, | 
| 713       base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, file_manager_, | 715       base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, file_manager_, | 
| 714                  save_item_ids)); | 716                  save_item_ids)); | 
| 715 | 717 | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 760 | 762 | 
| 761   // Record any errors that occurred. | 763   // Record any errors that occurred. | 
| 762   if (wrote_to_completed_file_) | 764   if (wrote_to_completed_file_) | 
| 763     RecordSavePackageEvent(SAVE_PACKAGE_WRITE_TO_COMPLETED); | 765     RecordSavePackageEvent(SAVE_PACKAGE_WRITE_TO_COMPLETED); | 
| 764 | 766 | 
| 765   if (wrote_to_failed_file_) | 767   if (wrote_to_failed_file_) | 
| 766     RecordSavePackageEvent(SAVE_PACKAGE_WRITE_TO_FAILED); | 768     RecordSavePackageEvent(SAVE_PACKAGE_WRITE_TO_FAILED); | 
| 767 | 769 | 
| 768   // This vector contains the save ids of the save files which SaveFileManager | 770   // This vector contains the save ids of the save files which SaveFileManager | 
| 769   // needs to remove from its save_file_map_. | 771   // needs to remove from its save_file_map_. | 
| 770   std::vector<int> list_of_failed_save_item_ids; | 772   std::vector<SaveItemId> list_of_failed_save_item_ids; | 
| 771   for (const auto& it : saved_failed_items_) { | 773   for (const auto& it : saved_failed_items_) { | 
| 772     SaveItem* save_item = it.second; | 774     SaveItem* save_item = it.second; | 
| 773     DCHECK_EQ(it.first, save_item->id()); | 775     DCHECK_EQ(it.first, save_item->id()); | 
| 774     list_of_failed_save_item_ids.push_back(save_item->id()); | 776     list_of_failed_save_item_ids.push_back(save_item->id()); | 
| 775   } | 777   } | 
| 776 | 778 | 
| 777   BrowserThread::PostTask( | 779   BrowserThread::PostTask( | 
| 778       BrowserThread::FILE, FROM_HERE, | 780       BrowserThread::FILE, FROM_HERE, | 
| 779       base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, file_manager_, | 781       base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, file_manager_, | 
| 780                  list_of_failed_save_item_ids)); | 782                  list_of_failed_save_item_ids)); | 
| 781 | 783 | 
| 782   if (download_) { | 784   if (download_) { | 
| 783     // Hack to avoid touching download_ after user cancel. | 785     // Hack to avoid touching download_ after user cancel. | 
| 784     // TODO(rdsmith/benjhayden): Integrate canceling on DownloadItem | 786     // TODO(rdsmith/benjhayden): Integrate canceling on DownloadItem | 
| 785     // with SavePackage flow. | 787     // with SavePackage flow. | 
| 786     if (download_->GetState() == DownloadItem::IN_PROGRESS) { | 788     if (download_->GetState() == DownloadItem::IN_PROGRESS) { | 
| 787       if (save_type_ != SAVE_PAGE_TYPE_AS_MHTML) { | 789       if (save_type_ != SAVE_PAGE_TYPE_AS_MHTML) { | 
| 788         download_->DestinationUpdate( | 790         download_->DestinationUpdate( | 
| 789             all_save_items_count_, CurrentSpeed(), std::string()); | 791             all_save_items_count_, CurrentSpeed(), std::string()); | 
| 790         download_->OnAllDataSaved(DownloadItem::kEmptyFileHash); | 792         download_->OnAllDataSaved(DownloadItem::kEmptyFileHash); | 
| 791       } | 793       } | 
| 792       download_->MarkAsComplete(); | 794       download_->MarkAsComplete(); | 
| 793     } | 795     } | 
| 794     FinalizeDownloadEntry(); | 796     FinalizeDownloadEntry(); | 
| 795   } | 797   } | 
| 796 } | 798 } | 
| 797 | 799 | 
| 798 // Called for updating end state. | 800 // Called for updating end state. | 
| 799 void SavePackage::SaveFinished(int32_t save_item_id, | 801 void SavePackage::SaveFinished(SaveItemId save_item_id, | 
| 800                                int64_t size, | 802                                int64_t size, | 
| 801                                bool is_success) { | 803                                bool is_success) { | 
| 802   // Because we might have canceled this saving job before, | 804   // Because we might have canceled this saving job before, | 
| 803   // so we might not find corresponding SaveItem. Just ignore it. | 805   // so we might not find corresponding SaveItem. Just ignore it. | 
| 804   SaveItem* save_item = LookupSaveItemInProcess(save_item_id); | 806   SaveItem* save_item = LookupSaveItemInProcess(save_item_id); | 
| 805   if (!save_item) | 807   if (!save_item) | 
| 806     return; | 808     return; | 
| 807 | 809 | 
| 808   // Let SaveItem set end state. | 810   // Let SaveItem set end state. | 
| 809   save_item->Finish(size, is_success); | 811   save_item->Finish(size, is_success); | 
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1037   if (it == frame_tree_node_id_to_save_item_.end()) { | 1039   if (it == frame_tree_node_id_to_save_item_.end()) { | 
| 1038     // Sanitization of renderer IPC - we will have no save item only if | 1040     // Sanitization of renderer IPC - we will have no save item only if | 
| 1039     // the renderer misbehaves and sends OnSerializedHtmlFragment IPC without | 1041     // the renderer misbehaves and sends OnSerializedHtmlFragment IPC without | 
| 1040     // being asked to. | 1042     // being asked to. | 
| 1041     NOTREACHED(); | 1043     NOTREACHED(); | 
| 1042     return; | 1044     return; | 
| 1043   } | 1045   } | 
| 1044   SaveItem* save_item = it->second; | 1046   SaveItem* save_item = it->second; | 
| 1045   DCHECK_EQ(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_item->save_source()); | 1047   DCHECK_EQ(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_item->save_source()); | 
| 1046   if (save_item->state() != SaveItem::IN_PROGRESS) { | 1048   if (save_item->state() != SaveItem::IN_PROGRESS) { | 
| 1047     for (SavedItemMap::iterator saved_it = saved_success_items_.begin(); | 1049     for (const auto& saved_it : saved_success_items_) { | 
| 1048       saved_it != saved_success_items_.end(); ++saved_it) { | 1050       if (saved_it.second->url() == save_item->url()) { | 
| 1049       if (saved_it->second->url() == save_item->url()) { |  | 
| 1050         wrote_to_completed_file_ = true; | 1051         wrote_to_completed_file_ = true; | 
| 1051         break; | 1052         break; | 
| 1052       } | 1053       } | 
| 1053     } | 1054     } | 
| 1054 | 1055 | 
| 1055     auto it2 = saved_failed_items_.find(save_item->id()); | 1056     auto it2 = saved_failed_items_.find(save_item->id()); | 
| 1056     if (it2 != saved_failed_items_.end()) | 1057     if (it2 != saved_failed_items_.end()) | 
| 1057       wrote_to_failed_file_ = true; | 1058       wrote_to_failed_file_ = true; | 
| 1058 | 1059 | 
| 1059     return; | 1060     return; | 
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1494 | 1495 | 
| 1495 void SavePackage::FinalizeDownloadEntry() { | 1496 void SavePackage::FinalizeDownloadEntry() { | 
| 1496   DCHECK(download_); | 1497   DCHECK(download_); | 
| 1497   DCHECK(download_manager_); | 1498   DCHECK(download_manager_); | 
| 1498 | 1499 | 
| 1499   download_manager_->OnSavePackageSuccessfullyFinished(download_); | 1500   download_manager_->OnSavePackageSuccessfullyFinished(download_); | 
| 1500   StopObservation(); | 1501   StopObservation(); | 
| 1501 } | 1502 } | 
| 1502 | 1503 | 
| 1503 }  // namespace content | 1504 }  // namespace content | 
| OLD | NEW | 
|---|