// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Objects that handle file operations for saving files, on the file thread. // // The SaveFileManager owns a set of SaveFile objects, each of which connects // with a SaveItem object which belongs to one SavePackage and runs on the file // thread for saving data in order to avoid disk activity on either network IO // thread or the UI thread. It coordinates the notifications from the network // and UI. // // The SaveFileManager itself is a singleton object created and owned by the // BrowserMainLoop. // // The data sent to SaveFileManager have 2 sources: // - SimpleURLLoaders which are used to download sub-resources and // save-only-HTML pages // - render processese, for HTML pages which are serialized from the DOM in // their original encoding. The data is received on the UI thread and // dispatched directly to the SaveFileManager on the file thread. // // A typical saving job operation involves multiple threads and sequences: // // Updating an in progress save file: // |----> data from ---->| | // | render process | | // | SimpleURLLoaders | | // ui_thread | | // download_task_runner (writes to disk) // |----> stats ---->| // ui_thread (feedback for user) // // // Cancel operations perform the inverse order when triggered by a user action: // ui_thread (user click) // |----> cancel command ---->| // | | download_task_runner (close file) // | |---------------------> cancel command ---->| // | io_thread (stops net IO // ui_thread (user close contents) for saving) // |----> cancel command ---->| // Render process(stop serializing DOM and sending // data) // // // The SaveFileManager tracks saving requests, mapping from a save item id to // the SavePackage for the contents where the saving job was initiated. In the // event of a contents closure during saving, the SavePackage will notify the // SaveFileManage to cancel all SaveFile jobs. #ifndef CONTENT_BROWSER_DOWNLOAD_SAVE_FILE_MANAGER_H_ #define CONTENT_BROWSER_DOWNLOAD_SAVE_FILE_MANAGER_H_ #include <stdint.h> #include <memory> #include <string> #include <unordered_map> #include <vector> #include "base/containers/flat_map.h" #include "base/memory/ref_counted.h" #include "components/download/public/common/download_interrupt_reasons.h" #include "components/services/quarantine/quarantine.h" #include "content/browser/download/save_types.h" #include "content/common/content_export.h" #include "net/base/isolation_info.h" #include "services/network/public/cpp/request_mode.h" class GURL; namespace base { class FilePath; } namespace content { class BrowserContext; class SaveFile; class SavePackage; class StoragePartition; struct Referrer; class CONTENT_EXPORT SaveFileManager : public base::RefCountedThreadSafe<SaveFileManager> { … }; } // namespace content #endif // CONTENT_BROWSER_DOWNLOAD_SAVE_FILE_MANAGER_H_