Home | History | Annotate | Download | only in fileapi
      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