| 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_ | 
|  |