| 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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 GetSavableResourceLinks(); | 347 GetSavableResourceLinks(); |
| 348 } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) { | 348 } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) { |
| 349 web_contents()->GenerateMHTML(saved_main_file_path_, base::Bind( | 349 web_contents()->GenerateMHTML(saved_main_file_path_, base::Bind( |
| 350 &SavePackage::OnMHTMLGenerated, this)); | 350 &SavePackage::OnMHTMLGenerated, this)); |
| 351 } else { | 351 } else { |
| 352 DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_); | 352 DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_); |
| 353 wait_state_ = NET_FILES; | 353 wait_state_ = NET_FILES; |
| 354 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? | 354 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? |
| 355 SaveFileCreateInfo::SAVE_FILE_FROM_FILE : | 355 SaveFileCreateInfo::SAVE_FILE_FROM_FILE : |
| 356 SaveFileCreateInfo::SAVE_FILE_FROM_NET; | 356 SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
| 357 SaveItem* save_item = new SaveItem(page_url_, | 357 SaveItem* save_item = new SaveItem(page_url_, Referrer(), this, save_source, |
| 358 Referrer(), | 358 FrameTreeNode::kFrameTreeNodeInvalidId); |
| 359 this, | |
| 360 save_source); | |
| 361 // Add this item to waiting list. | 359 // Add this item to waiting list. |
| 362 waiting_item_queue_.push_back(save_item); | 360 waiting_item_queue_.push_back(save_item); |
| 363 all_save_items_count_ = 1; | 361 all_save_items_count_ = 1; |
| 364 download_->SetTotalBytes(1); | 362 download_->SetTotalBytes(1); |
| 365 | 363 |
| 366 DoSavingProcess(); | 364 DoSavingProcess(); |
| 367 } | 365 } |
| 368 } | 366 } |
| 369 | 367 |
| 370 void SavePackage::OnMHTMLGenerated(int64_t size) { | 368 void SavePackage::OnMHTMLGenerated(int64_t size) { |
| (...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 // All frames disappeared since gathering of savable resources? | 990 // All frames disappeared since gathering of savable resources? |
| 993 // Treat this as cancellation. | 991 // Treat this as cancellation. |
| 994 Cancel(false); | 992 Cancel(false); |
| 995 } | 993 } |
| 996 } | 994 } |
| 997 | 995 |
| 998 void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( | 996 void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( |
| 999 FrameTreeNode* target_tree_node) { | 997 FrameTreeNode* target_tree_node) { |
| 1000 DCHECK(target_tree_node); | 998 DCHECK(target_tree_node); |
| 1001 int target_frame_tree_node_id = target_tree_node->frame_tree_node_id(); | 999 int target_frame_tree_node_id = target_tree_node->frame_tree_node_id(); |
| 1000 RenderFrameHostImpl* target = target_tree_node->current_frame_host(); |
| 1002 | 1001 |
| 1003 // Collect all saved success items. | 1002 // Collect all saved success items. |
| 1004 // SECURITY NOTE: We don't send *all* urls / local paths, but only | 1003 // SECURITY NOTE: We don't send *all* urls / local paths, but only |
| 1005 // those that the given frame had access to already (because it contained | 1004 // those that the given frame had access to already (because it contained |
| 1006 // the savable resources / subframes associated with save items). | 1005 // the savable resources / subframes associated with save items). |
| 1007 std::map<GURL, base::FilePath> url_to_local_path; | 1006 std::map<GURL, base::FilePath> url_to_local_path; |
| 1007 std::map<int, base::FilePath> routing_id_to_local_path; |
| 1008 auto it = frame_tree_node_id_to_contained_save_items_.find( | 1008 auto it = frame_tree_node_id_to_contained_save_items_.find( |
| 1009 target_frame_tree_node_id); | 1009 target_frame_tree_node_id); |
| 1010 if (it != frame_tree_node_id_to_contained_save_items_.end()) { | 1010 if (it != frame_tree_node_id_to_contained_save_items_.end()) { |
| 1011 for (SaveItem* save_item : it->second) { | 1011 for (SaveItem* save_item : it->second) { |
| 1012 // Calculate the local link to use for this |save_item|. |
| 1012 DCHECK(save_item->has_final_name()); | 1013 DCHECK(save_item->has_final_name()); |
| 1013 base::FilePath local_path(base::FilePath::kCurrentDirectory); | 1014 base::FilePath local_path(base::FilePath::kCurrentDirectory); |
| 1014 if (target_tree_node->IsMainFrame()) { | 1015 if (target_tree_node->IsMainFrame()) { |
| 1015 local_path = local_path.Append(saved_main_directory_path_.BaseName()); | 1016 local_path = local_path.Append(saved_main_directory_path_.BaseName()); |
| 1016 } | 1017 } |
| 1017 local_path = local_path.Append(save_item->file_name()); | 1018 local_path = local_path.Append(save_item->file_name()); |
| 1018 url_to_local_path[save_item->url()] = local_path; | 1019 |
| 1020 // Insert the link into |url_to_local_path| or |routing_id_to_local_path|. |
| 1021 if (save_item->save_source() != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) { |
| 1022 DCHECK_EQ(FrameTreeNode::kFrameTreeNodeInvalidId, |
| 1023 save_item->frame_tree_node_id()); |
| 1024 url_to_local_path[save_item->url()] = local_path; |
| 1025 } else { |
| 1026 FrameTreeNode* save_item_frame_tree_node = |
| 1027 target_tree_node->frame_tree()->FindByID( |
| 1028 save_item->frame_tree_node_id()); |
| 1029 if (!save_item_frame_tree_node) { |
| 1030 // crbug.com/541354: Raciness when saving a dynamically changing page. |
| 1031 continue; |
| 1032 } |
| 1033 |
| 1034 int routing_id = |
| 1035 save_item_frame_tree_node->render_manager() |
| 1036 ->GetRoutingIdForSiteInstance(target->GetSiteInstance()); |
| 1037 DCHECK_NE(MSG_ROUTING_NONE, routing_id); |
| 1038 |
| 1039 routing_id_to_local_path[routing_id] = local_path; |
| 1040 } |
| 1019 } | 1041 } |
| 1020 } | 1042 } |
| 1021 | 1043 |
| 1022 // Ask target frame to serialize itself. | 1044 // Ask target frame to serialize itself. |
| 1023 RenderFrameHostImpl* target = target_tree_node->current_frame_host(); | |
| 1024 target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( | 1045 target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( |
| 1025 target->GetRoutingID(), url_to_local_path)); | 1046 target->GetRoutingID(), url_to_local_path, routing_id_to_local_path)); |
| 1026 } | 1047 } |
| 1027 | 1048 |
| 1028 // Process the serialized HTML content data of a specified frame | 1049 // Process the serialized HTML content data of a specified frame |
| 1029 // retrieved from the renderer process. | 1050 // retrieved from the renderer process. |
| 1030 void SavePackage::OnSerializedHtmlWithLocalLinksResponse( | 1051 void SavePackage::OnSerializedHtmlWithLocalLinksResponse( |
| 1031 RenderFrameHostImpl* sender, | 1052 RenderFrameHostImpl* sender, |
| 1032 const std::string& data, | 1053 const std::string& data, |
| 1033 bool end_of_data) { | 1054 bool end_of_data) { |
| 1034 // Check current state. | 1055 // Check current state. |
| 1035 if (wait_state_ != HTML_DATA) | 1056 if (wait_state_ != HTML_DATA) |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 EnqueueFrame(container_frame_tree_node_id, | 1164 EnqueueFrame(container_frame_tree_node_id, |
| 1144 subframe_tree_node->frame_tree_node_id(), | 1165 subframe_tree_node->frame_tree_node_id(), |
| 1145 subframe.original_url); | 1166 subframe.original_url); |
| 1146 } | 1167 } |
| 1147 | 1168 |
| 1148 CompleteSavableResourceLinksResponse(); | 1169 CompleteSavableResourceLinksResponse(); |
| 1149 } | 1170 } |
| 1150 | 1171 |
| 1151 SaveItem* SavePackage::CreatePendingSaveItem( | 1172 SaveItem* SavePackage::CreatePendingSaveItem( |
| 1152 int container_frame_tree_node_id, | 1173 int container_frame_tree_node_id, |
| 1174 int save_item_frame_tree_node_id, |
| 1153 const GURL& url, | 1175 const GURL& url, |
| 1154 const Referrer& referrer, | 1176 const Referrer& referrer, |
| 1155 SaveFileCreateInfo::SaveFileSource save_source) { | 1177 SaveFileCreateInfo::SaveFileSource save_source) { |
| 1156 DCHECK(url.is_valid()); // |url| should be validated by the callers. | 1178 DCHECK(url.is_valid()); // |url| should be validated by the callers. |
| 1157 | 1179 |
| 1158 SaveItem* save_item; | 1180 SaveItem* save_item; |
| 1159 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); | 1181 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); |
| 1160 save_item = new SaveItem(url, sanitized_referrer, this, save_source); | 1182 save_item = new SaveItem(url, sanitized_referrer, this, save_source, |
| 1183 save_item_frame_tree_node_id); |
| 1161 waiting_item_queue_.push_back(save_item); | 1184 waiting_item_queue_.push_back(save_item); |
| 1162 | 1185 |
| 1163 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] | 1186 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
| 1164 .push_back(save_item); | 1187 .push_back(save_item); |
| 1165 return save_item; | 1188 return save_item; |
| 1166 } | 1189 } |
| 1167 | 1190 |
| 1168 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( | 1191 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( |
| 1169 int container_frame_tree_node_id, | 1192 int container_frame_tree_node_id, |
| 1193 int save_item_frame_tree_node_id, |
| 1170 const GURL& url, | 1194 const GURL& url, |
| 1171 const Referrer& referrer, | 1195 const Referrer& referrer, |
| 1172 SaveFileCreateInfo::SaveFileSource save_source) { | 1196 SaveFileCreateInfo::SaveFileSource save_source) { |
| 1173 DCHECK(url.is_valid()); // |url| should be validated by the callers. | 1197 DCHECK(url.is_valid()); // |url| should be validated by the callers. |
| 1174 | 1198 |
| 1175 // Frames should not be deduplicated by URL. | 1199 // Frames should not be deduplicated by URL. |
| 1176 DCHECK_NE(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_source); | 1200 DCHECK_NE(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_source); |
| 1177 | 1201 |
| 1178 SaveItem* save_item; | 1202 SaveItem* save_item; |
| 1179 auto it = url_to_save_item_.find(url); | 1203 auto it = url_to_save_item_.find(url); |
| 1180 if (it != url_to_save_item_.end()) { | 1204 if (it != url_to_save_item_.end()) { |
| 1181 save_item = it->second; | 1205 save_item = it->second; |
| 1182 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] | 1206 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
| 1183 .push_back(save_item); | 1207 .push_back(save_item); |
| 1184 } else { | 1208 } else { |
| 1185 save_item = CreatePendingSaveItem(container_frame_tree_node_id, url, | 1209 save_item = CreatePendingSaveItem(container_frame_tree_node_id, |
| 1210 save_item_frame_tree_node_id, url, |
| 1186 referrer, save_source); | 1211 referrer, save_source); |
| 1187 url_to_save_item_[url] = save_item; | 1212 url_to_save_item_[url] = save_item; |
| 1188 } | 1213 } |
| 1189 | 1214 |
| 1190 return save_item; | 1215 return save_item; |
| 1191 } | 1216 } |
| 1192 | 1217 |
| 1193 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, | 1218 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, |
| 1194 const GURL& url, | 1219 const GURL& url, |
| 1195 const Referrer& referrer) { | 1220 const Referrer& referrer) { |
| 1196 if (!url.is_valid()) | 1221 if (!url.is_valid()) |
| 1197 return; | 1222 return; |
| 1198 | 1223 |
| 1199 SaveFileCreateInfo::SaveFileSource save_source = | 1224 SaveFileCreateInfo::SaveFileSource save_source = |
| 1200 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE | 1225 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE |
| 1201 : SaveFileCreateInfo::SAVE_FILE_FROM_NET; | 1226 : SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
| 1202 CreatePendingSaveItemDeduplicatingByUrl(container_frame_tree_node_id, url, | 1227 CreatePendingSaveItemDeduplicatingByUrl( |
| 1203 referrer, save_source); | 1228 container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url, |
| 1229 referrer, save_source); |
| 1204 } | 1230 } |
| 1205 | 1231 |
| 1206 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, | 1232 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, |
| 1207 int frame_tree_node_id, | 1233 int frame_tree_node_id, |
| 1208 const GURL& frame_original_url) { | 1234 const GURL& frame_original_url) { |
| 1209 if (!frame_original_url.is_valid()) | 1235 if (!frame_original_url.is_valid()) |
| 1210 return; | 1236 return; |
| 1211 | 1237 |
| 1212 SaveItem* save_item = | 1238 SaveItem* save_item = CreatePendingSaveItem( |
| 1213 CreatePendingSaveItem(container_frame_tree_node_id, frame_original_url, | 1239 container_frame_tree_node_id, frame_tree_node_id, frame_original_url, |
| 1214 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); | 1240 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); |
| 1215 DCHECK(save_item); | 1241 DCHECK(save_item); |
| 1216 frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; | 1242 frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; |
| 1217 } | 1243 } |
| 1218 | 1244 |
| 1219 void SavePackage::OnSavableResourceLinksError(RenderFrameHostImpl* sender) { | 1245 void SavePackage::OnSavableResourceLinksError(RenderFrameHostImpl* sender) { |
| 1220 CompleteSavableResourceLinksResponse(); | 1246 CompleteSavableResourceLinksResponse(); |
| 1221 } | 1247 } |
| 1222 | 1248 |
| 1223 void SavePackage::CompleteSavableResourceLinksResponse() { | 1249 void SavePackage::CompleteSavableResourceLinksResponse() { |
| 1224 --number_of_frames_pending_response_; | 1250 --number_of_frames_pending_response_; |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1494 | 1520 |
| 1495 void SavePackage::FinalizeDownloadEntry() { | 1521 void SavePackage::FinalizeDownloadEntry() { |
| 1496 DCHECK(download_); | 1522 DCHECK(download_); |
| 1497 DCHECK(download_manager_); | 1523 DCHECK(download_manager_); |
| 1498 | 1524 |
| 1499 download_manager_->OnSavePackageSuccessfullyFinished(download_); | 1525 download_manager_->OnSavePackageSuccessfullyFinished(download_); |
| 1500 StopObservation(); | 1526 StopObservation(); |
| 1501 } | 1527 } |
| 1502 | 1528 |
| 1503 } // namespace content | 1529 } // namespace content |
| OLD | NEW |