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_SANDBOX_FILE_SYSTEM_BACKEND_DELEGATE_H_
      6 #define WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_SYSTEM_BACKEND_DELEGATE_H_
      7 
      8 #include <map>
      9 #include <set>
     10 #include <string>
     11 #include <utility>
     12 
     13 #include "base/files/file_path.h"
     14 #include "base/gtest_prod_util.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/memory/weak_ptr.h"
     18 #include "base/threading/thread_checker.h"
     19 #include "base/time/time.h"
     20 #include "webkit/browser/fileapi/file_system_backend.h"
     21 #include "webkit/browser/fileapi/file_system_options.h"
     22 #include "webkit/browser/fileapi/file_system_quota_util.h"
     23 #include "webkit/browser/webkit_storage_browser_export.h"
     24 
     25 namespace base {
     26 class SequencedTaskRunner;
     27 }
     28 
     29 namespace content {
     30 class SandboxFileSystemBackendDelegateTest;
     31 class SandboxFileSystemTestHelper;
     32 }
     33 
     34 namespace quota {
     35 class QuotaManagerProxy;
     36 class SpecialStoragePolicy;
     37 }
     38 
     39 namespace webkit_blob {
     40 class FileStreamReader;
     41 }
     42 
     43 namespace fileapi {
     44 
     45 class AsyncFileUtil;
     46 class FileStreamWriter;
     47 class FileSystemFileUtil;
     48 class FileSystemOperationContext;
     49 class FileSystemURL;
     50 class FileSystemUsageCache;
     51 class ObfuscatedFileUtil;
     52 class QuotaReservationManager;
     53 class SandboxFileSystemBackend;
     54 class SandboxQuotaObserver;
     55 
     56 // Delegate implementation of the some methods in Sandbox/SyncFileSystemBackend.
     57 // An instance of this class is created and owned by FileSystemContext.
     58 class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate
     59     : public FileSystemQuotaUtil {
     60  public:
     61   typedef FileSystemBackend::OpenFileSystemCallback OpenFileSystemCallback;
     62 
     63   // The FileSystem directory name.
     64   static const base::FilePath::CharType kFileSystemDirectory[];
     65 
     66   // Origin enumerator interface.
     67   // An instance of this interface is assumed to be called on the file thread.
     68   class OriginEnumerator {
     69    public:
     70     virtual ~OriginEnumerator() {}
     71 
     72     // Returns the next origin.  Returns empty if there are no more origins.
     73     virtual GURL Next() = 0;
     74 
     75     // Returns the current origin's information.
     76     virtual bool HasFileSystemType(FileSystemType type) const = 0;
     77   };
     78 
     79   // Returns the type directory name in sandbox directory for given |type|.
     80   static std::string GetTypeString(FileSystemType type);
     81 
     82   SandboxFileSystemBackendDelegate(
     83       quota::QuotaManagerProxy* quota_manager_proxy,
     84       base::SequencedTaskRunner* file_task_runner,
     85       const base::FilePath& profile_path,
     86       quota::SpecialStoragePolicy* special_storage_policy,
     87       const FileSystemOptions& file_system_options);
     88 
     89   virtual ~SandboxFileSystemBackendDelegate();
     90 
     91   // Returns an origin enumerator of sandbox filesystem.
     92   // This method can only be called on the file thread.
     93   OriginEnumerator* CreateOriginEnumerator();
     94 
     95   // Gets a base directory path of the sandboxed filesystem that is
     96   // specified by |origin_url| and |type|.
     97   // (The path is similar to the origin's root path but doesn't contain
     98   // the 'unique' part.)
     99   // Returns an empty path if the given type is invalid.
    100   // This method can only be called on the file thread.
    101   base::FilePath GetBaseDirectoryForOriginAndType(
    102       const GURL& origin_url,
    103       FileSystemType type,
    104       bool create);
    105 
    106   // FileSystemBackend helpers.
    107   void OpenFileSystem(
    108       const GURL& origin_url,
    109       FileSystemType type,
    110       OpenFileSystemMode mode,
    111       const OpenFileSystemCallback& callback,
    112       const GURL& root_url);
    113   scoped_ptr<FileSystemOperationContext> CreateFileSystemOperationContext(
    114       const FileSystemURL& url,
    115       FileSystemContext* context,
    116       base::File::Error* error_code) const;
    117   scoped_ptr<webkit_blob::FileStreamReader> CreateFileStreamReader(
    118       const FileSystemURL& url,
    119       int64 offset,
    120       const base::Time& expected_modification_time,
    121       FileSystemContext* context) const;
    122   scoped_ptr<FileStreamWriter> CreateFileStreamWriter(
    123       const FileSystemURL& url,
    124       int64 offset,
    125       FileSystemContext* context,
    126       FileSystemType type) const;
    127 
    128   // FileSystemQuotaUtil overrides.
    129   virtual base::File::Error DeleteOriginDataOnFileTaskRunner(
    130       FileSystemContext* context,
    131       quota::QuotaManagerProxy* proxy,
    132       const GURL& origin_url,
    133       FileSystemType type) OVERRIDE;
    134   virtual void GetOriginsForTypeOnFileTaskRunner(
    135       FileSystemType type,
    136       std::set<GURL>* origins) OVERRIDE;
    137   virtual void GetOriginsForHostOnFileTaskRunner(
    138       FileSystemType type,
    139       const std::string& host,
    140       std::set<GURL>* origins) OVERRIDE;
    141   virtual int64 GetOriginUsageOnFileTaskRunner(
    142       FileSystemContext* context,
    143       const GURL& origin_url,
    144       FileSystemType type) OVERRIDE;
    145   virtual scoped_refptr<QuotaReservation>
    146       CreateQuotaReservationOnFileTaskRunner(
    147           const GURL& origin_url,
    148           FileSystemType type) OVERRIDE;
    149   virtual void AddFileUpdateObserver(
    150       FileSystemType type,
    151       FileUpdateObserver* observer,
    152       base::SequencedTaskRunner* task_runner) OVERRIDE;
    153   virtual void AddFileChangeObserver(
    154       FileSystemType type,
    155       FileChangeObserver* observer,
    156       base::SequencedTaskRunner* task_runner) OVERRIDE;
    157   virtual void AddFileAccessObserver(
    158       FileSystemType type,
    159       FileAccessObserver* observer,
    160       base::SequencedTaskRunner* task_runner) OVERRIDE;
    161   virtual const UpdateObserverList* GetUpdateObservers(
    162       FileSystemType type) const OVERRIDE;
    163   virtual const ChangeObserverList* GetChangeObservers(
    164       FileSystemType type) const OVERRIDE;
    165   virtual const AccessObserverList* GetAccessObservers(
    166       FileSystemType type) const OVERRIDE;
    167 
    168   // Registers quota observer for file updates on filesystem of |type|.
    169   void RegisterQuotaUpdateObserver(FileSystemType type);
    170 
    171   void InvalidateUsageCache(const GURL& origin_url,
    172                             FileSystemType type);
    173   void StickyInvalidateUsageCache(const GURL& origin_url,
    174                                   FileSystemType type);
    175 
    176   void CollectOpenFileSystemMetrics(base::File::Error error_code);
    177 
    178   base::SequencedTaskRunner* file_task_runner() {
    179     return file_task_runner_.get();
    180   }
    181 
    182   AsyncFileUtil* file_util() { return sandbox_file_util_.get(); }
    183   FileSystemUsageCache* usage_cache() { return file_system_usage_cache_.get(); }
    184   SandboxQuotaObserver* quota_observer() { return quota_observer_.get(); }
    185 
    186   quota::SpecialStoragePolicy* special_storage_policy() {
    187     return special_storage_policy_.get();
    188   }
    189 
    190   const FileSystemOptions& file_system_options() const {
    191     return file_system_options_;
    192   }
    193 
    194   FileSystemFileUtil* sync_file_util();
    195 
    196  private:
    197   friend class QuotaBackendImpl;
    198   friend class SandboxQuotaObserver;
    199   friend class content::SandboxFileSystemBackendDelegateTest;
    200   friend class content::SandboxFileSystemTestHelper;
    201 
    202   // Performs API-specific validity checks on the given path |url|.
    203   // Returns true if access to |url| is valid in this filesystem.
    204   bool IsAccessValid(const FileSystemURL& url) const;
    205 
    206   // Returns true if the given |url|'s scheme is allowed to access
    207   // filesystem.
    208   bool IsAllowedScheme(const GURL& url) const;
    209 
    210   // Returns a path to the usage cache file.
    211   base::FilePath GetUsageCachePathForOriginAndType(
    212       const GURL& origin_url,
    213       FileSystemType type);
    214 
    215   // Returns a path to the usage cache file (static version).
    216   static base::FilePath GetUsageCachePathForOriginAndType(
    217       ObfuscatedFileUtil* sandbox_file_util,
    218       const GURL& origin_url,
    219       FileSystemType type,
    220       base::File::Error* error_out);
    221 
    222   int64 RecalculateUsage(FileSystemContext* context,
    223                          const GURL& origin,
    224                          FileSystemType type);
    225 
    226   ObfuscatedFileUtil* obfuscated_file_util();
    227 
    228   scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
    229 
    230   scoped_ptr<AsyncFileUtil> sandbox_file_util_;
    231   scoped_ptr<FileSystemUsageCache> file_system_usage_cache_;
    232   scoped_ptr<SandboxQuotaObserver> quota_observer_;
    233   scoped_ptr<QuotaReservationManager> quota_reservation_manager_;
    234 
    235   scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
    236 
    237   FileSystemOptions file_system_options_;
    238 
    239   bool is_filesystem_opened_;
    240   base::ThreadChecker io_thread_checker_;
    241 
    242   // Accessed only on the file thread.
    243   std::set<GURL> visited_origins_;
    244 
    245   std::set<std::pair<GURL, FileSystemType> > sticky_dirty_origins_;
    246 
    247   std::map<FileSystemType, UpdateObserverList> update_observers_;
    248   std::map<FileSystemType, ChangeObserverList> change_observers_;
    249   std::map<FileSystemType, AccessObserverList> access_observers_;
    250 
    251   base::Time next_release_time_for_open_filesystem_stat_;
    252 
    253   base::WeakPtrFactory<SandboxFileSystemBackendDelegate> weak_factory_;
    254 
    255   DISALLOW_COPY_AND_ASSIGN(SandboxFileSystemBackendDelegate);
    256 };
    257 
    258 }  // namespace fileapi
    259 
    260 #endif  // WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_SYSTEM_BACKEND_DELEGATE_H_
    261