diff options
author | lukasza <lukasza@chromium.org> | 2016-01-25 15:55:47 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-25 23:58:52 +0000 |
commit | 777a7dd63a55b297f0c9543f1892cecb54505a1f (patch) | |
tree | a0b9f7ac460c61983feb2eefaffe1f3a80272ad5 /content/browser | |
parent | a0ce3e09b083dcc6bdee379ab4a38fc479bc09e6 (diff) | |
download | chromium_src-777a7dd63a55b297f0c9543f1892cecb54505a1f.zip chromium_src-777a7dd63a55b297f0c9543f1892cecb54505a1f.tar.gz chromium_src-777a7dd63a55b297f0c9543f1892cecb54505a1f.tar.bz2 |
Save-Page-As-Complete-Html: Each frame links to a distinct local file.
Previous CL (crrev.com/1484093002) made it possible to save contents of
all frames - even if some of them have the same URI, they still get
saved into separate files / SaveItems. This CL makes sure that we
rewrite links in a html document, based on frame identity if possible
(rather than always doing the rewriting based on the uri):
- SaveItem now stores a frame_tree_node_id that can be potentially used
(if the SaveItem is for a frame rather than for a savable resource) as
a key in the map into the local paths.
- WebFrameSerializerImpl now rewrites link uris based on 2 maps
(url -> local path map as well as frame -> local path map).
BUG=106364, 106158, 538188
Review URL: https://codereview.chromium.org/1502563004
Cr-Commit-Position: refs/heads/master@{#371349}
Diffstat (limited to 'content/browser')
-rw-r--r-- | content/browser/download/save_item.cc | 4 | ||||
-rw-r--r-- | content/browser/download/save_item.h | 8 | ||||
-rw-r--r-- | content/browser/download/save_package.cc | 54 | ||||
-rw-r--r-- | content/browser/download/save_package.h | 2 |
4 files changed, 52 insertions, 16 deletions
diff --git a/content/browser/download/save_item.cc b/content/browser/download/save_item.cc index edea263..5fa2627 100644 --- a/content/browser/download/save_item.cc +++ b/content/browser/download/save_item.cc @@ -27,10 +27,12 @@ SaveItemId GetNextSaveItemId() { SaveItem::SaveItem(const GURL& url, const Referrer& referrer, SavePackage* package, - SaveFileCreateInfo::SaveFileSource save_source) + SaveFileCreateInfo::SaveFileSource save_source, + int frame_tree_node_id) : save_item_id_(GetNextSaveItemId()), url_(url), referrer_(referrer), + frame_tree_node_id_(frame_tree_node_id), total_bytes_(0), received_bytes_(0), state_(WAIT_START), diff --git a/content/browser/download/save_item.h b/content/browser/download/save_item.h index b0e655d..ef46395 100644 --- a/content/browser/download/save_item.h +++ b/content/browser/download/save_item.h @@ -30,7 +30,8 @@ class SaveItem { SaveItem(const GURL& url, const Referrer& referrer, SavePackage* package, - SaveFileCreateInfo::SaveFileSource save_source); + SaveFileCreateInfo::SaveFileSource save_source, + int frame_tree_node_id); ~SaveItem(); @@ -61,6 +62,7 @@ class SaveItem { const base::FilePath& file_name() const { return file_name_; } const GURL& url() const { return url_; } const Referrer& referrer() const { return referrer_; } + int frame_tree_node_id() const { return frame_tree_node_id_; } int64_t total_bytes() const { return total_bytes_; } int64_t received_bytes() const { return received_bytes_; } bool has_final_name() const { return has_final_name_; } @@ -87,6 +89,10 @@ class SaveItem { GURL url_; Referrer referrer_; + // Frame tree node id, if this save item represents a frame + // (otherwise FrameTreeNode::kFrameTreeNodeInvalidID). + int frame_tree_node_id_; + // Total bytes expected. int64_t total_bytes_; diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index 5b7d6a6..8454625 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc @@ -354,10 +354,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; @@ -999,30 +997,53 @@ 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) { + // crbug.com/541354: Raciness when saving a dynamically changing page. + continue; + } + + int routing_id = + save_item_frame_tree_node->render_manager() + ->GetRoutingIdForSiteInstance(target->GetSiteInstance()); + DCHECK_NE(MSG_ROUTING_NONE, routing_id); + + 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 @@ -1150,6 +1171,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) { @@ -1157,7 +1179,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] @@ -1167,6 +1190,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) { @@ -1182,7 +1206,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; } @@ -1199,8 +1224,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, @@ -1209,9 +1235,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; } diff --git a/content/browser/download/save_package.h b/content/browser/download/save_package.h index eabf657..d468551 100644 --- a/content/browser/download/save_package.h +++ b/content/browser/download/save_package.h @@ -206,6 +206,7 @@ class CONTENT_EXPORT SavePackage // Helper for finding or creating a SaveItem with the given parameters. SaveItem* CreatePendingSaveItem( int container_frame_tree_node_id, + int save_item_frame_tree_node_id, const GURL& url, const Referrer& referrer, SaveFileCreateInfo::SaveFileSource save_source); @@ -214,6 +215,7 @@ class CONTENT_EXPORT SavePackage // creating a SaveItem with the given parameters. SaveItem* CreatePendingSaveItemDeduplicatingByUrl( int container_frame_tree_node_id, + int save_item_frame_tree_node_id, const GURL& url, const Referrer& referrer, SaveFileCreateInfo::SaveFileSource save_source); |