blob: 2a8a3ff6260216a9b40860a977cb0cda666697a8 [file] [log] [blame]
// Copyright (c) 2012 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_FILEAPI_SANDBOX_MOUNT_POINT_PROVIDER_H_
#define WEBKIT_FILEAPI_SANDBOX_MOUNT_POINT_PROVIDER_H_
#include <set>
#include <string>
#include <vector>
#include "base/compiler_specific.h"
#include "base/file_path.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "googleurl/src/gurl.h"
#include "webkit/fileapi/file_system_mount_point_provider.h"
#include "webkit/fileapi/file_system_options.h"
#include "webkit/fileapi/file_system_quota_util.h"
#include "webkit/fileapi/task_runner_bound_observer_list.h"
#include "webkit/storage/webkit_storage_export.h"
namespace base {
class SequencedTaskRunner;
}
namespace quota {
class QuotaManagerProxy;
}
namespace fileapi {
class AsyncFileUtilAdapter;
class LocalFileSystemOperation;
class ObfuscatedFileUtil;
class SandboxQuotaObserver;
// An interface to construct or crack sandboxed filesystem paths for
// TEMPORARY or PERSISTENT filesystems, which are placed under the user's
// profile directory in a sandboxed way.
// This interface also lets one enumerate and remove storage for the origins
// that use the filesystem.
class WEBKIT_STORAGE_EXPORT SandboxMountPointProvider
: public FileSystemMountPointProvider,
public FileSystemQuotaUtil {
public:
// 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;
};
// The FileSystem directory name.
static const FilePath::CharType kFileSystemDirectory[];
static bool CanHandleType(FileSystemType type);
// |file_task_runner| is used to validate the root directory and delete the
// obfuscated file util.
SandboxMountPointProvider(
quota::QuotaManagerProxy* quota_manager_proxy,
base::SequencedTaskRunner* file_task_runner,
const FilePath& profile_path,
const FileSystemOptions& file_system_options);
virtual ~SandboxMountPointProvider();
// FileSystemMountPointProvider overrides.
virtual void ValidateFileSystemRoot(
const GURL& origin_url,
FileSystemType type,
bool create,
const ValidateFileSystemCallback& callback) OVERRIDE;
virtual FilePath GetFileSystemRootPathOnFileThread(
const FileSystemURL& url,
bool create) OVERRIDE;
virtual bool IsAccessAllowed(const FileSystemURL& url) OVERRIDE;
virtual bool IsRestrictedFileName(const FilePath& filename) const OVERRIDE;
virtual FileSystemFileUtil* GetFileUtil(FileSystemType type) OVERRIDE;
virtual AsyncFileUtil* GetAsyncFileUtil(FileSystemType type) OVERRIDE;
virtual FilePermissionPolicy GetPermissionPolicy(
const FileSystemURL& url,
int permissions) const OVERRIDE;
virtual FileSystemOperation* CreateFileSystemOperation(
const FileSystemURL& url,
FileSystemContext* context,
base::PlatformFileError* error_code) const OVERRIDE;
virtual webkit_blob::FileStreamReader* CreateFileStreamReader(
const FileSystemURL& url,
int64 offset,
const base::Time& expected_modification_time,
FileSystemContext* context) const OVERRIDE;
virtual FileStreamWriter* CreateFileStreamWriter(
const FileSystemURL& url,
int64 offset,
FileSystemContext* context) const OVERRIDE;
virtual FileSystemQuotaUtil* GetQuotaUtil() OVERRIDE;
virtual void DeleteFileSystem(
const GURL& origin_url,
FileSystemType type,
FileSystemContext* context,
const DeleteFileSystemCallback& callback) OVERRIDE;
// Returns an origin enumerator of this provider.
// 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.
FilePath GetBaseDirectoryForOriginAndType(
const GURL& origin_url,
FileSystemType type,
bool create);
// Deletes the data on the origin and reports the amount of deleted data
// to the quota manager via |proxy|.
base::PlatformFileError DeleteOriginDataOnFileThread(
FileSystemContext* context,
quota::QuotaManagerProxy* proxy,
const GURL& origin_url,
FileSystemType type);
// FileSystemQuotaUtil overrides.
virtual void GetOriginsForTypeOnFileThread(
FileSystemType type,
std::set<GURL>* origins) OVERRIDE;
virtual void GetOriginsForHostOnFileThread(
FileSystemType type,
const std::string& host,
std::set<GURL>* origins) OVERRIDE;
virtual int64 GetOriginUsageOnFileThread(
FileSystemContext* context,
const GURL& origin_url,
FileSystemType type) OVERRIDE;
virtual void InvalidateUsageCache(const GURL& origin_url,
FileSystemType type) OVERRIDE;
void CollectOpenFileSystemMetrics(base::PlatformFileError error_code);
// Returns update observers for the given type.
const UpdateObserverList* GetUpdateObservers(FileSystemType type) const;
void AddSyncableFileUpdateObserver(FileUpdateObserver* observer,
base::SequencedTaskRunner* task_runner);
void AddSyncableFileChangeObserver(FileChangeObserver* observer,
base::SequencedTaskRunner* task_runner);
// Returns a LocalFileSystemOperation that can be used to apply changes
// to the syncable filesystem.
LocalFileSystemOperation* CreateFileSystemOperationForSync(
FileSystemContext* file_system_context);
private:
friend class SandboxQuotaObserver;
friend class LocalFileSystemTestOriginHelper;
friend class SandboxMountPointProviderMigrationTest;
friend class SandboxMountPointProviderOriginEnumeratorTest;
// Temporarily allowing them to access enable_sync_directory_operation_
friend class CannedSyncableFileSystem;
friend class ObfuscatedFileUtil;
friend class SyncableFileSystemOperation;
// Returns a path to the usage cache file.
FilePath GetUsageCachePathForOriginAndType(
const GURL& origin_url,
FileSystemType type);
// Returns a path to the usage cache file (static version).
static FilePath GetUsageCachePathForOriginAndType(
ObfuscatedFileUtil* sandbox_file_util,
const GURL& origin_url,
FileSystemType type,
base::PlatformFileError* error_out);
// Returns true if the given |url|'s scheme is allowed to access
// filesystem.
bool IsAllowedScheme(const GURL& url) const;
// Enables or disables directory operations in Syncable FileSystem.
void set_enable_sync_directory_operation(bool flag) {
enable_sync_directory_operation_ = flag;
}
bool is_sync_directory_operation_enabled() const {
return enable_sync_directory_operation_;
}
ObfuscatedFileUtil* sandbox_sync_file_util();
scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
const FilePath profile_path_;
FileSystemOptions file_system_options_;
scoped_ptr<AsyncFileUtilAdapter> sandbox_file_util_;
scoped_ptr<SandboxQuotaObserver> quota_observer_;
// Acccessed only on the file thread.
std::set<GURL> visited_origins_;
// Observers.
UpdateObserverList update_observers_;
AccessObserverList access_observers_;
// Observers for syncable file systems.
UpdateObserverList syncable_update_observers_;
ChangeObserverList syncable_change_observers_;
base::Time next_release_time_for_open_filesystem_stat_;
// Indicates if we allow directory operations in syncable file system
// or not. This flag is disabled by default but can be overridden by
// a command-line switch (--enable-sync-directory-operations) or by
// calling set_enable_sync_directory_operation().
// This flag should be used only for testing and should go away when
// we fully support directory operations. (http://crbug.com/161442)
bool enable_sync_directory_operation_;
base::WeakPtrFactory<SandboxMountPointProvider> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SandboxMountPointProvider);
};
} // namespace fileapi
#endif // WEBKIT_FILEAPI_SANDBOX_MOUNT_POINT_PROVIDER_H_