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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_FILEAPI_FILEAPI_MESSAGE_FILTER_H_ 6 #define CONTENT_BROWSER_FILEAPI_FILEAPI_MESSAGE_FILTER_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 12 #include "base/callback.h" 13 #include "base/containers/hash_tables.h" 14 #include "base/files/file_util_proxy.h" 15 #include "base/memory/ref_counted.h" 16 #include "base/memory/shared_memory.h" 17 #include "content/browser/streams/stream.h" 18 #include "content/browser/streams/stream_context.h" 19 #include "content/common/content_export.h" 20 #include "content/public/browser/browser_message_filter.h" 21 #include "storage/browser/fileapi/file_system_context.h" 22 #include "storage/browser/fileapi/file_system_operation_runner.h" 23 #include "storage/common/blob/blob_data.h" 24 #include "storage/common/fileapi/file_system_types.h" 25 #include "storage/common/quota/quota_types.h" 26 27 class GURL; 28 29 namespace base { 30 class FilePath; 31 class Time; 32 } 33 34 namespace storage { 35 class FileSystemURL; 36 class FileSystemOperationRunner; 37 struct DirectoryEntry; 38 struct FileSystemInfo; 39 } 40 41 namespace net { 42 class URLRequestContext; 43 class URLRequestContextGetter; 44 } // namespace net 45 46 namespace content { 47 class BlobStorageHost; 48 } 49 50 namespace storage { 51 class ShareableFileReference; 52 } 53 54 namespace content { 55 class ChildProcessSecurityPolicyImpl; 56 class ChromeBlobStorageContext; 57 58 // TODO(tyoshino): Factor out code except for IPC gluing from 59 // FileAPIMessageFilter into separate classes. See crbug.com/263741. 60 class CONTENT_EXPORT FileAPIMessageFilter : public BrowserMessageFilter { 61 public: 62 // Used by the renderer process host on the UI thread. 63 FileAPIMessageFilter(int process_id, 64 net::URLRequestContextGetter* request_context_getter, 65 storage::FileSystemContext* file_system_context, 66 ChromeBlobStorageContext* blob_storage_context, 67 StreamContext* stream_context); 68 // Used by the worker process host on the IO thread. 69 FileAPIMessageFilter(int process_id, 70 net::URLRequestContext* request_context, 71 storage::FileSystemContext* file_system_context, 72 ChromeBlobStorageContext* blob_storage_context, 73 StreamContext* stream_context); 74 75 // BrowserMessageFilter implementation. 76 virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; 77 virtual void OnChannelClosing() OVERRIDE; 78 virtual base::TaskRunner* OverrideTaskRunnerForMessage( 79 const IPC::Message& message) OVERRIDE; 80 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 81 82 protected: 83 virtual ~FileAPIMessageFilter(); 84 85 virtual void BadMessageReceived() OVERRIDE; 86 87 private: 88 typedef storage::FileSystemOperationRunner::OperationID OperationID; 89 90 void OnOpenFileSystem(int request_id, 91 const GURL& origin_url, 92 storage::FileSystemType type); 93 void OnResolveURL(int request_id, 94 const GURL& filesystem_url); 95 void OnDeleteFileSystem(int request_id, 96 const GURL& origin_url, 97 storage::FileSystemType type); 98 void OnMove(int request_id, 99 const GURL& src_path, 100 const GURL& dest_path); 101 void OnCopy(int request_id, 102 const GURL& src_path, 103 const GURL& dest_path); 104 void OnRemove(int request_id, const GURL& path, bool recursive); 105 void OnReadMetadata(int request_id, const GURL& path); 106 void OnCreate(int request_id, 107 const GURL& path, 108 bool exclusive, 109 bool is_directory, 110 bool recursive); 111 void OnExists(int request_id, const GURL& path, bool is_directory); 112 void OnReadDirectory(int request_id, const GURL& path); 113 void OnWrite(int request_id, 114 const GURL& path, 115 const std::string& blob_uuid, 116 int64 offset); 117 void OnTruncate(int request_id, const GURL& path, int64 length); 118 void OnTouchFile(int request_id, 119 const GURL& path, 120 const base::Time& last_access_time, 121 const base::Time& last_modified_time); 122 void OnCancel(int request_id, int request_to_cancel); 123 void OnSyncGetPlatformPath(const GURL& path, 124 base::FilePath* platform_path); 125 void OnCreateSnapshotFile(int request_id, 126 const GURL& path); 127 void OnDidReceiveSnapshotFile(int request_id); 128 129 // Handlers for BlobHostMsg_ family messages. 130 131 void OnStartBuildingBlob(const std::string& uuid); 132 void OnAppendBlobDataItemToBlob(const std::string& uuid, 133 const storage::BlobData::Item& item); 134 void OnAppendSharedMemoryToBlob(const std::string& uuid, 135 base::SharedMemoryHandle handle, 136 size_t buffer_size); 137 void OnFinishBuildingBlob(const std::string& uuid, 138 const std::string& content_type); 139 void OnIncrementBlobRefCount(const std::string& uuid); 140 void OnDecrementBlobRefCount(const std::string& uuid); 141 void OnRegisterPublicBlobURL(const GURL& public_url, const std::string& uuid); 142 void OnRevokePublicBlobURL(const GURL& public_url); 143 144 // Handlers for StreamHostMsg_ family messages. 145 // 146 // TODO(tyoshino): Consider renaming BlobData to more generic one as it's now 147 // used for Stream. 148 149 // Currently |content_type| is ignored. 150 // 151 // TODO(tyoshino): Set |content_type| to the stream. 152 void OnStartBuildingStream(const GURL& url, const std::string& content_type); 153 void OnAppendBlobDataItemToStream(const GURL& url, 154 const storage::BlobData::Item& item); 155 void OnAppendSharedMemoryToStream( 156 const GURL& url, base::SharedMemoryHandle handle, size_t buffer_size); 157 void OnFinishBuildingStream(const GURL& url); 158 void OnAbortBuildingStream(const GURL& url); 159 void OnCloneStream(const GURL& url, const GURL& src_url); 160 void OnRemoveStream(const GURL& url); 161 162 // Callback functions to be used when each file operation is finished. 163 void DidFinish(int request_id, base::File::Error result); 164 void DidGetMetadata(int request_id, 165 base::File::Error result, 166 const base::File::Info& info); 167 void DidGetMetadataForStreaming(int request_id, 168 base::File::Error result, 169 const base::File::Info& info); 170 void DidReadDirectory(int request_id, 171 base::File::Error result, 172 const std::vector<storage::DirectoryEntry>& entries, 173 bool has_more); 174 void DidWrite(int request_id, 175 base::File::Error result, 176 int64 bytes, 177 bool complete); 178 void DidOpenFileSystem(int request_id, 179 const GURL& root, 180 const std::string& filesystem_name, 181 base::File::Error result); 182 void DidResolveURL(int request_id, 183 base::File::Error result, 184 const storage::FileSystemInfo& info, 185 const base::FilePath& file_path, 186 storage::FileSystemContext::ResolvedEntryType type); 187 void DidDeleteFileSystem(int request_id, 188 base::File::Error result); 189 void DidCreateSnapshot( 190 int request_id, 191 const storage::FileSystemURL& url, 192 base::File::Error result, 193 const base::File::Info& info, 194 const base::FilePath& platform_path, 195 const scoped_refptr<storage::ShareableFileReference>& file_ref); 196 197 // Sends a FileSystemMsg_DidFail and returns false if |url| is invalid. 198 bool ValidateFileSystemURL(int request_id, const storage::FileSystemURL& url); 199 200 // Retrieves the Stream object for |url| from |stream_context_|. Returns unset 201 // scoped_refptr when there's no Stream instance for the given |url| 202 // registered with stream_context_->registry(). 203 scoped_refptr<Stream> GetStreamForURL(const GURL& url); 204 205 storage::FileSystemOperationRunner* operation_runner() { 206 return operation_runner_.get(); 207 } 208 209 int process_id_; 210 211 storage::FileSystemContext* context_; 212 ChildProcessSecurityPolicyImpl* security_policy_; 213 214 // Keeps map from request_id to OperationID for ongoing operations. 215 // (Primarily for Cancel operation) 216 typedef std::map<int, OperationID> OperationsMap; 217 OperationsMap operations_; 218 219 // The getter holds the context until OnChannelConnected() can be called from 220 // the IO thread, which will extract the net::URLRequestContext from it. 221 scoped_refptr<net::URLRequestContextGetter> request_context_getter_; 222 net::URLRequestContext* request_context_; 223 224 scoped_refptr<ChromeBlobStorageContext> blob_storage_context_; 225 scoped_refptr<StreamContext> stream_context_; 226 227 scoped_ptr<storage::FileSystemOperationRunner> operation_runner_; 228 229 // Keeps track of blobs used in this process and cleans up 230 // when the renderer process dies. 231 scoped_ptr<BlobStorageHost> blob_storage_host_; 232 233 // Keep track of stream URLs registered in this process. Need to unregister 234 // all of them when the renderer process dies. 235 base::hash_set<std::string> stream_urls_; 236 237 // Used to keep snapshot files alive while a DidCreateSnapshot 238 // is being sent to the renderer. 239 std::map<int, scoped_refptr<storage::ShareableFileReference> > 240 in_transit_snapshot_files_; 241 242 DISALLOW_COPY_AND_ASSIGN(FileAPIMessageFilter); 243 }; 244 245 } // namespace content 246 247 #endif // CONTENT_BROWSER_FILEAPI_FILEAPI_MESSAGE_FILTER_H_ 248