OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/file_util.h" | |
9 #include "base/logging.h" | |
10 #include "base/metrics/histogram.h" | |
11 #include "base/task_runner_util.h" | |
12 #include "url/gurl.h" | |
13 #include "webkit/browser/blob/file_stream_reader.h" | |
14 #include "webkit/browser/fileapi/async_file_util_adapter.h" | |
15 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" | |
16 #include "webkit/browser/fileapi/file_stream_writer.h" | |
17 #include "webkit/browser/fileapi/file_system_context.h" | |
18 #include "webkit/browser/fileapi/file_system_operation.h" | |
19 #include "webkit/browser/fileapi/file_system_operation_context.h" | |
20 #include "webkit/browser/fileapi/file_system_options.h" | |
21 #include "webkit/browser/fileapi/file_system_usage_cache.h" | |
22 #include "webkit/browser/fileapi/obfuscated_file_util.h" | |
23 #include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h" | |
24 #include "webkit/browser/fileapi/sandbox_quota_observer.h" | |
25 #include "webkit/browser/quota/quota_manager.h" | |
26 #include "webkit/common/fileapi/file_system_types.h" | |
27 #include "webkit/common/fileapi/file_system_util.h" | |
28 | |
29 using quota::QuotaManagerProxy; | |
30 using quota::SpecialStoragePolicy; | |
31 | |
32 namespace fileapi { | |
33 | |
34 SandboxFileSystemBackend::SandboxFileSystemBackend( | |
35 SandboxFileSystemBackendDelegate* delegate) | |
36 : delegate_(delegate), | |
37 enable_temporary_file_system_in_incognito_(false) { | |
38 } | |
39 | |
40 SandboxFileSystemBackend::~SandboxFileSystemBackend() { | |
41 } | |
42 | |
43 bool SandboxFileSystemBackend::CanHandleType(FileSystemType type) const { | |
44 return type == kFileSystemTypeTemporary || | |
45 type == kFileSystemTypePersistent; | |
46 } | |
47 | |
48 void SandboxFileSystemBackend::Initialize(FileSystemContext* context) { | |
49 DCHECK(delegate_); | |
50 | |
51 // Set quota observers. | |
52 delegate_->RegisterQuotaUpdateObserver(fileapi::kFileSystemTypeTemporary); | |
53 delegate_->AddFileAccessObserver( | |
54 fileapi::kFileSystemTypeTemporary, | |
55 delegate_->quota_observer(), NULL); | |
56 | |
57 delegate_->RegisterQuotaUpdateObserver(fileapi::kFileSystemTypePersistent); | |
58 delegate_->AddFileAccessObserver( | |
59 fileapi::kFileSystemTypePersistent, | |
60 delegate_->quota_observer(), NULL); | |
61 } | |
62 | |
63 void SandboxFileSystemBackend::ResolveURL( | |
64 const FileSystemURL& url, | |
65 OpenFileSystemMode mode, | |
66 const OpenFileSystemCallback& callback) { | |
67 DCHECK(CanHandleType(url.type())); | |
68 DCHECK(delegate_); | |
69 if (delegate_->file_system_options().is_incognito() && | |
70 !(url.type() == kFileSystemTypeTemporary && | |
71 enable_temporary_file_system_in_incognito_)) { | |
72 // TODO(kinuko): return an isolated temporary directory. | |
73 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); | |
74 return; | |
75 } | |
76 | |
77 delegate_->OpenFileSystem(url.origin(), | |
78 url.type(), | |
79 mode, | |
80 callback, | |
81 GetFileSystemRootURI(url.origin(), url.type())); | |
82 } | |
83 | |
84 AsyncFileUtil* SandboxFileSystemBackend::GetAsyncFileUtil( | |
85 FileSystemType type) { | |
86 DCHECK(delegate_); | |
87 return delegate_->file_util(); | |
88 } | |
89 | |
90 CopyOrMoveFileValidatorFactory* | |
91 SandboxFileSystemBackend::GetCopyOrMoveFileValidatorFactory( | |
92 FileSystemType type, | |
93 base::File::Error* error_code) { | |
94 DCHECK(error_code); | |
95 *error_code = base::File::FILE_OK; | |
96 return NULL; | |
97 } | |
98 | |
99 FileSystemOperation* SandboxFileSystemBackend::CreateFileSystemOperation( | |
100 const FileSystemURL& url, | |
101 FileSystemContext* context, | |
102 base::File::Error* error_code) const { | |
103 DCHECK(CanHandleType(url.type())); | |
104 DCHECK(error_code); | |
105 | |
106 DCHECK(delegate_); | |
107 scoped_ptr<FileSystemOperationContext> operation_context = | |
108 delegate_->CreateFileSystemOperationContext(url, context, error_code); | |
109 if (!operation_context) | |
110 return NULL; | |
111 | |
112 SpecialStoragePolicy* policy = delegate_->special_storage_policy(); | |
113 if (policy && policy->IsStorageUnlimited(url.origin())) | |
114 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited); | |
115 else | |
116 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeLimited); | |
117 | |
118 return FileSystemOperation::Create(url, context, operation_context.Pass()); | |
119 } | |
120 | |
121 bool SandboxFileSystemBackend::SupportsStreaming( | |
122 const fileapi::FileSystemURL& url) const { | |
123 return false; | |
124 } | |
125 | |
126 scoped_ptr<webkit_blob::FileStreamReader> | |
127 SandboxFileSystemBackend::CreateFileStreamReader( | |
128 const FileSystemURL& url, | |
129 int64 offset, | |
130 const base::Time& expected_modification_time, | |
131 FileSystemContext* context) const { | |
132 DCHECK(CanHandleType(url.type())); | |
133 DCHECK(delegate_); | |
134 return delegate_->CreateFileStreamReader( | |
135 url, offset, expected_modification_time, context); | |
136 } | |
137 | |
138 scoped_ptr<fileapi::FileStreamWriter> | |
139 SandboxFileSystemBackend::CreateFileStreamWriter( | |
140 const FileSystemURL& url, | |
141 int64 offset, | |
142 FileSystemContext* context) const { | |
143 DCHECK(CanHandleType(url.type())); | |
144 DCHECK(delegate_); | |
145 return delegate_->CreateFileStreamWriter(url, offset, context, url.type()); | |
146 } | |
147 | |
148 FileSystemQuotaUtil* SandboxFileSystemBackend::GetQuotaUtil() { | |
149 return delegate_; | |
150 } | |
151 | |
152 SandboxFileSystemBackendDelegate::OriginEnumerator* | |
153 SandboxFileSystemBackend::CreateOriginEnumerator() { | |
154 DCHECK(delegate_); | |
155 return delegate_->CreateOriginEnumerator(); | |
156 } | |
157 | |
158 } // namespace fileapi | |
OLD | NEW |