Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: content/browser/download/save_package.cc

Issue 1502563004: Save-Page-As-Complete-Html: Each frame links to a distinct local file. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@no-url-deduping-for-frame-and-adding-save-item-id
Patch Set: Rebasing... Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698