summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
authorlukasza <lukasza@chromium.org>2016-01-25 15:55:47 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-25 23:58:52 +0000
commit777a7dd63a55b297f0c9543f1892cecb54505a1f (patch)
treea0b9f7ac460c61983feb2eefaffe1f3a80272ad5 /content/browser
parenta0ce3e09b083dcc6bdee379ab4a38fc479bc09e6 (diff)
downloadchromium_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.cc4
-rw-r--r--content/browser/download/save_item.h8
-rw-r--r--content/browser/download/save_package.cc54
-rw-r--r--content/browser/download/save_package.h2
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);