Index: webkit/browser/fileapi/file_system_context.cc |
diff --git a/webkit/browser/fileapi/file_system_context.cc b/webkit/browser/fileapi/file_system_context.cc |
deleted file mode 100644 |
index cb62556fefe3cb855c4367b8f0147b1079b1085e..0000000000000000000000000000000000000000 |
--- a/webkit/browser/fileapi/file_system_context.cc |
+++ /dev/null |
@@ -1,636 +0,0 @@ |
-// 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. |
- |
-#include "webkit/browser/fileapi/file_system_context.h" |
- |
-#include "base/bind.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/stl_util.h" |
-#include "base/task_runner_util.h" |
-#include "net/url_request/url_request.h" |
-#include "url/gurl.h" |
-#include "webkit/browser/blob/file_stream_reader.h" |
-#include "webkit/browser/fileapi/copy_or_move_file_validator.h" |
-#include "webkit/browser/fileapi/external_mount_points.h" |
-#include "webkit/browser/fileapi/file_permission_policy.h" |
-#include "webkit/browser/fileapi/file_stream_writer.h" |
-#include "webkit/browser/fileapi/file_system_file_util.h" |
-#include "webkit/browser/fileapi/file_system_operation.h" |
-#include "webkit/browser/fileapi/file_system_operation_runner.h" |
-#include "webkit/browser/fileapi/file_system_options.h" |
-#include "webkit/browser/fileapi/file_system_quota_client.h" |
-#include "webkit/browser/fileapi/file_system_url.h" |
-#include "webkit/browser/fileapi/isolated_context.h" |
-#include "webkit/browser/fileapi/isolated_file_system_backend.h" |
-#include "webkit/browser/fileapi/mount_points.h" |
-#include "webkit/browser/fileapi/quota/quota_reservation.h" |
-#include "webkit/browser/fileapi/sandbox_file_system_backend.h" |
-#include "webkit/browser/quota/quota_manager_proxy.h" |
-#include "webkit/browser/quota/special_storage_policy.h" |
-#include "webkit/common/fileapi/file_system_info.h" |
-#include "webkit/common/fileapi/file_system_util.h" |
- |
-using storage::QuotaClient; |
- |
-namespace storage { |
- |
-namespace { |
- |
-QuotaClient* CreateQuotaClient( |
- FileSystemContext* context, |
- bool is_incognito) { |
- return new FileSystemQuotaClient(context, is_incognito); |
-} |
- |
- |
-void DidGetMetadataForResolveURL( |
- const base::FilePath& path, |
- const FileSystemContext::ResolveURLCallback& callback, |
- const FileSystemInfo& info, |
- base::File::Error error, |
- const base::File::Info& file_info) { |
- if (error != base::File::FILE_OK) { |
- if (error == base::File::FILE_ERROR_NOT_FOUND) { |
- callback.Run(base::File::FILE_OK, info, path, |
- FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
- } else { |
- callback.Run(error, FileSystemInfo(), base::FilePath(), |
- FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
- } |
- return; |
- } |
- callback.Run(error, info, path, file_info.is_directory ? |
- FileSystemContext::RESOLVED_ENTRY_DIRECTORY : |
- FileSystemContext::RESOLVED_ENTRY_FILE); |
-} |
- |
-void RelayResolveURLCallback( |
- scoped_refptr<base::MessageLoopProxy> message_loop, |
- const FileSystemContext::ResolveURLCallback& callback, |
- base::File::Error result, |
- const FileSystemInfo& info, |
- const base::FilePath& file_path, |
- FileSystemContext::ResolvedEntryType type) { |
- message_loop->PostTask( |
- FROM_HERE, base::Bind(callback, result, info, file_path, type)); |
-} |
- |
-} // namespace |
- |
-// static |
-int FileSystemContext::GetPermissionPolicy(FileSystemType type) { |
- switch (type) { |
- case kFileSystemTypeTemporary: |
- case kFileSystemTypePersistent: |
- case kFileSystemTypeSyncable: |
- return FILE_PERMISSION_SANDBOX; |
- |
- case kFileSystemTypeDrive: |
- case kFileSystemTypeNativeForPlatformApp: |
- case kFileSystemTypeNativeLocal: |
- case kFileSystemTypeCloudDevice: |
- case kFileSystemTypeProvided: |
- case kFileSystemTypeDeviceMediaAsFileStorage: |
- return FILE_PERMISSION_USE_FILE_PERMISSION; |
- |
- case kFileSystemTypeRestrictedNativeLocal: |
- return FILE_PERMISSION_READ_ONLY | |
- FILE_PERMISSION_USE_FILE_PERMISSION; |
- |
- case kFileSystemTypeDeviceMedia: |
- case kFileSystemTypeIphoto: |
- case kFileSystemTypeItunes: |
- case kFileSystemTypeNativeMedia: |
- case kFileSystemTypePicasa: |
- return FILE_PERMISSION_USE_FILE_PERMISSION; |
- |
- // Following types are only accessed via IsolatedFileSystem, and |
- // don't have their own permission policies. |
- case kFileSystemTypeDragged: |
- case kFileSystemTypeForTransientFile: |
- case kFileSystemTypePluginPrivate: |
- return FILE_PERMISSION_ALWAYS_DENY; |
- |
- // Following types only appear as mount_type, and will not be |
- // queried for their permission policies. |
- case kFileSystemTypeIsolated: |
- case kFileSystemTypeExternal: |
- return FILE_PERMISSION_ALWAYS_DENY; |
- |
- // Following types should not be used to access files by FileAPI clients. |
- case kFileSystemTypeTest: |
- case kFileSystemTypeSyncableForInternalSync: |
- case kFileSystemInternalTypeEnumEnd: |
- case kFileSystemInternalTypeEnumStart: |
- case kFileSystemTypeUnknown: |
- return FILE_PERMISSION_ALWAYS_DENY; |
- } |
- NOTREACHED(); |
- return FILE_PERMISSION_ALWAYS_DENY; |
-} |
- |
-FileSystemContext::FileSystemContext( |
- base::SingleThreadTaskRunner* io_task_runner, |
- base::SequencedTaskRunner* file_task_runner, |
- ExternalMountPoints* external_mount_points, |
- storage::SpecialStoragePolicy* special_storage_policy, |
- storage::QuotaManagerProxy* quota_manager_proxy, |
- ScopedVector<FileSystemBackend> additional_backends, |
- const std::vector<URLRequestAutoMountHandler>& auto_mount_handlers, |
- const base::FilePath& partition_path, |
- const FileSystemOptions& options) |
- : io_task_runner_(io_task_runner), |
- default_file_task_runner_(file_task_runner), |
- quota_manager_proxy_(quota_manager_proxy), |
- sandbox_delegate_( |
- new SandboxFileSystemBackendDelegate(quota_manager_proxy, |
- file_task_runner, |
- partition_path, |
- special_storage_policy, |
- options)), |
- sandbox_backend_(new SandboxFileSystemBackend(sandbox_delegate_.get())), |
- isolated_backend_(new IsolatedFileSystemBackend()), |
- plugin_private_backend_( |
- new PluginPrivateFileSystemBackend(file_task_runner, |
- partition_path, |
- special_storage_policy, |
- options)), |
- additional_backends_(additional_backends.Pass()), |
- auto_mount_handlers_(auto_mount_handlers), |
- external_mount_points_(external_mount_points), |
- partition_path_(partition_path), |
- is_incognito_(options.is_incognito()), |
- operation_runner_(new FileSystemOperationRunner(this)) { |
- RegisterBackend(sandbox_backend_.get()); |
- RegisterBackend(isolated_backend_.get()); |
- RegisterBackend(plugin_private_backend_.get()); |
- |
- for (ScopedVector<FileSystemBackend>::const_iterator iter = |
- additional_backends_.begin(); |
- iter != additional_backends_.end(); ++iter) { |
- RegisterBackend(*iter); |
- } |
- |
- if (quota_manager_proxy) { |
- // Quota client assumes all backends have registered. |
- quota_manager_proxy->RegisterClient(CreateQuotaClient( |
- this, options.is_incognito())); |
- } |
- |
- sandbox_backend_->Initialize(this); |
- isolated_backend_->Initialize(this); |
- plugin_private_backend_->Initialize(this); |
- for (ScopedVector<FileSystemBackend>::const_iterator iter = |
- additional_backends_.begin(); |
- iter != additional_backends_.end(); ++iter) { |
- (*iter)->Initialize(this); |
- } |
- |
- // Additional mount points must be added before regular system-wide |
- // mount points. |
- if (external_mount_points) |
- url_crackers_.push_back(external_mount_points); |
- url_crackers_.push_back(ExternalMountPoints::GetSystemInstance()); |
- url_crackers_.push_back(IsolatedContext::GetInstance()); |
-} |
- |
-bool FileSystemContext::DeleteDataForOriginOnFileTaskRunner( |
- const GURL& origin_url) { |
- DCHECK(default_file_task_runner()->RunsTasksOnCurrentThread()); |
- DCHECK(origin_url == origin_url.GetOrigin()); |
- |
- bool success = true; |
- for (FileSystemBackendMap::iterator iter = backend_map_.begin(); |
- iter != backend_map_.end(); |
- ++iter) { |
- FileSystemBackend* backend = iter->second; |
- if (!backend->GetQuotaUtil()) |
- continue; |
- if (backend->GetQuotaUtil()->DeleteOriginDataOnFileTaskRunner( |
- this, quota_manager_proxy(), origin_url, iter->first) |
- != base::File::FILE_OK) { |
- // Continue the loop, but record the failure. |
- success = false; |
- } |
- } |
- |
- return success; |
-} |
- |
-scoped_refptr<QuotaReservation> |
-FileSystemContext::CreateQuotaReservationOnFileTaskRunner( |
- const GURL& origin_url, |
- FileSystemType type) { |
- DCHECK(default_file_task_runner()->RunsTasksOnCurrentThread()); |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend || !backend->GetQuotaUtil()) |
- return scoped_refptr<QuotaReservation>(); |
- return backend->GetQuotaUtil()->CreateQuotaReservationOnFileTaskRunner( |
- origin_url, type); |
-} |
- |
-void FileSystemContext::Shutdown() { |
- if (!io_task_runner_->RunsTasksOnCurrentThread()) { |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&FileSystemContext::Shutdown, |
- make_scoped_refptr(this))); |
- return; |
- } |
- operation_runner_->Shutdown(); |
-} |
- |
-FileSystemQuotaUtil* |
-FileSystemContext::GetQuotaUtil(FileSystemType type) const { |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend) |
- return NULL; |
- return backend->GetQuotaUtil(); |
-} |
- |
-AsyncFileUtil* FileSystemContext::GetAsyncFileUtil( |
- FileSystemType type) const { |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend) |
- return NULL; |
- return backend->GetAsyncFileUtil(type); |
-} |
- |
-CopyOrMoveFileValidatorFactory* |
-FileSystemContext::GetCopyOrMoveFileValidatorFactory( |
- FileSystemType type, base::File::Error* error_code) const { |
- DCHECK(error_code); |
- *error_code = base::File::FILE_OK; |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend) |
- return NULL; |
- return backend->GetCopyOrMoveFileValidatorFactory( |
- type, error_code); |
-} |
- |
-FileSystemBackend* FileSystemContext::GetFileSystemBackend( |
- FileSystemType type) const { |
- FileSystemBackendMap::const_iterator found = backend_map_.find(type); |
- if (found != backend_map_.end()) |
- return found->second; |
- NOTREACHED() << "Unknown filesystem type: " << type; |
- return NULL; |
-} |
- |
-WatcherManager* FileSystemContext::GetWatcherManager( |
- FileSystemType type) const { |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend) |
- return NULL; |
- return backend->GetWatcherManager(type); |
-} |
- |
-bool FileSystemContext::IsSandboxFileSystem(FileSystemType type) const { |
- FileSystemBackendMap::const_iterator found = backend_map_.find(type); |
- return found != backend_map_.end() && found->second->GetQuotaUtil(); |
-} |
- |
-const UpdateObserverList* FileSystemContext::GetUpdateObservers( |
- FileSystemType type) const { |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (backend->GetQuotaUtil()) |
- return backend->GetQuotaUtil()->GetUpdateObservers(type); |
- return NULL; |
-} |
- |
-const AccessObserverList* FileSystemContext::GetAccessObservers( |
- FileSystemType type) const { |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (backend->GetQuotaUtil()) |
- return backend->GetQuotaUtil()->GetAccessObservers(type); |
- return NULL; |
-} |
- |
-void FileSystemContext::GetFileSystemTypes( |
- std::vector<FileSystemType>* types) const { |
- types->clear(); |
- for (FileSystemBackendMap::const_iterator iter = backend_map_.begin(); |
- iter != backend_map_.end(); ++iter) |
- types->push_back(iter->first); |
-} |
- |
-ExternalFileSystemBackend* |
-FileSystemContext::external_backend() const { |
- return static_cast<ExternalFileSystemBackend*>( |
- GetFileSystemBackend(kFileSystemTypeExternal)); |
-} |
- |
-void FileSystemContext::OpenFileSystem( |
- const GURL& origin_url, |
- FileSystemType type, |
- OpenFileSystemMode mode, |
- const OpenFileSystemCallback& callback) { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- DCHECK(!callback.is_null()); |
- |
- if (!FileSystemContext::IsSandboxFileSystem(type)) { |
- // Disallow opening a non-sandboxed filesystem. |
- callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); |
- return; |
- } |
- |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend) { |
- callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); |
- return; |
- } |
- |
- backend->ResolveURL( |
- CreateCrackedFileSystemURL(origin_url, type, base::FilePath()), |
- mode, |
- callback); |
-} |
- |
-void FileSystemContext::ResolveURL( |
- const FileSystemURL& url, |
- const ResolveURLCallback& callback) { |
- DCHECK(!callback.is_null()); |
- |
- // If not on IO thread, forward before passing the task to the backend. |
- if (!io_task_runner_->RunsTasksOnCurrentThread()) { |
- ResolveURLCallback relay_callback = |
- base::Bind(&RelayResolveURLCallback, |
- base::MessageLoopProxy::current(), callback); |
- io_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&FileSystemContext::ResolveURL, this, url, relay_callback)); |
- return; |
- } |
- |
- FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
- if (!backend) { |
- callback.Run(base::File::FILE_ERROR_SECURITY, |
- FileSystemInfo(), base::FilePath(), |
- FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
- return; |
- } |
- |
- backend->ResolveURL( |
- url, |
- OPEN_FILE_SYSTEM_FAIL_IF_NONEXISTENT, |
- base::Bind(&FileSystemContext::DidOpenFileSystemForResolveURL, |
- this, |
- url, |
- callback)); |
-} |
- |
-void FileSystemContext::AttemptAutoMountForURLRequest( |
- const net::URLRequest* url_request, |
- const std::string& storage_domain, |
- const StatusCallback& callback) { |
- FileSystemURL filesystem_url(url_request->url()); |
- if (filesystem_url.type() == kFileSystemTypeExternal) { |
- for (size_t i = 0; i < auto_mount_handlers_.size(); i++) { |
- if (auto_mount_handlers_[i].Run(url_request, filesystem_url, |
- storage_domain, callback)) { |
- return; |
- } |
- } |
- } |
- callback.Run(base::File::FILE_ERROR_NOT_FOUND); |
-} |
- |
-void FileSystemContext::DeleteFileSystem( |
- const GURL& origin_url, |
- FileSystemType type, |
- const StatusCallback& callback) { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- DCHECK(origin_url == origin_url.GetOrigin()); |
- DCHECK(!callback.is_null()); |
- |
- FileSystemBackend* backend = GetFileSystemBackend(type); |
- if (!backend) { |
- callback.Run(base::File::FILE_ERROR_SECURITY); |
- return; |
- } |
- if (!backend->GetQuotaUtil()) { |
- callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); |
- return; |
- } |
- |
- base::PostTaskAndReplyWithResult( |
- default_file_task_runner(), |
- FROM_HERE, |
- // It is safe to pass Unretained(quota_util) since context owns it. |
- base::Bind(&FileSystemQuotaUtil::DeleteOriginDataOnFileTaskRunner, |
- base::Unretained(backend->GetQuotaUtil()), |
- make_scoped_refptr(this), |
- base::Unretained(quota_manager_proxy()), |
- origin_url, |
- type), |
- callback); |
-} |
- |
-scoped_ptr<storage::FileStreamReader> FileSystemContext::CreateFileStreamReader( |
- const FileSystemURL& url, |
- int64 offset, |
- const base::Time& expected_modification_time) { |
- if (!url.is_valid()) |
- return scoped_ptr<storage::FileStreamReader>(); |
- FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
- if (!backend) |
- return scoped_ptr<storage::FileStreamReader>(); |
- return backend->CreateFileStreamReader( |
- url, offset, expected_modification_time, this); |
-} |
- |
-scoped_ptr<FileStreamWriter> FileSystemContext::CreateFileStreamWriter( |
- const FileSystemURL& url, |
- int64 offset) { |
- if (!url.is_valid()) |
- return scoped_ptr<FileStreamWriter>(); |
- FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
- if (!backend) |
- return scoped_ptr<FileStreamWriter>(); |
- return backend->CreateFileStreamWriter(url, offset, this); |
-} |
- |
-scoped_ptr<FileSystemOperationRunner> |
-FileSystemContext::CreateFileSystemOperationRunner() { |
- return make_scoped_ptr(new FileSystemOperationRunner(this)); |
-} |
- |
-FileSystemURL FileSystemContext::CrackURL(const GURL& url) const { |
- return CrackFileSystemURL(FileSystemURL(url)); |
-} |
- |
-FileSystemURL FileSystemContext::CreateCrackedFileSystemURL( |
- const GURL& origin, |
- FileSystemType type, |
- const base::FilePath& path) const { |
- return CrackFileSystemURL(FileSystemURL(origin, type, path)); |
-} |
- |
-#if defined(OS_CHROMEOS) |
-void FileSystemContext::EnableTemporaryFileSystemInIncognito() { |
- sandbox_backend_->set_enable_temporary_file_system_in_incognito(true); |
-} |
-#endif |
- |
-bool FileSystemContext::CanServeURLRequest(const FileSystemURL& url) const { |
- // We never support accessing files in isolated filesystems via an URL. |
- if (url.mount_type() == kFileSystemTypeIsolated) |
- return false; |
-#if defined(OS_CHROMEOS) |
- if (url.type() == kFileSystemTypeTemporary && |
- sandbox_backend_->enable_temporary_file_system_in_incognito()) { |
- return true; |
- } |
-#endif |
- return !is_incognito_ || !FileSystemContext::IsSandboxFileSystem(url.type()); |
-} |
- |
-bool FileSystemContext::ShouldFlushOnWriteCompletion( |
- FileSystemType type) const { |
- if (IsSandboxFileSystem(type)) { |
- // Disable Flush() for each write operation on SandboxFileSystems since it |
- // hurts the performance, assuming the FileSystems are stored in a local |
- // disk, we don't need to keep calling fsync() for it. |
- // On the other hand, other FileSystems that may stored on a removable media |
- // should be Flush()ed as soon as a write operation is completed, so that |
- // written data is saved over sudden media removal. |
- return false; |
- } |
- return true; |
-} |
- |
-void FileSystemContext::OpenPluginPrivateFileSystem( |
- const GURL& origin_url, |
- FileSystemType type, |
- const std::string& filesystem_id, |
- const std::string& plugin_id, |
- OpenFileSystemMode mode, |
- const StatusCallback& callback) { |
- DCHECK(plugin_private_backend_); |
- plugin_private_backend_->OpenPrivateFileSystem( |
- origin_url, type, filesystem_id, plugin_id, mode, callback); |
-} |
- |
-FileSystemContext::~FileSystemContext() { |
-} |
- |
-void FileSystemContext::DeleteOnCorrectThread() const { |
- if (!io_task_runner_->RunsTasksOnCurrentThread() && |
- io_task_runner_->DeleteSoon(FROM_HERE, this)) { |
- return; |
- } |
- delete this; |
-} |
- |
-FileSystemOperation* FileSystemContext::CreateFileSystemOperation( |
- const FileSystemURL& url, base::File::Error* error_code) { |
- if (!url.is_valid()) { |
- if (error_code) |
- *error_code = base::File::FILE_ERROR_INVALID_URL; |
- return NULL; |
- } |
- |
- FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
- if (!backend) { |
- if (error_code) |
- *error_code = base::File::FILE_ERROR_FAILED; |
- return NULL; |
- } |
- |
- base::File::Error fs_error = base::File::FILE_OK; |
- FileSystemOperation* operation = |
- backend->CreateFileSystemOperation(url, this, &fs_error); |
- |
- if (error_code) |
- *error_code = fs_error; |
- return operation; |
-} |
- |
-FileSystemURL FileSystemContext::CrackFileSystemURL( |
- const FileSystemURL& url) const { |
- if (!url.is_valid()) |
- return FileSystemURL(); |
- |
- // The returned value in case there is no crackers which can crack the url. |
- // This is valid situation for non isolated/external file systems. |
- FileSystemURL current = url; |
- |
- // File system may be mounted multiple times (e.g., an isolated filesystem on |
- // top of an external filesystem). Hence cracking needs to be iterated. |
- for (;;) { |
- FileSystemURL cracked = current; |
- for (size_t i = 0; i < url_crackers_.size(); ++i) { |
- if (!url_crackers_[i]->HandlesFileSystemMountType(current.type())) |
- continue; |
- cracked = url_crackers_[i]->CrackFileSystemURL(current); |
- if (cracked.is_valid()) |
- break; |
- } |
- if (cracked == current) |
- break; |
- current = cracked; |
- } |
- return current; |
-} |
- |
-void FileSystemContext::RegisterBackend(FileSystemBackend* backend) { |
- const FileSystemType mount_types[] = { |
- kFileSystemTypeTemporary, |
- kFileSystemTypePersistent, |
- kFileSystemTypeIsolated, |
- kFileSystemTypeExternal, |
- }; |
- // Register file system backends for public mount types. |
- for (size_t j = 0; j < ARRAYSIZE_UNSAFE(mount_types); ++j) { |
- if (backend->CanHandleType(mount_types[j])) { |
- const bool inserted = backend_map_.insert( |
- std::make_pair(mount_types[j], backend)).second; |
- DCHECK(inserted); |
- } |
- } |
- // Register file system backends for internal types. |
- for (int t = kFileSystemInternalTypeEnumStart + 1; |
- t < kFileSystemInternalTypeEnumEnd; ++t) { |
- FileSystemType type = static_cast<FileSystemType>(t); |
- if (backend->CanHandleType(type)) { |
- const bool inserted = backend_map_.insert( |
- std::make_pair(type, backend)).second; |
- DCHECK(inserted); |
- } |
- } |
-} |
- |
-void FileSystemContext::DidOpenFileSystemForResolveURL( |
- const FileSystemURL& url, |
- const FileSystemContext::ResolveURLCallback& callback, |
- const GURL& filesystem_root, |
- const std::string& filesystem_name, |
- base::File::Error error) { |
- DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- |
- if (error != base::File::FILE_OK) { |
- callback.Run(error, FileSystemInfo(), base::FilePath(), |
- FileSystemContext::RESOLVED_ENTRY_NOT_FOUND); |
- return; |
- } |
- |
- storage::FileSystemInfo info( |
- filesystem_name, filesystem_root, url.mount_type()); |
- |
- // Extract the virtual path not containing a filesystem type part from |url|. |
- base::FilePath parent = CrackURL(filesystem_root).virtual_path(); |
- base::FilePath child = url.virtual_path(); |
- base::FilePath path; |
- |
- if (parent.empty()) { |
- path = child; |
- } else if (parent != child) { |
- bool result = parent.AppendRelativePath(child, &path); |
- DCHECK(result); |
- } |
- |
- operation_runner()->GetMetadata( |
- url, base::Bind(&DidGetMetadataForResolveURL, path, callback, info)); |
-} |
- |
-} // namespace storage |