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

Side by Side Diff: webkit/chromeos/fileapi/cros_mount_point_provider.cc

Issue 12258021: Fix filesystem API file_handlers to work for drive on ChromeOS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 10 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
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/chromeos/fileapi/cros_mount_point_provider.h" 5 #include "webkit/chromeos/fileapi/cros_mount_point_provider.h"
6 6
7 #include "base/chromeos/chromeos_version.h" 7 #include "base/chromeos/chromeos_version.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 12 matching lines...) Expand all
23 #include "webkit/fileapi/file_system_file_stream_reader.h" 23 #include "webkit/fileapi/file_system_file_stream_reader.h"
24 #include "webkit/fileapi/file_system_operation_context.h" 24 #include "webkit/fileapi/file_system_operation_context.h"
25 #include "webkit/fileapi/file_system_url.h" 25 #include "webkit/fileapi/file_system_url.h"
26 #include "webkit/fileapi/file_system_util.h" 26 #include "webkit/fileapi/file_system_util.h"
27 #include "webkit/fileapi/isolated_context.h" 27 #include "webkit/fileapi/isolated_context.h"
28 #include "webkit/fileapi/isolated_file_util.h" 28 #include "webkit/fileapi/isolated_file_util.h"
29 #include "webkit/fileapi/local_file_stream_writer.h" 29 #include "webkit/fileapi/local_file_stream_writer.h"
30 #include "webkit/fileapi/local_file_system_operation.h" 30 #include "webkit/fileapi/local_file_system_operation.h"
31 #include "webkit/glue/webkit_glue.h" 31 #include "webkit/glue/webkit_glue.h"
32 32
33 using fileapi::FileSystemURL;
34
33 namespace { 35 namespace {
34 36
35 const char kChromeUIScheme[] = "chrome"; 37 const char kChromeUIScheme[] = "chrome";
36 38
37 } // namespace 39 } // namespace
38 40
39 namespace chromeos { 41 namespace chromeos {
40 42
41 // static 43 // static
42 bool CrosMountPointProvider::CanHandleURL(const fileapi::FileSystemURL& url) { 44 bool CrosMountPointProvider::CanHandleURL(const FileSystemURL& url) {
43 if (!url.is_valid()) 45 if (!url.is_valid())
44 return false; 46 return false;
45 return url.type() == fileapi::kFileSystemTypeNativeLocal || 47 return url.type() == fileapi::kFileSystemTypeNativeLocal ||
46 url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal || 48 url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal ||
47 url.type() == fileapi::kFileSystemTypeDrive; 49 url.type() == fileapi::kFileSystemTypeDrive;
48 } 50 }
49 51
50 CrosMountPointProvider::CrosMountPointProvider( 52 CrosMountPointProvider::CrosMountPointProvider(
51 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy, 53 scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy,
52 scoped_refptr<fileapi::ExternalMountPoints> mount_points, 54 scoped_refptr<fileapi::ExternalMountPoints> mount_points,
(...skipping 13 matching lines...) Expand all
66 const GURL& origin_url, 68 const GURL& origin_url,
67 fileapi::FileSystemType type, 69 fileapi::FileSystemType type,
68 bool create, 70 bool create,
69 const ValidateFileSystemCallback& callback) { 71 const ValidateFileSystemCallback& callback) {
70 DCHECK(fileapi::IsolatedContext::IsIsolatedType(type)); 72 DCHECK(fileapi::IsolatedContext::IsIsolatedType(type));
71 // Nothing to validate for external filesystem. 73 // Nothing to validate for external filesystem.
72 callback.Run(base::PLATFORM_FILE_OK); 74 callback.Run(base::PLATFORM_FILE_OK);
73 } 75 }
74 76
75 base::FilePath CrosMountPointProvider::GetFileSystemRootPathOnFileThread( 77 base::FilePath CrosMountPointProvider::GetFileSystemRootPathOnFileThread(
76 const fileapi::FileSystemURL& url, 78 const FileSystemURL& url,
77 bool create) { 79 bool create) {
78 DCHECK(fileapi::IsolatedContext::IsIsolatedType(url.mount_type())); 80 DCHECK(fileapi::IsolatedContext::IsIsolatedType(url.mount_type()));
79 if (!url.is_valid()) 81 if (!url.is_valid())
80 return base::FilePath(); 82 return base::FilePath();
81 83
82 base::FilePath root_path; 84 base::FilePath root_path;
83 std::string mount_name = url.filesystem_id(); 85 std::string mount_name = url.filesystem_id();
84 if (!mount_points_->GetRegisteredPath(mount_name, &root_path) && 86 if (!mount_points_->GetRegisteredPath(mount_name, &root_path) &&
85 !system_mount_points_->GetRegisteredPath(mount_name, &root_path)) { 87 !system_mount_points_->GetRegisteredPath(mount_name, &root_path)) {
86 return base::FilePath(); 88 return base::FilePath();
87 } 89 }
88 90
89 return root_path.DirName(); 91 return root_path.DirName();
90 } 92 }
91 93
92 bool CrosMountPointProvider::IsAccessAllowed( 94 bool CrosMountPointProvider::IsAccessAllowed(const FileSystemURL& url) {
93 const fileapi::FileSystemURL& url) {
94 if (!url.is_valid()) 95 if (!url.is_valid())
95 return false; 96 return false;
96 97
97 // Permit access to mount points from internal WebUI. 98 // Permit access to mount points from internal WebUI.
98 const GURL& origin_url = url.origin(); 99 const GURL& origin_url = url.origin();
99 if (origin_url.SchemeIs(kChromeUIScheme)) 100 if (origin_url.SchemeIs(kChromeUIScheme))
100 return true; 101 return true;
101 102
102 // No extra check is needed for isolated file systems. 103 // No extra check is needed for isolated file systems.
103 if (url.mount_type() == fileapi::kFileSystemTypeIsolated) 104 if (url.mount_type() == fileapi::kFileSystemTypeIsolated)
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 } 201 }
201 202
202 fileapi::AsyncFileUtil* CrosMountPointProvider::GetAsyncFileUtil( 203 fileapi::AsyncFileUtil* CrosMountPointProvider::GetAsyncFileUtil(
203 fileapi::FileSystemType type) { 204 fileapi::FileSystemType type) {
204 DCHECK(type == fileapi::kFileSystemTypeNativeLocal || 205 DCHECK(type == fileapi::kFileSystemTypeNativeLocal ||
205 type == fileapi::kFileSystemTypeRestrictedNativeLocal); 206 type == fileapi::kFileSystemTypeRestrictedNativeLocal);
206 return local_file_util_.get(); 207 return local_file_util_.get();
207 } 208 }
208 209
209 fileapi::FilePermissionPolicy CrosMountPointProvider::GetPermissionPolicy( 210 fileapi::FilePermissionPolicy CrosMountPointProvider::GetPermissionPolicy(
210 const fileapi::FileSystemURL& url, int permissions) const { 211 const FileSystemURL& url, int permissions) const {
211 if (url.mount_type() == fileapi::kFileSystemTypeIsolated) { 212 if (url.mount_type() == fileapi::kFileSystemTypeIsolated) {
212 // Permissions in isolated filesystems should be examined with 213 // Permissions in isolated filesystems should be examined with
213 // FileSystem permission. 214 // FileSystem permission.
214 return fileapi::FILE_PERMISSION_USE_FILESYSTEM_PERMISSION; 215 return fileapi::FILE_PERMISSION_USE_FILESYSTEM_PERMISSION;
215 } 216 }
216 return fileapi::FILE_PERMISSION_USE_FILE_PERMISSION; 217 return fileapi::FILE_PERMISSION_USE_FILE_PERMISSION;
217 } 218 }
218 219
219 fileapi::FileSystemOperation* CrosMountPointProvider::CreateFileSystemOperation( 220 fileapi::FileSystemOperation* CrosMountPointProvider::CreateFileSystemOperation(
220 const fileapi::FileSystemURL& url, 221 const FileSystemURL& url,
221 fileapi::FileSystemContext* context, 222 fileapi::FileSystemContext* context,
222 base::PlatformFileError* error_code) const { 223 base::PlatformFileError* error_code) const {
223 DCHECK(url.is_valid()); 224 DCHECK(url.is_valid());
224 225
225 if (url.type() == fileapi::kFileSystemTypeDrive) { 226 if (url.type() == fileapi::kFileSystemTypeDrive) {
227 FileSystemURL external_url = GetAsExternalFileSystemURL(url);
226 fileapi::RemoteFileSystemProxyInterface* remote_proxy = 228 fileapi::RemoteFileSystemProxyInterface* remote_proxy =
227 GetRemoteProxy(url.filesystem_id()); 229 GetRemoteProxy(external_url);
228 if (!remote_proxy) { 230 if (!remote_proxy) {
229 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND; 231 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND;
230 return NULL; 232 return NULL;
231 } 233 }
232 return new chromeos::RemoteFileSystemOperation(remote_proxy); 234 return new chromeos::RemoteFileSystemOperation(remote_proxy);
233 } 235 }
234 236
235 DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal || 237 DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal ||
236 url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal); 238 url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal);
237 scoped_ptr<fileapi::FileSystemOperationContext> operation_context( 239 scoped_ptr<fileapi::FileSystemOperationContext> operation_context(
238 new fileapi::FileSystemOperationContext(context)); 240 new fileapi::FileSystemOperationContext(context));
239 return new fileapi::LocalFileSystemOperation(context, 241 return new fileapi::LocalFileSystemOperation(context,
240 operation_context.Pass()); 242 operation_context.Pass());
241 } 243 }
242 244
243 webkit_blob::FileStreamReader* CrosMountPointProvider::CreateFileStreamReader( 245 webkit_blob::FileStreamReader* CrosMountPointProvider::CreateFileStreamReader(
244 const fileapi::FileSystemURL& url, 246 const FileSystemURL& url,
245 int64 offset, 247 int64 offset,
246 const base::Time& expected_modification_time, 248 const base::Time& expected_modification_time,
247 fileapi::FileSystemContext* context) const { 249 fileapi::FileSystemContext* context) const {
248 // For now we return a generic Reader implementation which utilizes 250 // For now we return a generic Reader implementation which utilizes
249 // CreateSnapshotFile internally (i.e. will download everything first). 251 // CreateSnapshotFile internally (i.e. will download everything first).
250 // TODO(satorux,zel): implement more efficient reader for remote cases. 252 // TODO(satorux,zel): implement more efficient reader for remote cases.
251 return new fileapi::FileSystemFileStreamReader( 253 return new fileapi::FileSystemFileStreamReader(
252 context, url, offset, expected_modification_time); 254 context, url, offset, expected_modification_time);
253 } 255 }
254 256
255 fileapi::FileStreamWriter* CrosMountPointProvider::CreateFileStreamWriter( 257 fileapi::FileStreamWriter* CrosMountPointProvider::CreateFileStreamWriter(
256 const fileapi::FileSystemURL& url, 258 const FileSystemURL& url,
257 int64 offset, 259 int64 offset,
258 fileapi::FileSystemContext* context) const { 260 fileapi::FileSystemContext* context) const {
259 DCHECK(url.is_valid()); 261 DCHECK(url.is_valid());
260 262
261 if (url.type() == fileapi::kFileSystemTypeDrive) { 263 if (url.type() == fileapi::kFileSystemTypeDrive) {
264 FileSystemURL external_url = GetAsExternalFileSystemURL(url);
262 fileapi::RemoteFileSystemProxyInterface* remote_proxy = 265 fileapi::RemoteFileSystemProxyInterface* remote_proxy =
263 GetRemoteProxy(url.filesystem_id()); 266 GetRemoteProxy(external_url);
264 if (!remote_proxy) 267 if (!remote_proxy)
265 return NULL; 268 return NULL;
266 return new fileapi::RemoteFileStreamWriter(remote_proxy, url, offset); 269 return new fileapi::RemoteFileStreamWriter(remote_proxy, url, offset);
267 } 270 }
268 271
269 if (url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal) 272 if (url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal)
270 return NULL; 273 return NULL;
271 274
272 DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal); 275 DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal);
273 return new fileapi::LocalFileStreamWriter(url.path(), offset); 276 return new fileapi::LocalFileStreamWriter(url.path(), offset);
274 } 277 }
275 278
276 bool CrosMountPointProvider::GetVirtualPath(const base::FilePath& filesystem_pat h, 279 bool CrosMountPointProvider::GetVirtualPath(
277 base::FilePath* virtual_path) { 280 const base::FilePath& filesystem_path,
281 base::FilePath* virtual_path) const {
278 return mount_points_->GetVirtualPath(filesystem_path, virtual_path) || 282 return mount_points_->GetVirtualPath(filesystem_path, virtual_path) ||
279 system_mount_points_->GetVirtualPath(filesystem_path, virtual_path); 283 system_mount_points_->GetVirtualPath(filesystem_path, virtual_path);
280 } 284 }
281 285
286 fileapi::FileSystemURL CrosMountPointProvider::GetAsExternalFileSystemURL(
287 const fileapi::FileSystemURL& original) const {
kinuko 2013/02/14 17:09:48 Do we need to specifically crack the isolated URL
tbarzic 2013/02/14 20:22:32 this could be problematic because we use different
288 if (original.mount_type() == fileapi::kFileSystemTypeExternal)
289 return original;
290
291 if (original.mount_type() == fileapi::kFileSystemTypeIsolated) {
292 base::FilePath external_path;
293 if (!GetVirtualPath(original.path(), &external_path))
294 return fileapi::FileSystemURL();
295
296 fileapi::FileSystemURL external = mount_points_->CreateCrackedFileSystemURL(
297 original.origin(), fileapi::kFileSystemTypeExternal, external_path);
298 if (external.is_valid() && external.type() == original.type())
299 return external;
300
301 external = system_mount_points_->CreateCrackedFileSystemURL(
302 original.origin(), fileapi::kFileSystemTypeExternal, external_path);
303 if (external.is_valid() && external.type() == original.type())
304 return external;
305 }
306
307 return fileapi::FileSystemURL();
308 }
309
282 fileapi::RemoteFileSystemProxyInterface* CrosMountPointProvider::GetRemoteProxy( 310 fileapi::RemoteFileSystemProxyInterface* CrosMountPointProvider::GetRemoteProxy(
283 const std::string& mount_name) const { 311 const FileSystemURL& url) const {
312 if (!url.is_valid())
313 return NULL;
284 fileapi::RemoteFileSystemProxyInterface* proxy = 314 fileapi::RemoteFileSystemProxyInterface* proxy =
285 mount_points_->GetRemoteFileSystemProxy(mount_name); 315 mount_points_->GetRemoteFileSystemProxy(url.filesystem_id());
286 if (proxy) 316 if (proxy)
287 return proxy; 317 return proxy;
288 return system_mount_points_->GetRemoteFileSystemProxy(mount_name); 318 return system_mount_points_->GetRemoteFileSystemProxy(url.filesystem_id());
289 } 319 }
290 320
291 } // namespace chromeos 321 } // namespace chromeos
OLDNEW
« no previous file with comments | « webkit/chromeos/fileapi/cros_mount_point_provider.h ('k') | webkit/fileapi/file_system_mount_point_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698