Index: content/browser/blob_storage/blob_dispatcher_host.h |
diff --git a/content/browser/blob_storage/blob_dispatcher_host.h b/content/browser/blob_storage/blob_dispatcher_host.h |
index 105292ae0aab348037b847346733dc01aaeb28ba..e1bfbe50411cf27437f81a3fa10c98ffbfbebeb1 100644 |
--- a/content/browser/blob_storage/blob_dispatcher_host.h |
+++ b/content/browser/blob_storage/blob_dispatcher_host.h |
@@ -5,6 +5,7 @@ |
#ifndef CONTENT_BROWSER_BLOB_STORAGE_BLOB_DISPATCHER_HOST_H_ |
#define CONTENT_BROWSER_BLOB_STORAGE_BLOB_DISPATCHER_HOST_H_ |
+#include <memory> |
#include <set> |
#include <string> |
#include <vector> |
@@ -16,14 +17,14 @@ |
#include "base/memory/shared_memory_handle.h" |
#include "content/common/content_export.h" |
#include "content/public/browser/browser_message_filter.h" |
-#include "storage/browser/blob/blob_async_builder_host.h" |
-#include "storage/browser/blob/blob_transport_result.h" |
+#include "storage/browser/blob/blob_transport_host.h" |
#include "storage/common/blob_storage/blob_storage_constants.h" |
class GURL; |
namespace storage { |
class DataElement; |
+class BlobDataHandle; |
struct BlobItemBytesRequest; |
struct BlobItemBytesResponse; |
class BlobStorageContext; |
@@ -53,14 +54,6 @@ class CONTENT_EXPORT BlobDispatcherHost : public BrowserMessageFilter { |
protected: |
~BlobDispatcherHost() override; |
- // For testing use only. |
- void SetMemoryConstantsForTesting(size_t max_ipc_memory_size, |
- size_t max_shared_memory_size, |
- uint64_t max_file_size) { |
- async_builder_.SetMemoryConstantsForTesting( |
- max_ipc_memory_size, max_shared_memory_size, max_file_size); |
- } |
- |
private: |
friend class base::RefCountedThreadSafe<BlobDispatcherHost>; |
friend class BlobDispatcherHostTest; |
@@ -93,20 +86,15 @@ class CONTENT_EXPORT BlobDispatcherHost : public BrowserMessageFilter { |
FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, |
BuildingReferenceChainWithSourceDeath); |
- typedef std::map<std::string, int> BlobReferenceMap; |
- |
- void OnRegisterBlobUUID(const std::string& uuid, |
- const std::string& content_type, |
- const std::string& content_disposition, |
- const std::set<std::string>& referenced_blob_uuids); |
- void OnStartBuildingBlob( |
- const std::string& uuid, |
- const std::vector<storage::DataElement>& descriptions); |
+ void OnRegisterBlob(const std::string& uuid, |
+ const std::string& content_type, |
+ const std::string& content_disposition, |
+ const std::vector<storage::DataElement>& descriptions); |
void OnMemoryItemResponse( |
const std::string& uuid, |
const std::vector<storage::BlobItemBytesResponse>& response); |
void OnCancelBuildingBlob(const std::string& uuid, |
- const storage::IPCBlobCreationCancelCode code); |
+ const storage::BlobStatus code); |
void OnIncrementBlobRefCount(const std::string& uuid); |
void OnDecrementBlobRefCount(const std::string& uuid); |
@@ -115,15 +103,14 @@ class CONTENT_EXPORT BlobDispatcherHost : public BrowserMessageFilter { |
storage::BlobStorageContext* context(); |
- void SendMemoryRequest( |
- const std::string& uuid, |
- std::unique_ptr<std::vector<storage::BlobItemBytesRequest>> requests, |
- std::unique_ptr<std::vector<base::SharedMemoryHandle>> memory_handles, |
- std::unique_ptr<std::vector<base::File>> files); |
+ void SendMemoryRequest(const std::string& uuid, |
+ std::vector<storage::BlobItemBytesRequest> requests, |
+ std::vector<base::SharedMemoryHandle> memory_handles, |
+ std::vector<base::File> files); |
- // Send the appropriate IPC response to the renderer for the given result. |
- void SendIPCResponse(const std::string& uuid, |
- storage::BlobTransportResult result); |
+ // The status should never be a pending status (see BlobStatusIsPending), and |
+ // we ignore calls for |uuid|s that aren't in use in this host. |
+ void SendFinalBlobStatus(const std::string& uuid, storage::BlobStatus status); |
bool IsInUseInHost(const std::string& uuid); |
bool IsUrlRegisteredInHost(const GURL& blob_url); |
@@ -131,18 +118,29 @@ class CONTENT_EXPORT BlobDispatcherHost : public BrowserMessageFilter { |
// Unregisters all blobs and urls that were registered in this host. |
void ClearHostFromBlobStorageContext(); |
+ struct HostedBlobState { |
+ explicit HostedBlobState(std::unique_ptr<storage::BlobDataHandle> handle); |
+ ~HostedBlobState(); |
+ HostedBlobState(HostedBlobState&&); |
+ HostedBlobState& operator=(HostedBlobState&&); |
+ DISALLOW_COPY_AND_ASSIGN(HostedBlobState); |
+ |
+ int refcount = 1; |
+ std::unique_ptr<storage::BlobDataHandle> handle; |
+ }; |
+ |
const int process_id_; |
scoped_refptr<storage::FileSystemContext> file_system_context_; |
// Collection of blob ids and a count of how many usages |
// of that id are attributable to this consumer. |
- BlobReferenceMap blobs_inuse_map_; |
+ std::unordered_map<std::string, HostedBlobState> blobs_inuse_map_; |
// The set of public blob urls coined by this consumer. |
std::set<GURL> public_blob_urls_; |
scoped_refptr<ChromeBlobStorageContext> blob_storage_context_; |
- storage::BlobAsyncBuilderHost async_builder_; |
+ storage::BlobTransportHost transport_host_; |
DISALLOW_COPY_AND_ASSIGN(BlobDispatcherHost); |
}; |