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

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: Method signature changes: rewriteFrameSource + s/const WebFrame&/WebFrame*/ 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
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 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698