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

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 4 years, 11 months 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
« no previous file with comments | « content/browser/download/save_package.h ('k') | content/common/frame_messages.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/download/save_package.h ('k') | content/common/frame_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698