Index: content/browser/download/save_package.cc |
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc |
index ae742bcbd5cf6c2f8649658fdf760a0298424319..9466dd27634b804439ab27e9ac2c92d836b2d4a8 100644 |
--- a/content/browser/download/save_package.cc |
+++ b/content/browser/download/save_package.cc |
@@ -348,10 +348,8 @@ void SavePackage::InitWithDownloadItem( |
SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? |
SaveFileCreateInfo::SAVE_FILE_FROM_FILE : |
SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
- SaveItem* save_item = new SaveItem(page_url_, |
- Referrer(), |
- this, |
- save_source); |
+ SaveItem* save_item = new SaveItem(page_url_, Referrer(), this, save_source, |
+ FrameTreeNode::kFrameTreeNodeInvalidID); |
// Add this item to waiting list. |
waiting_item_queue_.push_back(save_item); |
all_save_items_count_ = 1; |
@@ -549,7 +547,9 @@ bool SavePackage::GenerateFileName(const std::string& disposition, |
// We have received a message from SaveFileManager about a new saving job. We |
// find a SaveItem and store it in our in_progress list. |
void SavePackage::StartSave(const SaveFileCreateInfo* info) { |
- DCHECK(info && !info->url.is_empty()); |
+ DCHECK(info); |
+ if (info->save_source != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) |
+ DCHECK(!info->url.is_empty()); |
SaveItemIdMap::iterator it = in_progress_items_.find(info->save_item_id); |
if (it == in_progress_items_.end()) { |
@@ -994,30 +994,52 @@ void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( |
FrameTreeNode* target_tree_node) { |
DCHECK(target_tree_node); |
int target_frame_tree_node_id = target_tree_node->frame_tree_node_id(); |
+ RenderFrameHostImpl* target = target_tree_node->current_frame_host(); |
// Collect all saved success items. |
// SECURITY NOTE: We don't send *all* urls / local paths, but only |
// those that the given frame had access to already (because it contained |
// the savable resources / subframes associated with save items). |
std::map<GURL, base::FilePath> url_to_local_path; |
+ std::map<int, base::FilePath> routing_id_to_local_path; |
auto it = frame_tree_node_id_to_contained_save_items_.find( |
target_frame_tree_node_id); |
if (it != frame_tree_node_id_to_contained_save_items_.end()) { |
for (SaveItem* save_item : it->second) { |
+ // Calculate the local link to use for this |save_item|. |
DCHECK(save_item->has_final_name()); |
base::FilePath local_path(base::FilePath::kCurrentDirectory); |
if (target_tree_node->IsMainFrame()) { |
local_path = local_path.Append(saved_main_directory_path_.BaseName()); |
} |
local_path = local_path.Append(save_item->file_name()); |
- url_to_local_path[save_item->url()] = local_path; |
+ |
+ // Insert the link into |url_to_local_path| or |routing_id_to_local_path|. |
+ if (save_item->save_source() != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) { |
+ DCHECK_EQ(FrameTreeNode::kFrameTreeNodeInvalidID, |
+ save_item->frame_tree_node_id()); |
+ url_to_local_path[save_item->url()] = local_path; |
+ } else { |
+ FrameTreeNode* save_item_frame_tree_node = |
+ target_tree_node->frame_tree()->FindByID( |
+ save_item->frame_tree_node_id()); |
+ if (!save_item_frame_tree_node) |
+ continue; |
+ |
+ int routing_id = |
+ save_item_frame_tree_node->render_manager() |
+ ->GetRoutingIdForSiteInstance(target->GetSiteInstance()); |
+ if (routing_id == MSG_ROUTING_NONE) |
+ continue; |
+ |
+ routing_id_to_local_path[routing_id] = local_path; |
+ } |
} |
} |
// Ask target frame to serialize itself. |
- RenderFrameHostImpl* target = target_tree_node->current_frame_host(); |
target->Send(new FrameMsg_GetSerializedHtmlWithLocalLinks( |
- target->GetRoutingID(), url_to_local_path)); |
+ target->GetRoutingID(), url_to_local_path, routing_id_to_local_path)); |
} |
// Process the serialized HTML content data of a specified frame |
@@ -1103,8 +1125,7 @@ void SavePackage::GetSavableResourceLinks() { |
static_cast<RenderFrameHostImpl*>(web_contents()->GetMainFrame()) |
->frame_tree_node(); |
EnqueueFrame(FrameTreeNode::kFrameTreeNodeInvalidID, // No container. |
- main_frame_tree_node->frame_tree_node_id(), |
- main_frame_tree_node->current_url()); |
+ main_frame_tree_node->frame_tree_node_id(), page_url_); |
} |
void SavePackage::GetSavableResourceLinksForFrame(RenderFrameHost* target) { |
@@ -1148,6 +1169,7 @@ void SavePackage::OnSavableResourceLinksResponse( |
SaveItem* SavePackage::CreatePendingSaveItem( |
int container_frame_tree_node_id, |
+ int save_item_frame_tree_node_id, |
const GURL& url, |
const Referrer& referrer, |
SaveFileCreateInfo::SaveFileSource save_source) { |
@@ -1155,7 +1177,8 @@ SaveItem* SavePackage::CreatePendingSaveItem( |
SaveItem* save_item; |
Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); |
- save_item = new SaveItem(url, sanitized_referrer, this, save_source); |
+ save_item = new SaveItem(url, sanitized_referrer, this, save_source, |
+ save_item_frame_tree_node_id); |
waiting_item_queue_.push_back(save_item); |
frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
@@ -1165,6 +1188,7 @@ SaveItem* SavePackage::CreatePendingSaveItem( |
SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( |
int container_frame_tree_node_id, |
+ int save_item_frame_tree_node_id, |
const GURL& url, |
const Referrer& referrer, |
SaveFileCreateInfo::SaveFileSource save_source) { |
@@ -1180,7 +1204,8 @@ SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( |
frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
.push_back(save_item); |
} else { |
- save_item = CreatePendingSaveItem(container_frame_tree_node_id, url, |
+ save_item = CreatePendingSaveItem(container_frame_tree_node_id, |
+ save_item_frame_tree_node_id, url, |
referrer, save_source); |
url_to_save_item_[url] = save_item; |
} |
@@ -1197,8 +1222,9 @@ void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, |
SaveFileCreateInfo::SaveFileSource save_source = |
url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE |
: SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
- CreatePendingSaveItemDeduplicatingByUrl(container_frame_tree_node_id, url, |
- referrer, save_source); |
+ CreatePendingSaveItemDeduplicatingByUrl( |
+ container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidID, url, |
+ referrer, save_source); |
} |
void SavePackage::EnqueueFrame(int container_frame_tree_node_id, |
@@ -1207,9 +1233,9 @@ void SavePackage::EnqueueFrame(int container_frame_tree_node_id, |
if (!frame_original_url.is_valid()) |
return; |
- SaveItem* save_item = |
- CreatePendingSaveItem(container_frame_tree_node_id, frame_original_url, |
- Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); |
+ SaveItem* save_item = CreatePendingSaveItem( |
+ container_frame_tree_node_id, frame_tree_node_id, frame_original_url, |
+ Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); |
DCHECK(save_item); |
frame_tree_node_id_to_save_item_[frame_tree_node_id] = save_item; |
} |