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

Unified Diff: webkit/browser/fileapi/file_system_context.cc

Issue 539143002: Migrate webkit/browser/ to storage/browser/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698