Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: webkit/fileapi/isolated_file_util.cc

Issue 10810053: Enables internal filesystem types via Isolated filesystems (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: layout test crash fix Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/fileapi/isolated_file_util.h ('k') | webkit/fileapi/isolated_file_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/fileapi/isolated_file_util.h" 5 #include "webkit/fileapi/isolated_file_util.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 10 matching lines...) Expand all
21 namespace fileapi { 21 namespace fileapi {
22 22
23 typedef IsolatedContext::FileInfo FileInfo; 23 typedef IsolatedContext::FileInfo FileInfo;
24 24
25 namespace { 25 namespace {
26 26
27 // Simply enumerate each path from a given fileinfo set. 27 // Simply enumerate each path from a given fileinfo set.
28 // Used to enumerate top-level paths of an isolated filesystem. 28 // Used to enumerate top-level paths of an isolated filesystem.
29 class SetFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator { 29 class SetFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator {
30 public: 30 public:
31 SetFileEnumerator(const std::vector<FileInfo>& files, 31 explicit SetFileEnumerator(const std::vector<FileInfo>& files)
32 const FilePath& root) 32 : files_(files) {
33 : files_(files),
34 root_(root) {
35 file_iter_ = files_.begin(); 33 file_iter_ = files_.begin();
36 } 34 }
37 virtual ~SetFileEnumerator() {} 35 virtual ~SetFileEnumerator() {}
38 36
39 // AbstractFileEnumerator overrides. 37 // AbstractFileEnumerator overrides.
40 virtual FilePath Next() OVERRIDE { 38 virtual FilePath Next() OVERRIDE {
41 if (file_iter_ == files_.end()) 39 if (file_iter_ == files_.end())
42 return FilePath(); 40 return FilePath();
43 FilePath platform_file = (file_iter_++)->path; 41 FilePath platform_file = (file_iter_++)->path;
44 NativeFileUtil::GetFileInfo(platform_file, &file_info_); 42 NativeFileUtil::GetFileInfo(platform_file, &file_info_);
45 return root_.Append(platform_file.BaseName()); 43 return platform_file;
46 } 44 }
47 virtual int64 Size() OVERRIDE { return file_info_.size; } 45 virtual int64 Size() OVERRIDE { return file_info_.size; }
48 virtual bool IsDirectory() OVERRIDE { return file_info_.is_directory; } 46 virtual bool IsDirectory() OVERRIDE { return file_info_.is_directory; }
49 virtual base::Time LastModifiedTime() OVERRIDE { 47 virtual base::Time LastModifiedTime() OVERRIDE {
50 return file_info_.last_modified; 48 return file_info_.last_modified;
51 } 49 }
52 50
53 private: 51 private:
54 std::vector<FileInfo> files_; 52 std::vector<FileInfo> files_;
55 std::vector<FileInfo>::const_iterator file_iter_; 53 std::vector<FileInfo>::const_iterator file_iter_;
56 FilePath root_;
57 base::PlatformFileInfo file_info_; 54 base::PlatformFileInfo file_info_;
58 }; 55 };
59 56
60 // A wrapper file enumerator which returns a virtual path of the path returned
61 // by the wrapped enumerator.
62 //
63 // A virtual path is constructed as following:
64 // virtual_path = |virtual_base_path| + relative-path-to-|platform_base_path|
65 //
66 // Where |virtual_base_path| is in our case the virtual top-level directory
67 // that looks like: '/<filesystem_id>'.
68 //
69 // Example:
70 // Suppose virtual_base_path is: '/CAFEBABE/dir',
71 // platform_base_path is: '/full/path/to/example/dir', and
72 // a path returned by wrapped_ is: '/full/path/to/example/dir/a/b/c',
73 // Next() would return: '/CAFEBABE/dir/a/b/c'.
74 //
75 class PathConverterEnumerator
76 : public FileSystemFileUtil::AbstractFileEnumerator {
77 public:
78 PathConverterEnumerator(
79 FileSystemFileUtil::AbstractFileEnumerator* wrapped,
80 const FilePath& virtual_base_path,
81 const FilePath& platform_base_path)
82 : wrapped_(wrapped),
83 virtual_base_path_(virtual_base_path),
84 platform_base_path_(platform_base_path) {}
85 virtual ~PathConverterEnumerator() {}
86
87 // AbstractFileEnumerator overrides.
88 virtual FilePath Next() OVERRIDE {
89 DCHECK(wrapped_.get());
90 FilePath path = wrapped_->Next();
91 // Don't return symlinks in subdirectories.
92 while (!path.empty() && file_util::IsLink(path))
93 path = wrapped_->Next();
94 if (path.empty())
95 return path;
96 FilePath virtual_path = virtual_base_path_;
97 platform_base_path_.AppendRelativePath(path, &virtual_path);
98 return virtual_path;
99 }
100 virtual int64 Size() OVERRIDE { return wrapped_->Size(); }
101 virtual bool IsDirectory() OVERRIDE { return wrapped_->IsDirectory(); }
102 virtual base::Time LastModifiedTime() OVERRIDE {
103 return wrapped_->LastModifiedTime();
104 }
105
106 private:
107 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> wrapped_;
108 FilePath virtual_base_path_;
109 FilePath platform_base_path_;
110 };
111
112 // Recursively enumerate each path from a given paths set. 57 // Recursively enumerate each path from a given paths set.
113 class RecursiveSetFileEnumerator 58 class RecursiveSetFileEnumerator
114 : public FileSystemFileUtil::AbstractFileEnumerator { 59 : public FileSystemFileUtil::AbstractFileEnumerator {
115 public: 60 public:
116 RecursiveSetFileEnumerator(const FilePath& virtual_base_path, 61 RecursiveSetFileEnumerator(const std::vector<FileInfo>& files)
117 const std::vector<FileInfo>& files, 62 : files_(files) {
118 const FilePath& root)
119 : virtual_base_path_(virtual_base_path),
120 files_(files),
121 root_(root) {
122 file_iter_ = files_.begin(); 63 file_iter_ = files_.begin();
123 current_enumerator_.reset(new SetFileEnumerator(files, root)); 64 current_enumerator_.reset(new SetFileEnumerator(files));
124 } 65 }
125 virtual ~RecursiveSetFileEnumerator() {} 66 virtual ~RecursiveSetFileEnumerator() {}
126 67
127 // AbstractFileEnumerator overrides. 68 // AbstractFileEnumerator overrides.
128 virtual FilePath Next() OVERRIDE; 69 virtual FilePath Next() OVERRIDE;
129 virtual int64 Size() OVERRIDE { 70 virtual int64 Size() OVERRIDE {
130 DCHECK(current_enumerator_.get()); 71 DCHECK(current_enumerator_.get());
131 return current_enumerator_->Size(); 72 return current_enumerator_->Size();
132 } 73 }
133 virtual bool IsDirectory() OVERRIDE { 74 virtual bool IsDirectory() OVERRIDE {
134 DCHECK(current_enumerator_.get()); 75 DCHECK(current_enumerator_.get());
135 return current_enumerator_->IsDirectory(); 76 return current_enumerator_->IsDirectory();
136 } 77 }
137 virtual base::Time LastModifiedTime() OVERRIDE { 78 virtual base::Time LastModifiedTime() OVERRIDE {
138 DCHECK(current_enumerator_.get()); 79 DCHECK(current_enumerator_.get());
139 return current_enumerator_->LastModifiedTime(); 80 return current_enumerator_->LastModifiedTime();
140 } 81 }
141 82
142 private: 83 private:
143 FilePath virtual_base_path_;
144 std::vector<FileInfo> files_; 84 std::vector<FileInfo> files_;
145 std::vector<FileInfo>::iterator file_iter_; 85 std::vector<FileInfo>::iterator file_iter_;
146 base::PlatformFileInfo file_info_; 86 base::PlatformFileInfo file_info_;
147 FilePath root_;
148 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> current_enumerator_; 87 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> current_enumerator_;
149 }; 88 };
150 89
151 FilePath RecursiveSetFileEnumerator::Next() { 90 FilePath RecursiveSetFileEnumerator::Next() {
152 if (current_enumerator_.get()) { 91 if (current_enumerator_.get()) {
153 FilePath path = current_enumerator_->Next(); 92 FilePath path = current_enumerator_->Next();
154 if (!path.empty()) 93 if (!path.empty())
155 return path; 94 return path;
156 } 95 }
157 96
158 // We reached the end. 97 // We reached the end.
159 if (file_iter_ == files_.end()) 98 if (file_iter_ == files_.end())
160 return FilePath(); 99 return FilePath();
161 100
162 // Enumerates subdirectories of the next path. 101 // Enumerates subdirectories of the next path.
163 FileInfo& next_file = *file_iter_++; 102 FileInfo& next_file = *file_iter_++;
164 current_enumerator_.reset( 103 current_enumerator_.reset(
165 new PathConverterEnumerator( 104 NativeFileUtil::CreateFileEnumerator(
166 NativeFileUtil::CreateFileEnumerator( 105 next_file.path, true /* recursive */));
167 next_file.path, true /* recursive */),
168 virtual_base_path_.AppendASCII(next_file.name), next_file.path));
169 DCHECK(current_enumerator_.get()); 106 DCHECK(current_enumerator_.get());
170 return current_enumerator_->Next(); 107 return current_enumerator_->Next();
171 } 108 }
172 109
173 } // namespace 110 } // namespace
174 111
175 IsolatedFileUtil::IsolatedFileUtil() { 112 //-------------------------------------------------------------------------
113
114 IsolatedFileUtil::IsolatedFileUtil() {}
115
116 PlatformFileError IsolatedFileUtil::GetLocalFilePath(
117 FileSystemOperationContext* context,
118 const FileSystemURL& url,
119 FilePath* local_file_path) {
120 DCHECK(local_file_path);
121 if (url.path().empty()) {
122 // Root direcory case, which should not be accessed.
123 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED;
124 }
125 *local_file_path = url.path();
126 return base::PLATFORM_FILE_OK;
176 } 127 }
177 128
178 PlatformFileError IsolatedFileUtil::CreateOrOpen( 129 //-------------------------------------------------------------------------
179 FileSystemOperationContext* context,
180 const FileSystemURL& url, int file_flags,
181 PlatformFile* file_handle, bool* created) {
182 return base::PLATFORM_FILE_ERROR_SECURITY;
183 }
184 130
185 PlatformFileError IsolatedFileUtil::Close( 131 DraggedFileUtil::DraggedFileUtil() {}
186 FileSystemOperationContext* context,
187 PlatformFile file_handle) {
188 // We don't allow open thus Close won't be called.
189 return base::PLATFORM_FILE_ERROR_SECURITY;
190 }
191 132
192 PlatformFileError IsolatedFileUtil::EnsureFileExists( 133 PlatformFileError DraggedFileUtil::GetFileInfo(
193 FileSystemOperationContext* context,
194 const FileSystemURL& url,
195 bool* created) {
196 return base::PLATFORM_FILE_ERROR_SECURITY;
197 }
198
199 PlatformFileError IsolatedFileUtil::CreateDirectory(
200 FileSystemOperationContext* context,
201 const FileSystemURL& url,
202 bool exclusive,
203 bool recursive) {
204 return base::PLATFORM_FILE_ERROR_SECURITY;
205 }
206
207 PlatformFileError IsolatedFileUtil::GetFileInfo(
208 FileSystemOperationContext* context, 134 FileSystemOperationContext* context,
209 const FileSystemURL& url, 135 const FileSystemURL& url,
210 PlatformFileInfo* file_info, 136 PlatformFileInfo* file_info,
211 FilePath* platform_path) { 137 FilePath* platform_path) {
212 DCHECK(file_info); 138 DCHECK(file_info);
213 std::string filesystem_id; 139 std::string filesystem_id;
214 FilePath cracked_path; 140 if (url.path().empty()) {
215 if (!IsolatedContext::GetInstance()->CrackIsolatedPath(
216 url.path(), &filesystem_id, NULL, &cracked_path))
217 return base::PLATFORM_FILE_ERROR_SECURITY;
218 if (cracked_path.empty()) {
219 // The root directory case. 141 // The root directory case.
220 // For now we leave three time fields (modified/accessed/creation time) 142 // For now we leave three time fields (modified/accessed/creation time)
221 // NULL as it is not really clear what to be set for this virtual directory. 143 // NULL as it is not really clear what to be set for this virtual directory.
222 // TODO(kinuko): Maybe we want to set the time when this filesystem is 144 // TODO(kinuko): Maybe we want to set the time when this filesystem is
223 // created (i.e. when the files/directories are dropped). 145 // created (i.e. when the files/directories are dropped).
224 file_info->is_directory = true; 146 file_info->is_directory = true;
225 file_info->is_symbolic_link = false; 147 file_info->is_symbolic_link = false;
226 file_info->size = 0; 148 file_info->size = 0;
227 return base::PLATFORM_FILE_OK; 149 return base::PLATFORM_FILE_OK;
228 } 150 }
229 base::PlatformFileError error = 151 base::PlatformFileError error =
230 NativeFileUtil::GetFileInfo(cracked_path, file_info); 152 NativeFileUtil::GetFileInfo(url.path(), file_info);
231 if (file_util::IsLink(cracked_path) && !FilePath().IsParent(cracked_path)) { 153 if (file_util::IsLink(url.path()) && !FilePath().IsParent(url.path())) {
232 // Don't follow symlinks unless it's the one that are selected by the user. 154 // Don't follow symlinks unless it's the one that are selected by the user.
233 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 155 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
234 } 156 }
235 if (error == base::PLATFORM_FILE_OK) 157 if (error == base::PLATFORM_FILE_OK)
236 *platform_path = cracked_path; 158 *platform_path = url.path();
237 return error; 159 return error;
238 } 160 }
239 161
240 FileSystemFileUtil::AbstractFileEnumerator* 162 FileSystemFileUtil::AbstractFileEnumerator*
241 IsolatedFileUtil::CreateFileEnumerator( 163 DraggedFileUtil::CreateFileEnumerator(
242 FileSystemOperationContext* context, 164 FileSystemOperationContext* context,
243 const FileSystemURL& root, 165 const FileSystemURL& root,
244 bool recursive) { 166 bool recursive) {
245 std::string filesystem_id; 167 if (!root.path().empty())
246 FileInfo root_info; 168 return NativeFileUtil::CreateFileEnumerator(root.path(), recursive);
247 FilePath cracked_path;
248 if (!IsolatedContext::GetInstance()->CrackIsolatedPath(
249 root.path(), &filesystem_id, &root_info, &cracked_path))
250 return NULL;
251
252 FilePath virtual_base_path =
253 IsolatedContext::GetInstance()->CreateVirtualRootPath(filesystem_id);
254
255 if (!cracked_path.empty()) {
256 return new PathConverterEnumerator(
257 NativeFileUtil::CreateFileEnumerator(cracked_path, recursive),
258 virtual_base_path.AppendASCII(root_info.name), root_info.path);
259 }
260 169
261 // Root path case. 170 // Root path case.
262 std::vector<FileInfo> toplevels; 171 std::vector<FileInfo> toplevels;
263 IsolatedContext::GetInstance()->GetDraggedFileInfo( 172 IsolatedContext::GetInstance()->GetDraggedFileInfo(
264 filesystem_id, &toplevels); 173 root.filesystem_id(), &toplevels);
265 if (!recursive) 174 if (!recursive)
266 return new SetFileEnumerator(toplevels, root.path()); 175 return new SetFileEnumerator(toplevels);
267 return new RecursiveSetFileEnumerator( 176 return new RecursiveSetFileEnumerator(toplevels);
268 virtual_base_path, toplevels, root.path());
269 } 177 }
270 178
271 PlatformFileError IsolatedFileUtil::GetLocalFilePath( 179 bool DraggedFileUtil::PathExists(
272 FileSystemOperationContext* context,
273 const FileSystemURL& file_system_url,
274 FilePath* local_file_path) {
275 if (GetPlatformPath(file_system_url, local_file_path))
276 return base::PLATFORM_FILE_OK;
277 return base::PLATFORM_FILE_ERROR_SECURITY;
278 }
279
280 PlatformFileError IsolatedFileUtil::Touch(
281 FileSystemOperationContext* context,
282 const FileSystemURL& url,
283 const base::Time& last_access_time,
284 const base::Time& last_modified_time) {
285 FilePath platform_path;
286 if (!GetPlatformPath(url, &platform_path) || platform_path.empty())
287 return base::PLATFORM_FILE_ERROR_SECURITY;
288 return NativeFileUtil::Touch(
289 platform_path, last_access_time, last_modified_time);
290 }
291
292 PlatformFileError IsolatedFileUtil::Truncate(
293 FileSystemOperationContext* context,
294 const FileSystemURL& url,
295 int64 length) {
296 FilePath platform_path;
297 if (!GetPlatformPath(url, &platform_path) || platform_path.empty())
298 return base::PLATFORM_FILE_ERROR_SECURITY;
299 return NativeFileUtil::Truncate(platform_path, length);
300 }
301
302 bool IsolatedFileUtil::PathExists(
303 FileSystemOperationContext* context, 180 FileSystemOperationContext* context,
304 const FileSystemURL& url) { 181 const FileSystemURL& url) {
305 FilePath platform_path; 182 if (url.path().empty()) {
306 if (!GetPlatformPath(url, &platform_path))
307 return false;
308 if (platform_path.empty()) {
309 // The root directory case. 183 // The root directory case.
310 return true; 184 return true;
311 } 185 }
312 return NativeFileUtil::PathExists(platform_path); 186 return NativeFileUtil::PathExists(url.path());
313 } 187 }
314 188
315 bool IsolatedFileUtil::DirectoryExists( 189 bool DraggedFileUtil::DirectoryExists(
316 FileSystemOperationContext* context, 190 FileSystemOperationContext* context,
317 const FileSystemURL& url) { 191 const FileSystemURL& url) {
318 FilePath platform_path; 192 if (url.path().empty()) {
319 if (!GetPlatformPath(url, &platform_path))
320 return false;
321 if (platform_path.empty()) {
322 // The root directory case. 193 // The root directory case.
323 return true; 194 return true;
324 } 195 }
325 return NativeFileUtil::DirectoryExists(platform_path); 196 return NativeFileUtil::DirectoryExists(url.path());
326 } 197 }
327 198
328 bool IsolatedFileUtil::IsDirectoryEmpty( 199 bool DraggedFileUtil::IsDirectoryEmpty(
329 FileSystemOperationContext* context, 200 FileSystemOperationContext* context,
330 const FileSystemURL& url) { 201 const FileSystemURL& url) {
331 std::string filesystem_id; 202 if (url.path().empty()) {
332 FilePath platform_path;
333 if (!IsolatedContext::GetInstance()->CrackIsolatedPath(
334 url.path(), &filesystem_id,
335 NULL, &platform_path))
336 return false;
337 if (platform_path.empty()) {
338 // The root directory case. 203 // The root directory case.
339 std::vector<FileInfo> toplevels; 204 std::vector<FileInfo> toplevels;
340 bool success = IsolatedContext::GetInstance()->GetDraggedFileInfo( 205 bool success = IsolatedContext::GetInstance()->GetDraggedFileInfo(
341 filesystem_id, &toplevels); 206 url.filesystem_id(), &toplevels);
342 DCHECK(success); 207 DCHECK(success);
343 return toplevels.empty(); 208 return toplevels.empty();
344 } 209 }
345 return NativeFileUtil::IsDirectoryEmpty(platform_path); 210 return NativeFileUtil::IsDirectoryEmpty(url.path());
346 }
347
348 PlatformFileError IsolatedFileUtil::CopyOrMoveFile(
349 FileSystemOperationContext* context,
350 const FileSystemURL& src_url,
351 const FileSystemURL& dest_url,
352 bool copy) {
353 return base::PLATFORM_FILE_ERROR_SECURITY;
354 }
355
356 PlatformFileError IsolatedFileUtil::CopyInForeignFile(
357 FileSystemOperationContext* context,
358 const FilePath& src_file_path,
359 const FileSystemURL& dest_url) {
360 return base::PLATFORM_FILE_ERROR_SECURITY;
361 }
362
363 PlatformFileError IsolatedFileUtil::DeleteFile(
364 FileSystemOperationContext* context,
365 const FileSystemURL& url) {
366 return base::PLATFORM_FILE_ERROR_SECURITY;
367 }
368
369 PlatformFileError IsolatedFileUtil::DeleteSingleDirectory(
370 FileSystemOperationContext* context,
371 const FileSystemURL& url) {
372 return base::PLATFORM_FILE_ERROR_SECURITY;
373 }
374
375 scoped_refptr<webkit_blob::ShareableFileReference>
376 IsolatedFileUtil::CreateSnapshotFile(
377 FileSystemOperationContext* context,
378 const FileSystemURL& url,
379 base::PlatformFileError* result,
380 base::PlatformFileInfo* file_info,
381 FilePath* platform_path) {
382 DCHECK(result);
383 *result = GetFileInfo(context, url, file_info, platform_path);
384 return NULL;
385 }
386
387 bool IsolatedFileUtil::GetPlatformPath(const FileSystemURL& url,
388 FilePath* platform_path) const {
389 DCHECK(platform_path);
390 std::string filesystem_id;
391 if (!IsolatedContext::GetInstance()->CrackIsolatedPath(
392 url.path(), &filesystem_id, NULL, platform_path))
393 return false;
394 return true;
395 } 211 }
396 212
397 } // namespace 213 } // namespace
OLDNEW
« no previous file with comments | « webkit/fileapi/isolated_file_util.h ('k') | webkit/fileapi/isolated_file_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698