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

Side by Side Diff: content/browser/download/save_package.cc

Issue 2075273002: Resource requests from Save-Page-As should go through CanRequestURL checks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Replace MarkAsUnauthorized with constructor argument. Created 4 years, 4 months 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 unified diff | Download patch
« no previous file with comments | « content/browser/download/save_item.cc ('k') | content/browser/download/save_types.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/download/save_package.h" 5 #include "content/browser/download/save_package.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 DCHECK(!saved_main_directory_path_.empty()); 294 DCHECK(!saved_main_directory_path_.empty());
295 GetSavableResourceLinks(); 295 GetSavableResourceLinks();
296 } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) { 296 } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) {
297 MHTMLGenerationParams mhtml_generation_params(saved_main_file_path_); 297 MHTMLGenerationParams mhtml_generation_params(saved_main_file_path_);
298 web_contents()->GenerateMHTML( 298 web_contents()->GenerateMHTML(
299 mhtml_generation_params, 299 mhtml_generation_params,
300 base::Bind(&SavePackage::OnMHTMLGenerated, this)); 300 base::Bind(&SavePackage::OnMHTMLGenerated, this));
301 } else { 301 } else {
302 DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_); 302 DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_);
303 wait_state_ = NET_FILES; 303 wait_state_ = NET_FILES;
304 SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ?
305 SaveFileCreateInfo::SAVE_FILE_FROM_FILE :
306 SaveFileCreateInfo::SAVE_FILE_FROM_NET;
307 // Add this item to waiting list. 304 // Add this item to waiting list.
308 waiting_item_queue_.push_back( 305 waiting_item_queue_.push_back(new SaveItem(
309 new SaveItem(page_url_, Referrer(), this, save_source, 306 page_url_, Referrer(), this, SaveFileCreateInfo::SAVE_FILE_FROM_NET,
310 FrameTreeNode::kFrameTreeNodeInvalidId)); 307 FrameTreeNode::kFrameTreeNodeInvalidId,
308 web_contents()->GetMainFrame()->GetFrameTreeNodeId()));
311 all_save_items_count_ = 1; 309 all_save_items_count_ = 1;
312 download_->SetTotalBytes(1); 310 download_->SetTotalBytes(1);
313 311
314 DoSavingProcess(); 312 DoSavingProcess();
315 } 313 }
316 } 314 }
317 315
318 void SavePackage::OnMHTMLGenerated(int64_t size) { 316 void SavePackage::OnMHTMLGenerated(int64_t size) {
319 DCHECK_CURRENTLY_ON(BrowserThread::UI); 317 DCHECK_CURRENTLY_ON(BrowserThread::UI);
320 if (size <= 0) { 318 if (size <= 0) {
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 // Now we get final name retrieved from GenerateFileName, we will use it 537 // Now we get final name retrieved from GenerateFileName, we will use it
540 // rename the SaveItem. 538 // rename the SaveItem.
541 base::FilePath final_name = 539 base::FilePath final_name =
542 saved_main_directory_path_.Append(generated_name); 540 saved_main_directory_path_.Append(generated_name);
543 save_item->SetTargetPath(final_name); 541 save_item->SetTargetPath(final_name);
544 } else { 542 } else {
545 // It is the main HTML file, use the name chosen by the user. 543 // It is the main HTML file, use the name chosen by the user.
546 save_item->SetTargetPath(saved_main_file_path_); 544 save_item->SetTargetPath(saved_main_file_path_);
547 } 545 }
548 546
549 // If the save source is from file system, inform SaveFileManager to copy
550 // corresponding file to the file path which this SaveItem specifies.
551 if (info->save_source == SaveFileCreateInfo::SAVE_FILE_FROM_FILE) {
552 BrowserThread::PostTask(
553 BrowserThread::FILE, FROM_HERE,
554 base::Bind(&SaveFileManager::SaveLocalFile, file_manager_,
555 save_item->url(), save_item->id(), id()));
556 return;
557 }
558
559 // Check whether we begin to require serialized HTML data. 547 // Check whether we begin to require serialized HTML data.
560 if (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML && 548 if (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML &&
561 wait_state_ == HTML_DATA) { 549 wait_state_ == HTML_DATA) {
562 // Inform backend to serialize the all frames' DOM and send serialized 550 // Inform backend to serialize the all frames' DOM and send serialized
563 // HTML data back. 551 // HTML data back.
564 GetSerializedHtmlWithLocalLinks(); 552 GetSerializedHtmlWithLocalLinks();
565 } 553 }
566 } 554 }
567 555
568 SaveItem* SavePackage::LookupInProgressSaveItem(SaveItemId save_item_id) { 556 SaveItem* SavePackage::LookupInProgressSaveItem(SaveItemId save_item_id) {
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 779
792 do { 780 do {
793 // Pop SaveItem from waiting list. 781 // Pop SaveItem from waiting list.
794 SaveItem* save_item = waiting_item_queue_.front(); 782 SaveItem* save_item = waiting_item_queue_.front();
795 waiting_item_queue_.pop_front(); 783 waiting_item_queue_.pop_front();
796 784
797 // Add the item to |in_progress_items_|. 785 // Add the item to |in_progress_items_|.
798 DCHECK(!ContainsKey(in_progress_items_, save_item->id())); 786 DCHECK(!ContainsKey(in_progress_items_, save_item->id()));
799 in_progress_items_[save_item->id()] = save_item; 787 in_progress_items_[save_item->id()] = save_item;
800 save_item->Start(); 788 save_item->Start();
789
790 // Find the frame responsible for making the network request below - it will
791 // be used in security checks made later by ResourceDispatcherHostImpl.
792 int requester_frame_tree_node_id =
793 save_item->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_NET
794 ? save_item->container_frame_tree_node_id()
795 : save_item->frame_tree_node_id();
796 DCHECK_NE(FrameTreeNode::kFrameTreeNodeInvalidId,
797 requester_frame_tree_node_id);
798 FrameTreeNode* requester_frame_tree_node =
799 FrameTreeNode::GloballyFindByID(requester_frame_tree_node_id);
800 if (!requester_frame_tree_node) {
801 save_item->Finish(0, /* is_success = */ false);
802 continue;
803 }
804 RenderFrameHostImpl* requester_frame =
805 requester_frame_tree_node->current_frame_host();
806
801 file_manager_->SaveURL( 807 file_manager_->SaveURL(
802 save_item->id(), save_item->url(), save_item->referrer(), 808 save_item->id(), save_item->url(), save_item->referrer(),
803 web_contents()->GetRenderProcessHost()->GetID(), routing_id(), 809 requester_frame->GetProcess()->GetID(),
804 web_contents()->GetMainFrame()->GetRoutingID(), 810 requester_frame->render_view_host()->GetRoutingID(),
805 save_item->save_source(), save_item->full_path(), 811 requester_frame->routing_id(), save_item->save_source(),
812 save_item->full_path(),
806 web_contents()->GetBrowserContext()->GetResourceContext(), this); 813 web_contents()->GetBrowserContext()->GetResourceContext(), this);
807 } while (process_all_remaining_items && !waiting_item_queue_.empty()); 814 } while (process_all_remaining_items && !waiting_item_queue_.empty());
808 } 815 }
809 816
810 int SavePackage::PercentComplete() { 817 int SavePackage::PercentComplete() {
811 DCHECK_CURRENTLY_ON(BrowserThread::UI); 818 DCHECK_CURRENTLY_ON(BrowserThread::UI);
812 if (!all_save_items_count_) 819 if (!all_save_items_count_)
813 return 0; 820 return 0;
814 if (!in_process_count()) 821 if (!in_process_count())
815 return 100; 822 return 100;
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
1119 } 1126 }
1120 1127
1121 SaveItem* SavePackage::CreatePendingSaveItem( 1128 SaveItem* SavePackage::CreatePendingSaveItem(
1122 int container_frame_tree_node_id, 1129 int container_frame_tree_node_id,
1123 int save_item_frame_tree_node_id, 1130 int save_item_frame_tree_node_id,
1124 const GURL& url, 1131 const GURL& url,
1125 const Referrer& referrer, 1132 const Referrer& referrer,
1126 SaveFileCreateInfo::SaveFileSource save_source) { 1133 SaveFileCreateInfo::SaveFileSource save_source) {
1127 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1134 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1128 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer); 1135 Referrer sanitized_referrer = Referrer::SanitizeForRequest(url, referrer);
1129 SaveItem* save_item = new SaveItem(url, sanitized_referrer, this, save_source, 1136 SaveItem* save_item =
1130 save_item_frame_tree_node_id); 1137 new SaveItem(url, sanitized_referrer, this, save_source,
1138 save_item_frame_tree_node_id, container_frame_tree_node_id);
1131 waiting_item_queue_.push_back(save_item); 1139 waiting_item_queue_.push_back(save_item);
1132 1140
1133 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id] 1141 frame_tree_node_id_to_contained_save_items_[container_frame_tree_node_id]
1134 .push_back(save_item); 1142 .push_back(save_item);
1135 return save_item; 1143 return save_item;
1136 } 1144 }
1137 1145
1138 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl( 1146 SaveItem* SavePackage::CreatePendingSaveItemDeduplicatingByUrl(
1139 int container_frame_tree_node_id, 1147 int container_frame_tree_node_id,
1140 int save_item_frame_tree_node_id, 1148 int save_item_frame_tree_node_id,
(...skipping 22 matching lines...) Expand all
1163 return save_item; 1171 return save_item;
1164 } 1172 }
1165 1173
1166 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id, 1174 void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id,
1167 const GURL& url, 1175 const GURL& url,
1168 const Referrer& referrer) { 1176 const Referrer& referrer) {
1169 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1177 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1170 if (!url.is_valid()) 1178 if (!url.is_valid())
1171 return; 1179 return;
1172 1180
1173 SaveFileCreateInfo::SaveFileSource save_source =
1174 url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE
1175 : SaveFileCreateInfo::SAVE_FILE_FROM_NET;
1176 CreatePendingSaveItemDeduplicatingByUrl( 1181 CreatePendingSaveItemDeduplicatingByUrl(
1177 container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url, 1182 container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url,
1178 referrer, save_source); 1183 referrer, SaveFileCreateInfo::SAVE_FILE_FROM_NET);
1179 } 1184 }
1180 1185
1181 void SavePackage::EnqueueFrame(int container_frame_tree_node_id, 1186 void SavePackage::EnqueueFrame(int container_frame_tree_node_id,
1182 int frame_tree_node_id, 1187 int frame_tree_node_id,
1183 const GURL& frame_original_url) { 1188 const GURL& frame_original_url) {
1184 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1189 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1185 SaveItem* save_item = CreatePendingSaveItem( 1190 SaveItem* save_item = CreatePendingSaveItem(
1186 container_frame_tree_node_id, frame_tree_node_id, frame_original_url, 1191 container_frame_tree_node_id, frame_tree_node_id, frame_original_url,
1187 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM); 1192 Referrer(), SaveFileCreateInfo::SAVE_FILE_FROM_DOM);
1188 DCHECK(save_item); 1193 DCHECK(save_item);
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1464 } 1469 }
1465 1470
1466 void SavePackage::FinalizeDownloadEntry() { 1471 void SavePackage::FinalizeDownloadEntry() {
1467 DCHECK(download_); 1472 DCHECK(download_);
1468 1473
1469 download_manager_->OnSavePackageSuccessfullyFinished(download_); 1474 download_manager_->OnSavePackageSuccessfullyFinished(download_);
1470 RemoveObservers(); 1475 RemoveObservers();
1471 } 1476 }
1472 1477
1473 } // namespace content 1478 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/download/save_item.cc ('k') | content/browser/download/save_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698