| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..63b25e2f46af1a487578fa42717280cc4070f1b2
|
| --- /dev/null
|
| +++ b/content/browser/blob_storage/blob_dispatcher_host.h
|
| @@ -0,0 +1,142 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CONTENT_BROWSER_BLOB_STORAGE_BLOB_DISPATCHER_HOST_H_
|
| +#define CONTENT_BROWSER_BLOB_STORAGE_BLOB_DISPATCHER_HOST_H_
|
| +
|
| +#include <set>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/files/file.h"
|
| +#include "base/gtest_prod_util.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#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/common/blob_storage/blob_storage_constants.h"
|
| +
|
| +class GURL;
|
| +
|
| +namespace IPC {
|
| +class Sender;
|
| +}
|
| +
|
| +namespace storage {
|
| +class DataElement;
|
| +class BlobDataBuilder;
|
| +struct BlobItemBytesRequest;
|
| +struct BlobItemBytesResponse;
|
| +class BlobStorageContext;
|
| +}
|
| +
|
| +namespace content {
|
| +class ChromeBlobStorageContext;
|
| +
|
| +// This class's responsibility is to listen for and dispatch blob storage
|
| +// messages and handle logistics of blob storage for a single child process.
|
| +// When the child process terminates all blob references attributable to
|
| +// that process go away upon destruction of the instance.
|
| +// This lives in the browser process, is single threaded (IO thread), and there
|
| +// is one per child process.
|
| +class CONTENT_EXPORT BlobDispatcherHost : public BrowserMessageFilter {
|
| + public:
|
| + explicit BlobDispatcherHost(ChromeBlobStorageContext* blob_storage_context);
|
| +
|
| + // BrowserMessageFilter implementation.
|
| + void OnChannelClosing() override;
|
| + bool OnMessageReceived(const IPC::Message& message) override;
|
| +
|
| + 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;
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, EmptyUUIDs);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, SharedMemoryTransfer);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, OnCancelBuildingBlob);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + BlobReferenceWhileConstructing);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + BlobReferenceWhileShortcutConstructing);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + BlobReferenceWhileConstructingCancelled);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, DecrementRefAfterRegister);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, DecrementRefAfterOnStart);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + DecrementRefAfterOnStartWithHandle);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + HostDisconnectAfterRegisterWithHandle);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest, HostDisconnectAfterOnStart);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + HostDisconnectAfterOnMemoryResponse);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + CreateBlobWithBrokenReference);
|
| + FRIEND_TEST_ALL_PREFIXES(BlobDispatcherHostTest,
|
| + DeferenceBlobOnDifferentHost);
|
| +
|
| + 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 OnMemoryItemResponse(
|
| + const std::string& uuid,
|
| + const std::vector<storage::BlobItemBytesResponse>& response);
|
| + void OnCancelBuildingBlob(const std::string& uuid,
|
| + const storage::IPCBlobCreationCancelCode code);
|
| +
|
| + void OnIncrementBlobRefCount(const std::string& uuid);
|
| + void OnDecrementBlobRefCount(const std::string& uuid);
|
| + void OnRegisterPublicBlobURL(const GURL& public_url, const std::string& uuid);
|
| + void OnRevokePublicBlobURL(const GURL& public_url);
|
| +
|
| + storage::BlobStorageContext* context();
|
| +
|
| + void SendMemoryRequest(
|
| + const std::string& uuid,
|
| + scoped_ptr<std::vector<storage::BlobItemBytesRequest>> requests,
|
| + scoped_ptr<std::vector<base::SharedMemoryHandle>> memory_handles,
|
| + scoped_ptr<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);
|
| +
|
| + bool IsInUseInHost(const std::string& uuid);
|
| + bool IsUrlRegisteredInHost(const GURL& blob_url);
|
| +
|
| + // Unregisters all blobs and urls that were registered in this host.
|
| + void ClearHostFromBlobStorageContext();
|
| +
|
| + // Collection of blob ids and a count of how many usages
|
| + // of that id are attributable to this consumer.
|
| + BlobReferenceMap 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_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BlobDispatcherHost);
|
| +};
|
| +} // namespace content
|
| +#endif // CONTENT_BROWSER_BLOB_STORAGE_BLOB_DISPATCHER_HOST_H_
|
|
|