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.
5 #include "content/public/test/test_file_system_backend.h"
11 #include "base/file_util.h"
12 #include "base/sequenced_task_runner.h"
13 #include "webkit/browser/blob/file_stream_reader.h"
14 #include "webkit/browser/fileapi/copy_or_move_file_validator.h"
15 #include "webkit/browser/fileapi/file_observers.h"
16 #include "webkit/browser/fileapi/file_system_operation.h"
17 #include "webkit/browser/fileapi/file_system_operation_context.h"
18 #include "webkit/browser/fileapi/file_system_quota_util.h"
19 #include "webkit/browser/fileapi/local_file_util.h"
20 #include "webkit/browser/fileapi/native_file_util.h"
21 #include "webkit/browser/fileapi/sandbox_file_stream_writer.h"
22 #include "webkit/browser/quota/quota_manager.h"
23 #include "webkit/common/fileapi/file_system_util.h"
29 class TestFileUtil : public LocalFileUtil {
31 explicit TestFileUtil(const base::FilePath& base_path)
32 : base_path_(base_path) {}
33 virtual ~TestFileUtil() {}
35 // LocalFileUtil overrides.
36 virtual base::PlatformFileError GetLocalFilePath(
37 FileSystemOperationContext* context,
38 const FileSystemURL& file_system_url,
39 base::FilePath* local_file_path) OVERRIDE {
40 *local_file_path = base_path_.Append(file_system_url.path());
41 return base::PLATFORM_FILE_OK;
45 base::FilePath base_path_;
50 // This only supports single origin.
51 class TestFileSystemBackend::QuotaUtil
52 : public FileSystemQuotaUtil,
53 public FileUpdateObserver {
55 QuotaUtil(base::SequencedTaskRunner* task_runner)
57 task_runner_(task_runner) {
58 update_observers_ = update_observers_.AddObserver(this, task_runner_.get());
60 virtual ~QuotaUtil() {}
62 // FileSystemQuotaUtil overrides.
63 virtual base::PlatformFileError DeleteOriginDataOnFileThread(
64 FileSystemContext* context,
65 quota::QuotaManagerProxy* proxy,
66 const GURL& origin_url,
67 FileSystemType type) OVERRIDE {
69 return base::PLATFORM_FILE_OK;
72 virtual void GetOriginsForTypeOnFileThread(
74 std::set<GURL>* origins) OVERRIDE {
78 virtual void GetOriginsForHostOnFileThread(
80 const std::string& host,
81 std::set<GURL>* origins) OVERRIDE {
85 virtual int64 GetOriginUsageOnFileThread(
86 FileSystemContext* context,
87 const GURL& origin_url,
88 FileSystemType type) OVERRIDE {
92 virtual void AddFileUpdateObserver(
94 FileUpdateObserver* observer,
95 base::SequencedTaskRunner* task_runner) OVERRIDE {
99 virtual void AddFileChangeObserver(
101 FileChangeObserver* observer,
102 base::SequencedTaskRunner* task_runner) OVERRIDE {
103 change_observers_ = change_observers_.AddObserver(observer, task_runner);
106 virtual void AddFileAccessObserver(
108 FileAccessObserver* observer,
109 base::SequencedTaskRunner* task_runner) OVERRIDE {
113 virtual const UpdateObserverList* GetUpdateObservers(
114 FileSystemType type) const OVERRIDE {
115 return &update_observers_;
118 virtual const ChangeObserverList* GetChangeObservers(
119 FileSystemType type) const OVERRIDE {
120 return &change_observers_;
123 virtual const AccessObserverList* GetAccessObservers(
124 FileSystemType type) const OVERRIDE {
129 // FileUpdateObserver overrides.
130 virtual void OnStartUpdate(const FileSystemURL& url) OVERRIDE {}
131 virtual void OnUpdate(const FileSystemURL& url, int64 delta) OVERRIDE {
134 virtual void OnEndUpdate(const FileSystemURL& url) OVERRIDE {}
136 base::SequencedTaskRunner* task_runner() { return task_runner_.get(); }
141 scoped_refptr<base::SequencedTaskRunner> task_runner_;
143 UpdateObserverList update_observers_;
144 ChangeObserverList change_observers_;
147 TestFileSystemBackend::TestFileSystemBackend(
148 base::SequencedTaskRunner* task_runner,
149 const base::FilePath& base_path)
150 : base_path_(base_path),
151 file_util_(new AsyncFileUtilAdapter(new TestFileUtil(base_path))),
152 quota_util_(new QuotaUtil(task_runner)),
153 require_copy_or_move_validator_(false) {
156 TestFileSystemBackend::~TestFileSystemBackend() {
159 bool TestFileSystemBackend::CanHandleType(FileSystemType type) const {
160 return (type == kFileSystemTypeTest);
163 void TestFileSystemBackend::Initialize(FileSystemContext* context) {
166 void TestFileSystemBackend::OpenFileSystem(
167 const GURL& origin_url,
169 OpenFileSystemMode mode,
170 const OpenFileSystemCallback& callback) {
171 callback.Run(GetFileSystemRootURI(origin_url, type),
172 GetFileSystemName(origin_url, type),
173 base::PLATFORM_FILE_OK);
176 AsyncFileUtil* TestFileSystemBackend::GetAsyncFileUtil(FileSystemType type) {
177 return file_util_.get();
180 CopyOrMoveFileValidatorFactory*
181 TestFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
182 FileSystemType type, base::PlatformFileError* error_code) {
184 *error_code = base::PLATFORM_FILE_OK;
185 if (require_copy_or_move_validator_) {
186 if (!copy_or_move_file_validator_factory_)
187 *error_code = base::PLATFORM_FILE_ERROR_SECURITY;
188 return copy_or_move_file_validator_factory_.get();
193 void TestFileSystemBackend::InitializeCopyOrMoveFileValidatorFactory(
194 scoped_ptr<CopyOrMoveFileValidatorFactory> factory) {
195 if (!copy_or_move_file_validator_factory_)
196 copy_or_move_file_validator_factory_ = factory.Pass();
199 FileSystemOperation* TestFileSystemBackend::CreateFileSystemOperation(
200 const FileSystemURL& url,
201 FileSystemContext* context,
202 base::PlatformFileError* error_code) const {
203 scoped_ptr<FileSystemOperationContext> operation_context(
204 new FileSystemOperationContext(context));
205 operation_context->set_update_observers(*GetUpdateObservers(url.type()));
206 operation_context->set_change_observers(
207 *quota_util_->GetChangeObservers(url.type()));
208 return FileSystemOperation::Create(url, context, operation_context.Pass());
211 scoped_ptr<webkit_blob::FileStreamReader>
212 TestFileSystemBackend::CreateFileStreamReader(
213 const FileSystemURL& url,
215 const base::Time& expected_modification_time,
216 FileSystemContext* context) const {
217 return scoped_ptr<webkit_blob::FileStreamReader>(
218 webkit_blob::FileStreamReader::CreateForFileSystemFile(
219 context, url, offset, expected_modification_time));
222 scoped_ptr<fileapi::FileStreamWriter>
223 TestFileSystemBackend::CreateFileStreamWriter(
224 const FileSystemURL& url,
226 FileSystemContext* context) const {
227 return scoped_ptr<fileapi::FileStreamWriter>(
228 new SandboxFileStreamWriter(context, url, offset,
229 *GetUpdateObservers(url.type())));
232 FileSystemQuotaUtil* TestFileSystemBackend::GetQuotaUtil() {
233 return quota_util_.get();
236 const UpdateObserverList* TestFileSystemBackend::GetUpdateObservers(
237 FileSystemType type) const {
238 return quota_util_->GetUpdateObservers(type);
241 void TestFileSystemBackend::AddFileChangeObserver(
242 FileChangeObserver* observer) {
243 quota_util_->AddFileChangeObserver(
244 kFileSystemTypeTest, observer, quota_util_->task_runner());
247 } // namespace fileapi