diff options
Diffstat (limited to 'chromium/webkit/browser/fileapi/sandbox_context.h')
-rw-r--r-- | chromium/webkit/browser/fileapi/sandbox_context.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/chromium/webkit/browser/fileapi/sandbox_context.h b/chromium/webkit/browser/fileapi/sandbox_context.h new file mode 100644 index 00000000000..c765077b8d3 --- /dev/null +++ b/chromium/webkit/browser/fileapi/sandbox_context.h @@ -0,0 +1,189 @@ +// Copyright 2013 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 WEBKIT_BROWSER_FILEAPI_SANDBOX_CONTEXT_H_ +#define WEBKIT_BROWSER_FILEAPI_SANDBOX_CONTEXT_H_ + +#include <set> +#include <string> +#include <utility> + +#include "base/files/file_path.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/time/time.h" +#include "webkit/browser/fileapi/file_system_backend.h" +#include "webkit/browser/fileapi/file_system_options.h" +#include "webkit/browser/fileapi/file_system_quota_util.h" +#include "webkit/browser/webkit_storage_browser_export.h" + +namespace base { +class SequencedTaskRunner; +} + +namespace quota { +class QuotaManagerProxy; +class SpecialStoragePolicy; +} + +namespace fileapi { + +class AsyncFileUtilAdapter; +class FileSystemURL; +class FileSystemUsageCache; +class ObfuscatedFileUtil; +class SandboxFileSystemBackend; +class SandboxFileSystemTestHelper; +class SandboxQuotaObserver; + +// This class keeps and provides a sandbox file system context. +// An instance of this class is created and owned by FileSystemContext. +class WEBKIT_STORAGE_BROWSER_EXPORT SandboxContext { + public: + typedef FileSystemBackend::OpenFileSystemCallback OpenFileSystemCallback; + + // The FileSystem directory name. + static const base::FilePath::CharType kFileSystemDirectory[]; + + // Origin enumerator interface. + // An instance of this interface is assumed to be called on the file thread. + class OriginEnumerator { + public: + virtual ~OriginEnumerator() {} + + // Returns the next origin. Returns empty if there are no more origins. + virtual GURL Next() = 0; + + // Returns the current origin's information. + virtual bool HasFileSystemType(FileSystemType type) const = 0; + }; + + SandboxContext( + quota::QuotaManagerProxy* quota_manager_proxy, + base::SequencedTaskRunner* file_task_runner, + const base::FilePath& profile_path, + quota::SpecialStoragePolicy* special_storage_policy, + const FileSystemOptions& file_system_options); + + ~SandboxContext(); + + // Performs API-specific validity checks on the given path |url|. + // Returns true if access to |url| is valid in this filesystem. + bool IsAccessValid(const FileSystemURL& url) const; + + // Returns true if the given |url|'s scheme is allowed to access + // filesystem. + bool IsAllowedScheme(const GURL& url) const; + + // Returns an origin enumerator of sandbox filesystem. + // This method can only be called on the file thread. + OriginEnumerator* CreateOriginEnumerator(); + + // Gets a base directory path of the sandboxed filesystem that is + // specified by |origin_url| and |type|. + // (The path is similar to the origin's root path but doesn't contain + // the 'unique' part.) + // Returns an empty path if the given type is invalid. + // This method can only be called on the file thread. + base::FilePath GetBaseDirectoryForOriginAndType( + const GURL& origin_url, + FileSystemType type, + bool create); + + // FileSystemBackend helpers. + void OpenFileSystem( + const GURL& origin_url, + FileSystemType type, + OpenFileSystemMode mode, + const OpenFileSystemCallback& callback, + const GURL& root_url); + + // FileSystemQuotaUtil helpers. + base::PlatformFileError DeleteOriginDataOnFileThread( + FileSystemContext* context, + quota::QuotaManagerProxy* proxy, + const GURL& origin_url, + FileSystemType type); + void GetOriginsForTypeOnFileThread( + FileSystemType type, + std::set<GURL>* origins); + void GetOriginsForHostOnFileThread( + FileSystemType type, + const std::string& host, + std::set<GURL>* origins); + int64 GetOriginUsageOnFileThread( + FileSystemContext* context, + const GURL& origin_url, + FileSystemType type); + void InvalidateUsageCache( + const GURL& origin_url, + FileSystemType type); + void StickyInvalidateUsageCache( + const GURL& origin_url, + FileSystemType type); + + void CollectOpenFileSystemMetrics(base::PlatformFileError error_code); + + base::SequencedTaskRunner* file_task_runner() { + return file_task_runner_.get(); + } + + AsyncFileUtilAdapter* file_util() { return sandbox_file_util_.get(); } + FileSystemUsageCache* usage_cache() { return file_system_usage_cache_.get(); } + SandboxQuotaObserver* quota_observer() { return quota_observer_.get(); }; + + quota::SpecialStoragePolicy* special_storage_policy() { + return special_storage_policy_.get(); + } + + FileSystemOptions file_system_options() { return file_system_options_; } + + ObfuscatedFileUtil* sync_file_util(); + + private: + friend class SandboxQuotaObserver; + friend class SandboxFileSystemTestHelper; + + // Returns a path to the usage cache file. + base::FilePath GetUsageCachePathForOriginAndType( + const GURL& origin_url, + FileSystemType type); + + // Returns a path to the usage cache file (static version). + static base::FilePath GetUsageCachePathForOriginAndType( + ObfuscatedFileUtil* sandbox_file_util, + const GURL& origin_url, + FileSystemType type, + base::PlatformFileError* error_out); + + int64 RecalculateUsage(FileSystemContext* context, + const GURL& origin, + FileSystemType type); + + scoped_refptr<base::SequencedTaskRunner> file_task_runner_; + + scoped_ptr<AsyncFileUtilAdapter> sandbox_file_util_; + scoped_ptr<FileSystemUsageCache> file_system_usage_cache_; + scoped_ptr<SandboxQuotaObserver> quota_observer_; + + scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_; + + FileSystemOptions file_system_options_; + + // Acccessed only on the file thread. + std::set<GURL> visited_origins_; + + std::set<std::pair<GURL, FileSystemType> > sticky_dirty_origins_; + + base::Time next_release_time_for_open_filesystem_stat_; + + base::WeakPtrFactory<SandboxContext> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(SandboxContext); +}; + +} // namespace fileapi + +#endif // WEBKIT_BROWSER_FILEAPI_SANDBOX_CONTEXT_H_ |