OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |