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 if (routing_id == MSG_ROUTING_NONE) | |
Randy Smith (Not in Mondays)
2016/01/22 15:28:39
Is this also due to 541354? If so, could you dupl
Łukasz Anforowicz
2016/01/22 17:39:40
Good point. Right now I think that if |save_item_
Łukasz Anforowicz
2016/01/25 19:04:05
Done (talked with Nasko and used a DCHECK [instead
| |
1038 continue; | |
1039 | |
1040 routing_id_to_local_path[routing_id] = local_path; | |
1041 } | |
1019 } | 1042 } |
1020 } | 1043 } |
1021 | 1044 |
1022 // Ask target frame to serialize itself. | 1045 // Ask target frame to serialize itself. |
1023 RenderFrameHostImpl* target = target_tree_node->current_frame_host(); | |
1024 target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( | 1046 target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( |
1025 target->GetRoutingID(), url_to_local_path)); | 1047 target->GetRoutingID(), url_to_local_path, routing_id_to_local_path)); |
1026 } | 1048 } |
1027 | 1049 |
1028 // Process the serialized HTML content data of a specified frame | 1050 // Process the serialized HTML content data of a specified frame |
1029 // retrieved from the renderer process. | 1051 // retrieved from the renderer process. |
1030 void SavePackage::OnSerializedHtmlWithLocalLinksResponse( | 1052 void SavePackage::OnSerializedHtmlWithLocalLinksResponse( |
1031 RenderFrameHostImpl* sender, | 1053 RenderFrameHostImpl* sender, |
1032 const std::string& data, | 1054 const std::string& data, |
1033 bool end_of_data) { | 1055 bool end_of_data) { |
1034 // Check current state. | 1056 // Check current state. |
1035 if (wait_state_ != HTML_DATA) | 1057 if (wait_state_ != HTML_DATA) |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1149 EnqueueFrame(container_frame_tree_node_id, | 1171 EnqueueFrame(container_frame_tree_node_id, |
1150 subframe_tree_node->frame_tree_node_id(), | 1172 subframe_tree_node->frame_tree_node_id(), |
1151 subframe.original_url); | 1173 subframe.original_url); |
1152 } | 1174 } |
1153 | 1175 |
1154 CompleteSavableResourceLinksResponse(); | 1176 CompleteSavableResourceLinksResponse(); |
1155 } | 1177 } |
1156 | 1178 |
1157 SaveItem* SavePackage::CreatePendingSaveItem( | 1179 SaveItem* SavePackage::CreatePendingSaveItem( |
1158 int container_frame_tree_node_id, | 1180 int container_frame_tree_node_id, |
1181 int save_item_frame_tree_node_id, | |
1159 const GURL& url, | 1182 const GURL& url, |
1160 const Referrer& referrer, | 1183 const Referrer& referrer, |
1161 SaveFileCreateInfo::SaveFileSource save_source) { | 1184 SaveFileCreateInfo::SaveFileSource save_source) { |
1162 DCHECK(url.is_valid()); // |url| should be validated by the callers. | 1185 DCHECK(url.is_valid()); // |url| should be validated by the callers. |
1163 | 1186 |
1164 SaveItem* save_item; | 1187 SaveItem* save_item; |
1165 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); | 1188 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); |
1166 save_item = new SaveItem(url, sanitized_referrer, this, save_source); | 1189 save_item = new SaveItem(url, sanitized_referrer, this, save_source, |
1190 save_item_frame_tree_node_id); | |
1167 waiting_item_queue_.push_back(save_item); | 1191 waiting_item_queue_.push_back(save_item); |
1168 | 1192 |
1169 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] | 1193 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
1170 .push_back(save_item); | 1194 .push_back(save_item); |
1171 return save_item; | 1195 return save_item; |
1172 } | 1196 } |
1173 | 1197 |
1174 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( | 1198 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( |
1175 int container_frame_tree_node_id, | 1199 int container_frame_tree_node_id, |
1200 int save_item_frame_tree_node_id, | |
1176 const GURL& url, | 1201 const GURL& url, |
1177 const Referrer& referrer, | 1202 const Referrer& referrer, |
1178 SaveFileCreateInfo::SaveFileSource save_source) { | 1203 SaveFileCreateInfo::SaveFileSource save_source) { |
1179 DCHECK(url.is_valid()); // |url| should be validated by the callers. | 1204 DCHECK(url.is_valid()); // |url| should be validated by the callers. |
1180 | 1205 |
1181 // Frames should not be deduplicated by URL. | 1206 // Frames should not be deduplicated by URL. |
1182 DCHECK_NE(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_source); | 1207 DCHECK_NE(SaveFileCreateInfo::SAVE_FILE_FROM_DOM, save_source); |
1183 | 1208 |
1184 SaveItem* save_item; | 1209 SaveItem* save_item; |
1185 auto it = url_to_save_item_.find(url); | 1210 auto it = url_to_save_item_.find(url); |
1186 if (it != url_to_save_item_.end()) { | 1211 if (it != url_to_save_item_.end()) { |
1187 save_item = it->second; | 1212 save_item = it->second; |
1188 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] | 1213 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
1189 .push_back(save_item); | 1214 .push_back(save_item); |
1190 } else { | 1215 } else { |
1191 save_item = CreatePendingSaveItem(container_frame_tree_node_id, url, | 1216 save_item = CreatePendingSaveItem(container_frame_tree_node_id, |
1217 save_item_frame_tree_node_id, url, | |
1192 referrer, save_source); | 1218 referrer, save_source); |
1193 url_to_save_item_[url] = save_item; | 1219 url_to_save_item_[url] = save_item; |
1194 } | 1220 } |
1195 | 1221 |
1196 return save_item; | 1222 return save_item; |
1197 } | 1223 } |
1198 | 1224 |
1199 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, | 1225 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, |
1200 const GURL& url, | 1226 const GURL& url, |
1201 const Referrer& referrer) { | 1227 const Referrer& referrer) { |
1202 if (!url.is_valid()) | 1228 if (!url.is_valid()) |
1203 return; | 1229 return; |
1204 | 1230 |
1205 SaveFileCreateInfo::SaveFileSource save_source = | 1231 SaveFileCreateInfo::SaveFileSource save_source = |
1206 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE | 1232 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE |
1207 : SaveFileCreateInfo::SAVE_FILE_FROM_NET; | 1233 : SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
1208 CreatePendingSaveItemDeduplicatingByUrl(container_frame_tree_node_id, url, | 1234 CreatePendingSaveItemDeduplicatingByUrl( |
1209 referrer, save_source); | 1235 container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url, |
1236 referrer, save_source); | |
1210 } | 1237 } |
1211 | 1238 |
1212 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, | 1239 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, |
1213 int frame_tree_node_id, | 1240 int frame_tree_node_id, |
1214 const GURL& frame_original_url) { | 1241 const GURL& frame_original_url) { |
1215 if (!frame_original_url.is_valid()) | 1242 if (!frame_original_url.is_valid()) |
1216 return; | 1243 return; |
1217 | 1244 |
1218 SaveItem* save_item = | 1245 SaveItem* save_item = CreatePendingSaveItem( |
1219 CreatePendingSaveItem(container_frame_tree_node_id, frame_original_url, | 1246 container_frame_tree_node_id, frame_tree_node_id, frame_original_url, |
1220 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); | 1247 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); |
1221 DCHECK(save_item); | 1248 DCHECK(save_item); |
1222 frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; | 1249 frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; |
1223 } | 1250 } |
1224 | 1251 |
1225 void SavePackage::OnSavableResourceLinksError(RenderFrameHostImpl* sender) { | 1252 void SavePackage::OnSavableResourceLinksError(RenderFrameHostImpl* sender) { |
1226 CompleteSavableResourceLinksResponse(); | 1253 CompleteSavableResourceLinksResponse(); |
1227 } | 1254 } |
1228 | 1255 |
1229 void SavePackage::CompleteSavableResourceLinksResponse() { | 1256 void SavePackage::CompleteSavableResourceLinksResponse() { |
1230 --number_of_frames_pending_response_; | 1257 --number_of_frames_pending_response_; |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1500 | 1527 |
1501 void SavePackage::FinalizeDownloadEntry() { | 1528 void SavePackage::FinalizeDownloadEntry() { |
1502 DCHECK(download_); | 1529 DCHECK(download_); |
1503 DCHECK(download_manager_); | 1530 DCHECK(download_manager_); |
1504 | 1531 |
1505 download_manager_->OnSavePackageSuccessfullyFinished(download_); | 1532 download_manager_->OnSavePackageSuccessfullyFinished(download_); |
1506 StopObservation(); | 1533 StopObservation(); |
1507 } | 1534 } |
1508 | 1535 |
1509 } // namespace content | 1536 } // namespace content |
OLD | NEW |