1 // Copyright 2013 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 WEBKIT_BROWSER_FILEAPI_PLUGIN_PRIVATE_FILE_SYSTEM_BACKEND_H_ 6 #define WEBKIT_BROWSER_FILEAPI_PLUGIN_PRIVATE_FILE_SYSTEM_BACKEND_H_ 7 8 #include <set> 9 #include <string> 10 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/weak_ptr.h" 13 #include "webkit/browser/fileapi/file_system_backend.h" 14 #include "webkit/browser/fileapi/file_system_options.h" 15 #include "webkit/browser/fileapi/file_system_quota_util.h" 16 17 namespace base { 18 class SequencedTaskRunner; 19 } 20 21 namespace content { 22 class PluginPrivateFileSystemBackendTest; 23 } 24 25 namespace quota { 26 class SpecialStoragePolicy; 27 } 28 29 namespace fileapi { 30 31 class ObfuscatedFileUtil; 32 33 class WEBKIT_STORAGE_BROWSER_EXPORT PluginPrivateFileSystemBackend 34 : public FileSystemBackend, 35 public FileSystemQuotaUtil { 36 public: 37 class FileSystemIDToPluginMap; 38 typedef base::Callback<void(base::File::Error result)> StatusCallback; 39 40 PluginPrivateFileSystemBackend( 41 base::SequencedTaskRunner* file_task_runner, 42 const base::FilePath& profile_path, 43 quota::SpecialStoragePolicy* special_storage_policy, 44 const FileSystemOptions& file_system_options); 45 virtual ~PluginPrivateFileSystemBackend(); 46 47 // This must be used to open 'private' filesystem instead of regular 48 // OpenFileSystem. 49 // |plugin_id| must be an identifier string for per-plugin 50 // isolation, e.g. name, MIME type etc. 51 // NOTE: |plugin_id| must be sanitized ASCII string that doesn't 52 // include *any* dangerous character like '/'. 53 void OpenPrivateFileSystem( 54 const GURL& origin_url, 55 FileSystemType type, 56 const std::string& filesystem_id, 57 const std::string& plugin_id, 58 OpenFileSystemMode mode, 59 const StatusCallback& callback); 60 61 // FileSystemBackend overrides. 62 virtual bool CanHandleType(FileSystemType type) const OVERRIDE; 63 virtual void Initialize(FileSystemContext* context) OVERRIDE; 64 virtual void ResolveURL(const FileSystemURL& url, 65 OpenFileSystemMode mode, 66 const OpenFileSystemCallback& callback) OVERRIDE; 67 virtual AsyncFileUtil* GetAsyncFileUtil(FileSystemType type) OVERRIDE; 68 virtual CopyOrMoveFileValidatorFactory* GetCopyOrMoveFileValidatorFactory( 69 FileSystemType type, 70 base::File::Error* error_code) OVERRIDE; 71 virtual FileSystemOperation* CreateFileSystemOperation( 72 const FileSystemURL& url, 73 FileSystemContext* context, 74 base::File::Error* error_code) const OVERRIDE; 75 virtual bool SupportsStreaming(const FileSystemURL& url) const OVERRIDE; 76 virtual scoped_ptr<webkit_blob::FileStreamReader> CreateFileStreamReader( 77 const FileSystemURL& url, 78 int64 offset, 79 const base::Time& expected_modification_time, 80 FileSystemContext* context) const OVERRIDE; 81 virtual scoped_ptr<FileStreamWriter> CreateFileStreamWriter( 82 const FileSystemURL& url, 83 int64 offset, 84 FileSystemContext* context) const OVERRIDE; 85 virtual FileSystemQuotaUtil* GetQuotaUtil() OVERRIDE; 86 87 // FileSystemQuotaUtil overrides. 88 virtual base::File::Error DeleteOriginDataOnFileTaskRunner( 89 FileSystemContext* context, 90 quota::QuotaManagerProxy* proxy, 91 const GURL& origin_url, 92 FileSystemType type) OVERRIDE; 93 virtual void GetOriginsForTypeOnFileTaskRunner( 94 FileSystemType type, 95 std::set<GURL>* origins) OVERRIDE; 96 virtual void GetOriginsForHostOnFileTaskRunner( 97 FileSystemType type, 98 const std::string& host, 99 std::set<GURL>* origins) OVERRIDE; 100 virtual int64 GetOriginUsageOnFileTaskRunner( 101 FileSystemContext* context, 102 const GURL& origin_url, 103 FileSystemType type) OVERRIDE; 104 virtual scoped_refptr<QuotaReservation> 105 CreateQuotaReservationOnFileTaskRunner( 106 const GURL& origin_url, 107 FileSystemType type) OVERRIDE; 108 virtual void AddFileUpdateObserver( 109 FileSystemType type, 110 FileUpdateObserver* observer, 111 base::SequencedTaskRunner* task_runner) OVERRIDE; 112 virtual void AddFileChangeObserver( 113 FileSystemType type, 114 FileChangeObserver* observer, 115 base::SequencedTaskRunner* task_runner) OVERRIDE; 116 virtual void AddFileAccessObserver( 117 FileSystemType type, 118 FileAccessObserver* observer, 119 base::SequencedTaskRunner* task_runner) OVERRIDE; 120 virtual const UpdateObserverList* GetUpdateObservers( 121 FileSystemType type) const OVERRIDE; 122 virtual const ChangeObserverList* GetChangeObservers( 123 FileSystemType type) const OVERRIDE; 124 virtual const AccessObserverList* GetAccessObservers( 125 FileSystemType type) const OVERRIDE; 126 127 private: 128 friend class content::PluginPrivateFileSystemBackendTest; 129 130 ObfuscatedFileUtil* obfuscated_file_util(); 131 const base::FilePath& base_path() const { return base_path_; } 132 133 scoped_refptr<base::SequencedTaskRunner> file_task_runner_; 134 const FileSystemOptions file_system_options_; 135 const base::FilePath base_path_; 136 scoped_ptr<AsyncFileUtil> file_util_; 137 FileSystemIDToPluginMap* plugin_map_; // Owned by file_util_. 138 base::WeakPtrFactory<PluginPrivateFileSystemBackend> weak_factory_; 139 140 DISALLOW_COPY_AND_ASSIGN(PluginPrivateFileSystemBackend); 141 }; 142 143 } // namespace fileapi 144 145 #endif // WEBKIT_BROWSER_FILEAPI_PLUGIN_PRIVATE_FILE_SYSTEM_BACKEND_H_ 146