| 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 #ifndef CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_H_ | 5 #ifndef CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_H_ |
| 6 #define CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_H_ | 6 #define CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_H_ |
| 7 | 7 |
| 8 #include <stddef.h> |
| 9 #include <stdint.h> |
| 10 |
| 8 #include <deque> | 11 #include <deque> |
| 9 #include <map> | 12 #include <map> |
| 10 #include <set> | 13 #include <set> |
| 11 #include <string> | 14 #include <string> |
| 12 #include <vector> | 15 #include <vector> |
| 13 | 16 |
| 14 #include "base/basictypes.h" | |
| 15 #include "base/containers/hash_tables.h" | 17 #include "base/containers/hash_tables.h" |
| 16 #include "base/files/file_path.h" | 18 #include "base/files/file_path.h" |
| 17 #include "base/gtest_prod_util.h" | 19 #include "base/gtest_prod_util.h" |
| 20 #include "base/macros.h" |
| 18 #include "base/memory/ref_counted.h" | 21 #include "base/memory/ref_counted.h" |
| 19 #include "base/memory/weak_ptr.h" | 22 #include "base/memory/weak_ptr.h" |
| 20 #include "base/time/time.h" | 23 #include "base/time/time.h" |
| 21 #include "content/browser/download/save_types.h" | 24 #include "content/browser/download/save_types.h" |
| 22 #include "content/common/content_export.h" | 25 #include "content/common/content_export.h" |
| 23 #include "content/public/browser/download_item.h" | 26 #include "content/public/browser/download_item.h" |
| 24 #include "content/public/browser/download_manager_delegate.h" | 27 #include "content/public/browser/download_manager_delegate.h" |
| 25 #include "content/public/browser/save_page_type.h" | 28 #include "content/public/browser/save_page_type.h" |
| 26 #include "content/public/browser/web_contents_observer.h" | 29 #include "content/public/browser/web_contents_observer.h" |
| 27 #include "content/public/common/referrer.h" | 30 #include "content/public/common/referrer.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 // written to disk. | 103 // written to disk. |
| 101 bool Init(const SavePackageDownloadCreatedCallback& cb); | 104 bool Init(const SavePackageDownloadCreatedCallback& cb); |
| 102 | 105 |
| 103 // Cancel all in progress request, might be called by user or internal error. | 106 // Cancel all in progress request, might be called by user or internal error. |
| 104 void Cancel(bool user_action); | 107 void Cancel(bool user_action); |
| 105 | 108 |
| 106 void Finish(); | 109 void Finish(); |
| 107 | 110 |
| 108 // Notifications sent from the file thread to the UI thread. | 111 // Notifications sent from the file thread to the UI thread. |
| 109 void StartSave(const SaveFileCreateInfo* info); | 112 void StartSave(const SaveFileCreateInfo* info); |
| 110 bool UpdateSaveProgress(int32 save_item_id, int64 size, bool write_success); | 113 bool UpdateSaveProgress(int32_t save_item_id, |
| 111 void SaveFinished(int32 save_item_id, int64 size, bool is_success); | 114 int64_t size, |
| 115 bool write_success); |
| 116 void SaveFinished(int32_t save_item_id, int64_t size, bool is_success); |
| 112 void SaveCanceled(SaveItem* save_item); | 117 void SaveCanceled(SaveItem* save_item); |
| 113 | 118 |
| 114 // Rough percent complete, -1 means we don't know (since we didn't receive a | 119 // Rough percent complete, -1 means we don't know (since we didn't receive a |
| 115 // total size). | 120 // total size). |
| 116 int PercentComplete(); | 121 int PercentComplete(); |
| 117 | 122 |
| 118 bool canceled() const { return user_canceled_ || disk_error_occurred_; } | 123 bool canceled() const { return user_canceled_ || disk_error_occurred_; } |
| 119 bool finished() const { return finished_; } | 124 bool finished() const { return finished_; } |
| 120 SavePageType save_type() const { return save_type_; } | 125 SavePageType save_type() const { return save_type_; } |
| 121 int id() const { return unique_id_; } | 126 int id() const { return unique_id_; } |
| 122 | 127 |
| 123 void GetSaveInfo(); | 128 void GetSaveInfo(); |
| 124 | 129 |
| 125 private: | 130 private: |
| 126 friend class base::RefCountedThreadSafe<SavePackage>; | 131 friend class base::RefCountedThreadSafe<SavePackage>; |
| 127 | 132 |
| 128 void InitWithDownloadItem( | 133 void InitWithDownloadItem( |
| 129 const SavePackageDownloadCreatedCallback& download_created_callback, | 134 const SavePackageDownloadCreatedCallback& download_created_callback, |
| 130 DownloadItemImpl* item); | 135 DownloadItemImpl* item); |
| 131 | 136 |
| 132 // Callback for WebContents::GenerateMHTML(). | 137 // Callback for WebContents::GenerateMHTML(). |
| 133 void OnMHTMLGenerated(int64 size); | 138 void OnMHTMLGenerated(int64_t size); |
| 134 | 139 |
| 135 // For testing only. | 140 // For testing only. |
| 136 SavePackage(WebContents* web_contents, | 141 SavePackage(WebContents* web_contents, |
| 137 const base::FilePath& file_full_path, | 142 const base::FilePath& file_full_path, |
| 138 const base::FilePath& directory_full_path); | 143 const base::FilePath& directory_full_path); |
| 139 | 144 |
| 140 ~SavePackage() override; | 145 ~SavePackage() override; |
| 141 | 146 |
| 142 // Notes from Init() above applies here as well. | 147 // Notes from Init() above applies here as well. |
| 143 void InternalInit(); | 148 void InternalInit(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 157 // Update the download history of this item upon completion. | 162 // Update the download history of this item upon completion. |
| 158 void FinalizeDownloadEntry(); | 163 void FinalizeDownloadEntry(); |
| 159 | 164 |
| 160 // Detach from DownloadManager. | 165 // Detach from DownloadManager. |
| 161 void StopObservation(); | 166 void StopObservation(); |
| 162 | 167 |
| 163 // Return max length of a path for a specific base directory. | 168 // Return max length of a path for a specific base directory. |
| 164 // This is needed on POSIX, which restrict the length of file names in | 169 // This is needed on POSIX, which restrict the length of file names in |
| 165 // addition to the restriction on the length of path names. | 170 // addition to the restriction on the length of path names. |
| 166 // |base_dir| is assumed to be a directory name with no trailing slash. | 171 // |base_dir| is assumed to be a directory name with no trailing slash. |
| 167 static uint32 GetMaxPathLengthForDirectory(const base::FilePath& base_dir); | 172 static uint32_t GetMaxPathLengthForDirectory(const base::FilePath& base_dir); |
| 168 | 173 |
| 169 static bool GetSafePureFileName( | 174 static bool GetSafePureFileName( |
| 170 const base::FilePath& dir_path, | 175 const base::FilePath& dir_path, |
| 171 const base::FilePath::StringType& file_name_ext, | 176 const base::FilePath::StringType& file_name_ext, |
| 172 uint32 max_file_path_len, | 177 uint32_t max_file_path_len, |
| 173 base::FilePath::StringType* pure_file_name); | 178 base::FilePath::StringType* pure_file_name); |
| 174 | 179 |
| 175 // Create a file name based on the response from the server. | 180 // Create a file name based on the response from the server. |
| 176 bool GenerateFileName(const std::string& disposition, | 181 bool GenerateFileName(const std::string& disposition, |
| 177 const GURL& url, | 182 const GURL& url, |
| 178 bool need_html_ext, | 183 bool need_html_ext, |
| 179 base::FilePath::StringType* generated_name); | 184 base::FilePath::StringType* generated_name); |
| 180 | 185 |
| 181 // Main routine that initiates asking all frames for their savable resources, | 186 // Main routine that initiates asking all frames for their savable resources, |
| 182 // using GetSavableResourceLinksForFrame to send IPC to individual frames. | 187 // using GetSavableResourceLinksForFrame to send IPC to individual frames. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 void GetSerializedHtmlWithLocalLinksForFrame(FrameTreeNode* target_tree_node); | 249 void GetSerializedHtmlWithLocalLinksForFrame(FrameTreeNode* target_tree_node); |
| 245 | 250 |
| 246 // Routes html data (sent by renderer process in response to | 251 // Routes html data (sent by renderer process in response to |
| 247 // GetSerializedHtmlWithLocalLinksForFrame above) to the associated local file | 252 // GetSerializedHtmlWithLocalLinksForFrame above) to the associated local file |
| 248 // (and also keeps track of when all frames have been completed). | 253 // (and also keeps track of when all frames have been completed). |
| 249 void OnSerializedHtmlWithLocalLinksResponse(RenderFrameHostImpl* sender, | 254 void OnSerializedHtmlWithLocalLinksResponse(RenderFrameHostImpl* sender, |
| 250 const std::string& data, | 255 const std::string& data, |
| 251 bool end_of_data); | 256 bool end_of_data); |
| 252 | 257 |
| 253 // Look up SaveItem by save item id from in progress map. | 258 // Look up SaveItem by save item id from in progress map. |
| 254 SaveItem* LookupSaveItemInProcess(int32 save_item_id); | 259 SaveItem* LookupSaveItemInProcess(int32_t save_item_id); |
| 255 | 260 |
| 256 // Remove SaveItem from in progress map and put it to saved map. | 261 // Remove SaveItem from in progress map and put it to saved map. |
| 257 void PutInProgressItemToSavedMap(SaveItem* save_item); | 262 void PutInProgressItemToSavedMap(SaveItem* save_item); |
| 258 | 263 |
| 259 // Retrieves the URL to be saved from the WebContents. | 264 // Retrieves the URL to be saved from the WebContents. |
| 260 GURL GetUrlToBeSaved(); | 265 GURL GetUrlToBeSaved(); |
| 261 | 266 |
| 262 void CreateDirectoryOnFileThread(const base::FilePath& website_save_dir, | 267 void CreateDirectoryOnFileThread(const base::FilePath& website_save_dir, |
| 263 const base::FilePath& download_save_dir, | 268 const base::FilePath& download_save_dir, |
| 264 bool skip_dir_check, | 269 bool skip_dir_check, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 288 int completed_count() const { | 293 int completed_count() const { |
| 289 return static_cast<int>(saved_success_items_.size() + | 294 return static_cast<int>(saved_success_items_.size() + |
| 290 saved_failed_items_.size()); | 295 saved_failed_items_.size()); |
| 291 } | 296 } |
| 292 | 297 |
| 293 // The current speed in files per second. This is used to update the | 298 // The current speed in files per second. This is used to update the |
| 294 // DownloadItem associated to this SavePackage. The files per second is | 299 // DownloadItem associated to this SavePackage. The files per second is |
| 295 // presented by the DownloadItem to the UI as bytes per second, which is | 300 // presented by the DownloadItem to the UI as bytes per second, which is |
| 296 // not correct but matches the way the total and received number of files is | 301 // not correct but matches the way the total and received number of files is |
| 297 // presented as the total and received bytes. | 302 // presented as the total and received bytes. |
| 298 int64 CurrentSpeed() const; | 303 int64_t CurrentSpeed() const; |
| 299 | 304 |
| 300 // Helper function for preparing suggested name for the SaveAs Dialog. The | 305 // Helper function for preparing suggested name for the SaveAs Dialog. The |
| 301 // suggested name is determined by the web document's title. | 306 // suggested name is determined by the web document's title. |
| 302 base::FilePath GetSuggestedNameForSaveAs( | 307 base::FilePath GetSuggestedNameForSaveAs( |
| 303 bool can_save_as_complete, | 308 bool can_save_as_complete, |
| 304 const std::string& contents_mime_type, | 309 const std::string& contents_mime_type, |
| 305 const std::string& accept_langs); | 310 const std::string& accept_langs); |
| 306 | 311 |
| 307 // Ensures that the file name has a proper extension for HTML by adding ".htm" | 312 // Ensures that the file name has a proper extension for HTML by adding ".htm" |
| 308 // if necessary. | 313 // if necessary. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 338 // (i.e. to prevent information disclosure to oop frames). | 343 // (i.e. to prevent information disclosure to oop frames). |
| 339 // Note that |frame_tree_node_id_to_contained_save_items_| does NOT own | 344 // Note that |frame_tree_node_id_to_contained_save_items_| does NOT own |
| 340 // SaveItems - they remain owned by waiting_item_queue_, in_progress_items_, | 345 // SaveItems - they remain owned by waiting_item_queue_, in_progress_items_, |
| 341 // etc. | 346 // etc. |
| 342 base::hash_map<int, std::vector<SaveItem*>> | 347 base::hash_map<int, std::vector<SaveItem*>> |
| 343 frame_tree_node_id_to_contained_save_items_; | 348 frame_tree_node_id_to_contained_save_items_; |
| 344 | 349 |
| 345 // Number of frames that we still need to get a response from. | 350 // Number of frames that we still need to get a response from. |
| 346 int number_of_frames_pending_response_; | 351 int number_of_frames_pending_response_; |
| 347 | 352 |
| 348 typedef base::hash_map<int32, SaveItem*> SavedItemMap; | 353 typedef base::hash_map<int32_t, SaveItem*> SavedItemMap; |
| 349 // saved_success_items_ is map of all saving job which are successfully saved. | 354 // saved_success_items_ is map of all saving job which are successfully saved. |
| 350 SavedItemMap saved_success_items_; | 355 SavedItemMap saved_success_items_; |
| 351 | 356 |
| 352 // Non-owning pointer for handling file writing on the file thread. | 357 // Non-owning pointer for handling file writing on the file thread. |
| 353 SaveFileManager* file_manager_; | 358 SaveFileManager* file_manager_; |
| 354 | 359 |
| 355 // DownloadManager owns the DownloadItem and handles history and UI. | 360 // DownloadManager owns the DownloadItem and handles history and UI. |
| 356 DownloadManagerImpl* download_manager_; | 361 DownloadManagerImpl* download_manager_; |
| 357 DownloadItemImpl* download_; | 362 DownloadItemImpl* download_; |
| 358 | 363 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 385 // Number of all need to be saved resources. | 390 // Number of all need to be saved resources. |
| 386 size_t all_save_items_count_; | 391 size_t all_save_items_count_; |
| 387 | 392 |
| 388 using FileNameSet = | 393 using FileNameSet = |
| 389 std::set<base::FilePath::StringType, | 394 std::set<base::FilePath::StringType, |
| 390 bool (*)(base::FilePath::StringPieceType, | 395 bool (*)(base::FilePath::StringPieceType, |
| 391 base::FilePath::StringPieceType)>; | 396 base::FilePath::StringPieceType)>; |
| 392 // This set is used to eliminate duplicated file names in saving directory. | 397 // This set is used to eliminate duplicated file names in saving directory. |
| 393 FileNameSet file_name_set_; | 398 FileNameSet file_name_set_; |
| 394 | 399 |
| 395 typedef base::hash_map<base::FilePath::StringType, uint32> FileNameCountMap; | 400 typedef base::hash_map<base::FilePath::StringType, uint32_t> FileNameCountMap; |
| 396 // This map is used to track serial number for specified filename. | 401 // This map is used to track serial number for specified filename. |
| 397 FileNameCountMap file_name_count_map_; | 402 FileNameCountMap file_name_count_map_; |
| 398 | 403 |
| 399 // Indicates current waiting state when SavePackage try to get something | 404 // Indicates current waiting state when SavePackage try to get something |
| 400 // from outside. | 405 // from outside. |
| 401 WaitState wait_state_; | 406 WaitState wait_state_; |
| 402 | 407 |
| 403 // Unique ID for this SavePackage. | 408 // Unique ID for this SavePackage. |
| 404 const int unique_id_; | 409 const int unique_id_; |
| 405 | 410 |
| 406 // Variables to record errors that happened so we can record them via | 411 // Variables to record errors that happened so we can record them via |
| 407 // UMA statistics. | 412 // UMA statistics. |
| 408 bool wrote_to_completed_file_; | 413 bool wrote_to_completed_file_; |
| 409 bool wrote_to_failed_file_; | 414 bool wrote_to_failed_file_; |
| 410 | 415 |
| 411 friend class SavePackageTest; | 416 friend class SavePackageTest; |
| 412 FRIEND_TEST_ALL_PREFIXES(SavePackageTest, TestSuggestedSaveNames); | 417 FRIEND_TEST_ALL_PREFIXES(SavePackageTest, TestSuggestedSaveNames); |
| 413 FRIEND_TEST_ALL_PREFIXES(SavePackageTest, TestLongSafePureFilename); | 418 FRIEND_TEST_ALL_PREFIXES(SavePackageTest, TestLongSafePureFilename); |
| 414 | 419 |
| 415 DISALLOW_COPY_AND_ASSIGN(SavePackage); | 420 DISALLOW_COPY_AND_ASSIGN(SavePackage); |
| 416 }; | 421 }; |
| 417 | 422 |
| 418 } // namespace content | 423 } // namespace content |
| 419 | 424 |
| 420 #endif // CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_H_ | 425 #endif // CONTENT_BROWSER_DOWNLOAD_SAVE_PACKAGE_H_ |
| OLD | NEW |