| 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 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 GetSavableResourceLinks(); | 341 GetSavableResourceLinks(); |
| 342 } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) { | 342 } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) { |
| 343 web_contents()->GenerateMHTML(saved_main_file_path_, base::Bind( | 343 web_contents()->GenerateMHTML(saved_main_file_path_, base::Bind( |
| 344 &SavePackage::OnMHTMLGenerated, this)); | 344 &SavePackage::OnMHTMLGenerated, this)); |
| 345 } else { | 345 } else { |
| 346 DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_); | 346 DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_); |
| 347 wait_state_ = NET_FILES; | 347 wait_state_ = NET_FILES; |
| 348 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? | 348 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? |
| 349 SaveFileCreateInfo::SAVE_FILE_FROM_FILE : | 349 SaveFileCreateInfo::SAVE_FILE_FROM_FILE : |
| 350 SaveFileCreateInfo::SAVE_FILE_FROM_NET; | 350 SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
| 351 SaveItem* save_item = new SaveItem(page_url_, | 351 SaveItem* save_item = new SaveItem(page_url_, Referrer(), this, save_source, |
| 352 Referrer(), | 352 FrameTreeNode::kFrameTreeNodeInvalidID); |
| 353 this, | |
| 354 save_source); | |
| 355 // Add this item to waiting list. | 353 // Add this item to waiting list. |
| 356 waiting_item_queue_.push_back(save_item); | 354 waiting_item_queue_.push_back(save_item); |
| 357 all_save_items_count_ = 1; | 355 all_save_items_count_ = 1; |
| 358 download_->SetTotalBytes(1); | 356 download_->SetTotalBytes(1); |
| 359 | 357 |
| 360 DoSavingProcess(); | 358 DoSavingProcess(); |
| 361 } | 359 } |
| 362 } | 360 } |
| 363 | 361 |
| 364 void SavePackage::OnMHTMLGenerated(int64 size) { | 362 void SavePackage::OnMHTMLGenerated(int64 size) { |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 540 |
| 543 DCHECK(!file_name.empty()); | 541 DCHECK(!file_name.empty()); |
| 544 generated_name->assign(file_name); | 542 generated_name->assign(file_name); |
| 545 | 543 |
| 546 return true; | 544 return true; |
| 547 } | 545 } |
| 548 | 546 |
| 549 // We have received a message from SaveFileManager about a new saving job. We | 547 // We have received a message from SaveFileManager about a new saving job. We |
| 550 // find a SaveItem and store it in our in_progress list. | 548 // find a SaveItem and store it in our in_progress list. |
| 551 void SavePackage::StartSave(const SaveFileCreateInfo* info) { | 549 void SavePackage::StartSave(const SaveFileCreateInfo* info) { |
| 552 DCHECK(info && !info->url.is_empty()); | 550 DCHECK(info); |
| 551 if (info->save_source != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) |
| 552 DCHECK(!info->url.is_empty()); |
| 553 | 553 |
| 554 SaveItemIdMap::iterator it = in_progress_items_.find(info->save_item_id); | 554 SaveItemIdMap::iterator it = in_progress_items_.find(info->save_item_id); |
| 555 if (it == in_progress_items_.end()) { | 555 if (it == in_progress_items_.end()) { |
| 556 // If not found, we must have cancel action. | 556 // If not found, we must have cancel action. |
| 557 DCHECK(canceled()); | 557 DCHECK(canceled()); |
| 558 return; | 558 return; |
| 559 } | 559 } |
| 560 SaveItem* save_item = it->second; | 560 SaveItem* save_item = it->second; |
| 561 | 561 |
| 562 DCHECK(!saved_main_file_path_.empty()); | 562 DCHECK(!saved_main_file_path_.empty()); |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 // All frames disappeared since gathering of savable resources? | 987 // All frames disappeared since gathering of savable resources? |
| 988 // Treat this as cancellation. | 988 // Treat this as cancellation. |
| 989 Cancel(false); | 989 Cancel(false); |
| 990 } | 990 } |
| 991 } | 991 } |
| 992 | 992 |
| 993 void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( | 993 void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( |
| 994 FrameTreeNode* target_tree_node) { | 994 FrameTreeNode* target_tree_node) { |
| 995 DCHECK(target_tree_node); | 995 DCHECK(target_tree_node); |
| 996 int target_frame_tree_node_id = target_tree_node->frame_tree_node_id(); | 996 int target_frame_tree_node_id = target_tree_node->frame_tree_node_id(); |
| 997 RenderFrameHostImpl* target = target_tree_node->current_frame_host(); |
| 997 | 998 |
| 998 // Collect all saved success items. | 999 // Collect all saved success items. |
| 999 // SECURITY NOTE: We don't send *all* urls / local paths, but only | 1000 // SECURITY NOTE: We don't send *all* urls / local paths, but only |
| 1000 // those that the given frame had access to already (because it contained | 1001 // those that the given frame had access to already (because it contained |
| 1001 // the savable resources / subframes associated with save items). | 1002 // the savable resources / subframes associated with save items). |
| 1002 std::map<GURL, base::FilePath> url_to_local_path; | 1003 std::map<GURL, base::FilePath> url_to_local_path; |
| 1004 std::map<int, base::FilePath> routing_id_to_local_path; |
| 1003 auto it = frame_tree_node_id_to_contained_save_items_.find( | 1005 auto it = frame_tree_node_id_to_contained_save_items_.find( |
| 1004 target_frame_tree_node_id); | 1006 target_frame_tree_node_id); |
| 1005 if (it != frame_tree_node_id_to_contained_save_items_.end()) { | 1007 if (it != frame_tree_node_id_to_contained_save_items_.end()) { |
| 1006 for (SaveItem* save_item : it->second) { | 1008 for (SaveItem* save_item : it->second) { |
| 1009 // Calculate the local link to use for this |save_item|. |
| 1007 DCHECK(save_item->has_final_name()); | 1010 DCHECK(save_item->has_final_name()); |
| 1008 base::FilePath local_path(base::FilePath::kCurrentDirectory); | 1011 base::FilePath local_path(base::FilePath::kCurrentDirectory); |
| 1009 if (target_tree_node->IsMainFrame()) { | 1012 if (target_tree_node->IsMainFrame()) { |
| 1010 local_path = local_path.Append(saved_main_directory_path_.BaseName()); | 1013 local_path = local_path.Append(saved_main_directory_path_.BaseName()); |
| 1011 } | 1014 } |
| 1012 local_path = local_path.Append(save_item->file_name()); | 1015 local_path = local_path.Append(save_item->file_name()); |
| 1013 url_to_local_path[save_item->url()] = local_path; | 1016 |
| 1017 // Insert the link into |url_to_local_path| or |routing_id_to_local_path|. |
| 1018 if (save_item->save_source() != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) { |
| 1019 DCHECK_EQ(FrameTreeNode::kFrameTreeNodeInvalidID, |
| 1020 save_item->frame_tree_node_id()); |
| 1021 url_to_local_path[save_item->url()] = local_path; |
| 1022 } else { |
| 1023 FrameTreeNode* save_item_frame_tree_node = |
| 1024 target_tree_node->frame_tree()->FindByID( |
| 1025 save_item->frame_tree_node_id()); |
| 1026 if (!save_item_frame_tree_node) |
| 1027 continue; |
| 1028 |
| 1029 int routing_id = |
| 1030 save_item_frame_tree_node->render_manager() |
| 1031 ->GetRoutingIdForSiteInstance(target->GetSiteInstance()); |
| 1032 if (routing_id == MSG_ROUTING_NONE) |
| 1033 continue; |
| 1034 |
| 1035 routing_id_to_local_path[routing_id] = local_path; |
| 1036 } |
| 1014 } | 1037 } |
| 1015 } | 1038 } |
| 1016 | 1039 |
| 1017 // Ask target frame to serialize itself. | 1040 // Ask target frame to serialize itself. |
| 1018 RenderFrameHostImpl* target = target_tree_node->current_frame_host(); | |
| 1019 target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( | 1041 target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( |
| 1020 target->GetRoutingID(), url_to_local_path)); | 1042 target->GetRoutingID(), url_to_local_path, routing_id_to_local_path)); |
| 1021 } | 1043 } |
| 1022 | 1044 |
| 1023 // Process the serialized HTML content data of a specified frame | 1045 // Process the serialized HTML content data of a specified frame |
| 1024 // retrieved from the renderer process. | 1046 // retrieved from the renderer process. |
| 1025 void SavePackage::OnSerializedHtmlWithLocalLinksResponse( | 1047 void SavePackage::OnSerializedHtmlWithLocalLinksResponse( |
| 1026 RenderFrameHostImpl* sender, | 1048 RenderFrameHostImpl* sender, |
| 1027 const std::string& data, | 1049 const std::string& data, |
| 1028 bool end_of_data) { | 1050 bool end_of_data) { |
| 1029 // Check current state. | 1051 // Check current state. |
| 1030 if (wait_state_ != HTML_DATA) | 1052 if (wait_state_ != HTML_DATA) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1096 &SavePackage::GetSavableResourceLinksForFrame, | 1118 &SavePackage::GetSavableResourceLinksForFrame, |
| 1097 base::Unretained(this))); // Safe, because ForEachFrame is synchronous. | 1119 base::Unretained(this))); // Safe, because ForEachFrame is synchronous. |
| 1098 DCHECK_LT(0, number_of_frames_pending_response_); | 1120 DCHECK_LT(0, number_of_frames_pending_response_); |
| 1099 | 1121 |
| 1100 // Enqueue the main frame separately (because this frame won't show up in any | 1122 // Enqueue the main frame separately (because this frame won't show up in any |
| 1101 // of OnSavableResourceLinksResponse callbacks). | 1123 // of OnSavableResourceLinksResponse callbacks). |
| 1102 FrameTreeNode* main_frame_tree_node = | 1124 FrameTreeNode* main_frame_tree_node = |
| 1103 static_cast<RenderFrameHostImpl*>(web_contents()->GetMainFrame()) | 1125 static_cast<RenderFrameHostImpl*>(web_contents()->GetMainFrame()) |
| 1104 ->frame_tree_node(); | 1126 ->frame_tree_node(); |
| 1105 EnqueueFrame(FrameTreeNode::kFrameTreeNodeInvalidID, // No container. | 1127 EnqueueFrame(FrameTreeNode::kFrameTreeNodeInvalidID, // No container. |
| 1106 main_frame_tree_node->frame_tree_node_id(), | 1128 main_frame_tree_node->frame_tree_node_id(), page_url_); |
| 1107 main_frame_tree_node->current_url()); | |
| 1108 } | 1129 } |
| 1109 | 1130 |
| 1110 void SavePackage::GetSavableResourceLinksForFrame(RenderFrameHost* target) { | 1131 void SavePackage::GetSavableResourceLinksForFrame(RenderFrameHost* target) { |
| 1111 number_of_frames_pending_response_++; | 1132 number_of_frames_pending_response_++; |
| 1112 target->Send(new FrameMsg_GetSavableResourceLinks(target->GetRoutingID())); | 1133 target->Send(new FrameMsg_GetSavableResourceLinks(target->GetRoutingID())); |
| 1113 } | 1134 } |
| 1114 | 1135 |
| 1115 void SavePackage::OnSavableResourceLinksResponse( | 1136 void SavePackage::OnSavableResourceLinksResponse( |
| 1116 RenderFrameHostImpl* sender, | 1137 RenderFrameHostImpl* sender, |
| 1117 const std::vector<GURL>& resources_list, | 1138 const std::vector<GURL>& resources_list, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1141 EnqueueFrame(container_frame_tree_node_id, | 1162 EnqueueFrame(container_frame_tree_node_id, |
| 1142 subframe_tree_node->frame_tree_node_id(), | 1163 subframe_tree_node->frame_tree_node_id(), |
| 1143 subframe.original_url); | 1164 subframe.original_url); |
| 1144 } | 1165 } |
| 1145 | 1166 |
| 1146 CompleteSavableResourceLinksResponse(); | 1167 CompleteSavableResourceLinksResponse(); |
| 1147 } | 1168 } |
| 1148 | 1169 |
| 1149 SaveItem* SavePackage::CreatePendingSaveItem( | 1170 SaveItem* SavePackage::CreatePendingSaveItem( |
| 1150 int container_frame_tree_node_id, | 1171 int container_frame_tree_node_id, |
| 1172 int save_item_frame_tree_node_id, |
| 1151 const GURL& url, | 1173 const GURL& url, |
| 1152 const Referrer& referrer, | 1174 const Referrer& referrer, |
| 1153 SaveFileCreateInfo::SaveFileSource save_source) { | 1175 SaveFileCreateInfo::SaveFileSource save_source) { |
| 1154 DCHECK(url.is_valid()); // |url| should be validated by the callers. | 1176 DCHECK(url.is_valid()); // |url| should be validated by the callers. |
| 1155 | 1177 |
| 1156 SaveItem* save_item; | 1178 SaveItem* save_item; |
| 1157 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); | 1179 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); |
| 1158 save_item = new SaveItem(url, sanitized_referrer, this, save_source); | 1180 save_item = new SaveItem(url, sanitized_referrer, this, save_source, |
| 1181 save_item_frame_tree_node_id); |
| 1159 waiting_item_queue_.push_back(save_item); | 1182 waiting_item_queue_.push_back(save_item); |
| 1160 | 1183 |
| 1161 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] | 1184 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
| 1162 .push_back(save_item); | 1185 .push_back(save_item); |
| 1163 return save_item; | 1186 return save_item; |
| 1164 } | 1187 } |
| 1165 | 1188 |
| 1166 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( | 1189 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( |
| 1167 int container_frame_tree_node_id, | 1190 int container_frame_tree_node_id, |
| 1191 int save_item_frame_tree_node_id, |
| 1168 const GURL& url, | 1192 const GURL& url, |
| 1169 const Referrer& referrer, | 1193 const Referrer& referrer, |
| 1170 SaveFileCreateInfo::SaveFileSource save_source) { | 1194 SaveFileCreateInfo::SaveFileSource save_source) { |
| 1171 DCHECK(url.is_valid()); // |url| should be validated by the callers. | 1195 DCHECK(url.is_valid()); // |url| should be validated by the callers. |
| 1172 | 1196 |
| 1173 // Frames should not be deduplicated by URL. | 1197 // Frames should not be deduplicated by URL. |
| 1174 DCHECK_NE(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_source); | 1198 DCHECK_NE(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_source); |
| 1175 | 1199 |
| 1176 SaveItem* save_item; | 1200 SaveItem* save_item; |
| 1177 auto it = url_to_save_item_.find(url); | 1201 auto it = url_to_save_item_.find(url); |
| 1178 if (it != url_to_save_item_.end()) { | 1202 if (it != url_to_save_item_.end()) { |
| 1179 save_item = it->second; | 1203 save_item = it->second; |
| 1180 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] | 1204 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
| 1181 .push_back(save_item); | 1205 .push_back(save_item); |
| 1182 } else { | 1206 } else { |
| 1183 save_item = CreatePendingSaveItem(container_frame_tree_node_id, url, | 1207 save_item = CreatePendingSaveItem(container_frame_tree_node_id, |
| 1208 save_item_frame_tree_node_id, url, |
| 1184 referrer, save_source); | 1209 referrer, save_source); |
| 1185 url_to_save_item_[url] = save_item; | 1210 url_to_save_item_[url] = save_item; |
| 1186 } | 1211 } |
| 1187 | 1212 |
| 1188 return save_item; | 1213 return save_item; |
| 1189 } | 1214 } |
| 1190 | 1215 |
| 1191 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, | 1216 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, |
| 1192 const GURL& url, | 1217 const GURL& url, |
| 1193 const Referrer& referrer) { | 1218 const Referrer& referrer) { |
| 1194 if (!url.is_valid()) | 1219 if (!url.is_valid()) |
| 1195 return; | 1220 return; |
| 1196 | 1221 |
| 1197 SaveFileCreateInfo::SaveFileSource save_source = | 1222 SaveFileCreateInfo::SaveFileSource save_source = |
| 1198 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE | 1223 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE |
| 1199 : SaveFileCreateInfo::SAVE_FILE_FROM_NET; | 1224 : SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
| 1200 CreatePendingSaveItemDeduplicatingByUrl(container_frame_tree_node_id, url, | 1225 CreatePendingSaveItemDeduplicatingByUrl( |
| 1201 referrer, save_source); | 1226 container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidID, url, |
| 1227 referrer, save_source); |
| 1202 } | 1228 } |
| 1203 | 1229 |
| 1204 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, | 1230 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, |
| 1205 int frame_tree_node_id, | 1231 int frame_tree_node_id, |
| 1206 const GURL& frame_original_url) { | 1232 const GURL& frame_original_url) { |
| 1207 if (!frame_original_url.is_valid()) | 1233 if (!frame_original_url.is_valid()) |
| 1208 return; | 1234 return; |
| 1209 | 1235 |
| 1210 SaveItem* save_item = | 1236 SaveItem* save_item = CreatePendingSaveItem( |
| 1211 CreatePendingSaveItem(container_frame_tree_node_id, frame_original_url, | 1237 container_frame_tree_node_id, frame_tree_node_id, frame_original_url, |
| 1212 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); | 1238 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); |
| 1213 DCHECK(save_item); | 1239 DCHECK(save_item); |
| 1214 frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; | 1240 frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; |
| 1215 } | 1241 } |
| 1216 | 1242 |
| 1217 void SavePackage::OnSavableResourceLinksError(RenderFrameHostImpl* sender) { | 1243 void SavePackage::OnSavableResourceLinksError(RenderFrameHostImpl* sender) { |
| 1218 CompleteSavableResourceLinksResponse(); | 1244 CompleteSavableResourceLinksResponse(); |
| 1219 } | 1245 } |
| 1220 | 1246 |
| 1221 void SavePackage::CompleteSavableResourceLinksResponse() { | 1247 void SavePackage::CompleteSavableResourceLinksResponse() { |
| 1222 --number_of_frames_pending_response_; | 1248 --number_of_frames_pending_response_; |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1492 | 1518 |
| 1493 void SavePackage::FinalizeDownloadEntry() { | 1519 void SavePackage::FinalizeDownloadEntry() { |
| 1494 DCHECK(download_); | 1520 DCHECK(download_); |
| 1495 DCHECK(download_manager_); | 1521 DCHECK(download_manager_); |
| 1496 | 1522 |
| 1497 download_manager_->OnSavePackageSuccessfullyFinished(download_); | 1523 download_manager_->OnSavePackageSuccessfullyFinished(download_); |
| 1498 StopObservation(); | 1524 StopObservation(); |
| 1499 } | 1525 } |
| 1500 | 1526 |
| 1501 } // namespace content | 1527 } // namespace content |
| OLD | NEW |