Index: content/browser/download/save_package.cc |
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc |
index da07f63483790f4ccef202e5de1f62d9cf48cb32..1a21d4125b1c6aeeb2628533a94b299553e2f6e6 100644 |
--- a/content/browser/download/save_package.cc |
+++ b/content/browser/download/save_package.cc |
@@ -301,13 +301,11 @@ void SavePackage::InitWithDownloadItem( |
} else { |
DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_); |
wait_state_ = NET_FILES; |
- SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ? |
- SaveFileCreateInfo::SAVE_FILE_FROM_FILE : |
- SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
// Add this item to waiting list. |
- waiting_item_queue_.push_back( |
- new SaveItem(page_url_, Referrer(), this, save_source, |
- FrameTreeNode::kFrameTreeNodeInvalidId)); |
+ waiting_item_queue_.push_back(new SaveItem( |
+ page_url_, Referrer(), this, SaveFileCreateInfo::SAVE_FILE_FROM_NET, |
+ FrameTreeNode::kFrameTreeNodeInvalidId, |
+ web_contents()->GetMainFrame()->GetFrameTreeNodeId())); |
all_save_items_count_ = 1; |
download_->SetTotalBytes(1); |
@@ -546,16 +544,6 @@ void SavePackage::StartSave(const SaveFileCreateInfo* info) { |
save_item->SetTargetPath(saved_main_file_path_); |
} |
- // If the save source is from file system, inform SaveFileManager to copy |
- // corresponding file to the file path which this SaveItem specifies. |
- if (info->save_source == SaveFileCreateInfo::SAVE_FILE_FROM_FILE) { |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&SaveFileManager::SaveLocalFile, file_manager_, |
- save_item->url(), save_item->id(), id())); |
- return; |
- } |
- |
// Check whether we begin to require serialized HTML data. |
if (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML && |
wait_state_ == HTML_DATA) { |
@@ -798,11 +786,30 @@ void SavePackage::SaveNextFile(bool process_all_remaining_items) { |
DCHECK(!ContainsKey(in_progress_items_, save_item->id())); |
in_progress_items_[save_item->id()] = save_item; |
save_item->Start(); |
+ |
+ // Find the frame responsible for making the network request below - it will |
+ // be used in security checks made later by ResourceDispatcherHostImpl. |
+ int requester_frame_tree_node_id = |
+ save_item->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_NET |
+ ? save_item->container_frame_tree_node_id() |
+ : save_item->frame_tree_node_id(); |
+ DCHECK_NE(FrameTreeNode::kFrameTreeNodeInvalidId, |
+ requester_frame_tree_node_id); |
+ FrameTreeNode* requester_frame_tree_node = |
+ FrameTreeNode::GloballyFindByID(requester_frame_tree_node_id); |
+ if (!requester_frame_tree_node) { |
+ save_item->Finish(0, /* is_success = */ false); |
+ continue; |
+ } |
+ RenderFrameHostImpl* requester_frame = |
+ requester_frame_tree_node->current_frame_host(); |
+ |
file_manager_->SaveURL( |
save_item->id(), save_item->url(), save_item->referrer(), |
- web_contents()->GetRenderProcessHost()->GetID(), routing_id(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- save_item->save_source(), save_item->full_path(), |
+ requester_frame->GetProcess()->GetID(), |
+ requester_frame->render_view_host()->GetRoutingID(), |
+ requester_frame->routing_id(), save_item->save_source(), |
+ save_item->full_path(), |
web_contents()->GetBrowserContext()->GetResourceContext(), this); |
} while (process_all_remaining_items && !waiting_item_queue_.empty()); |
} |
@@ -1126,8 +1133,9 @@ SaveItem* SavePackage::CreatePendingSaveItem( |
SaveFileCreateInfo::SaveFileSource save_source) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); |
- SaveItem* save_item = new SaveItem(url, sanitized_referrer, this, save_source, |
- save_item_frame_tree_node_id); |
+ SaveItem* save_item = |
+ new SaveItem(url, sanitized_referrer, this, save_source, |
+ save_item_frame_tree_node_id, container_frame_tree_node_id); |
waiting_item_queue_.push_back(save_item); |
frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] |
@@ -1170,12 +1178,9 @@ void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, |
if (!url.is_valid()) |
return; |
- SaveFileCreateInfo::SaveFileSource save_source = |
- url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE |
- : SaveFileCreateInfo::SAVE_FILE_FROM_NET; |
CreatePendingSaveItemDeduplicatingByUrl( |
container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url, |
- referrer, save_source); |
+ referrer, SaveFileCreateInfo::SAVE_FILE_FROM_NET); |
} |
void SavePackage::EnqueueFrame(int container_frame_tree_node_id, |