| 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;
|
| }
|
|
|