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

Unified 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 5 years 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 side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698