blob: 972120ab6fa28f90fff5e53e94c0d7faf92dbf63 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "storage/browser/file_system/sandbox_file_system_backend.h"
#include <stdint.h>
#include <memory>
#include <utility>
#include "base/check.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/metrics/histogram.h"
#include "components/file_access/scoped_file_access_delegate.h"
#include "storage/browser/file_system/async_file_util_adapter.h"
#include "storage/browser/file_system/copy_or_move_file_validator.h"
#include "storage/browser/file_system/file_stream_reader.h"
#include "storage/browser/file_system/file_stream_writer.h"
#include "storage/browser/file_system/file_system_context.h"
#include "storage/browser/file_system/file_system_features.h"
#include "storage/browser/file_system/file_system_operation.h"
#include "storage/browser/file_system/file_system_operation_context.h"
#include "storage/browser/file_system/file_system_options.h"
#include "storage/browser/file_system/file_system_usage_cache.h"
#include "storage/browser/file_system/obfuscated_file_util.h"
#include "storage/browser/file_system/quota/quota_limit_type.h"
#include "storage/browser/file_system/sandbox_quota_observer.h"
#include "storage/browser/quota/quota_manager.h"
#include "storage/common/file_system/file_system_types.h"
#include "storage/common/file_system/file_system_util.h"
#include "url/gurl.h"
namespace storage {
SandboxFileSystemBackend::SandboxFileSystemBackend(
SandboxFileSystemBackendDelegate* delegate)
: delegate_(delegate) {}
SandboxFileSystemBackend::~SandboxFileSystemBackend() = default;
bool SandboxFileSystemBackend::CanHandleType(FileSystemType type) const {
return type == kFileSystemTypeTemporary || type == kFileSystemTypePersistent;
}
void SandboxFileSystemBackend::Initialize(FileSystemContext* context) {
DCHECK(delegate_);
// Set quota observers.
delegate_->RegisterQuotaUpdateObserver(kFileSystemTypeTemporary);
delegate_->AddFileAccessObserver(kFileSystemTypeTemporary,
delegate_->quota_observer(), nullptr);
delegate_->RegisterQuotaUpdateObserver(kFileSystemTypePersistent);
delegate_->AddFileAccessObserver(kFileSystemTypePersistent,
delegate_->quota_observer(), nullptr);
}
void SandboxFileSystemBackend::ResolveURL(const FileSystemURL& url,
OpenFileSystemMode mode,
ResolveURLCallback callback) {
DCHECK(CanHandleType(url.type()));
DCHECK(delegate_);
delegate_->OpenFileSystem(
url.GetBucket(), url.type(), mode, std::move(callback),
GetFileSystemRootURI(url.origin().GetURL(), url.type()));
}
AsyncFileUtil* SandboxFileSystemBackend::GetAsyncFileUtil(FileSystemType type) {
DCHECK(delegate_);
return delegate_->file_util();
}
WatcherManager* SandboxFileSystemBackend::GetWatcherManager(
FileSystemType type) {
return nullptr;
}
CopyOrMoveFileValidatorFactory*
SandboxFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
FileSystemType type,
base::File::Error* error_code) {
DCHECK(error_code);
*error_code = base::File::FILE_OK;
return nullptr;
}
std::unique_ptr<FileSystemOperation>
SandboxFileSystemBackend::CreateFileSystemOperation(
OperationType type,
const FileSystemURL& url,
FileSystemContext* context,
base::File::Error* error_code) const {
DCHECK(CanHandleType(url.type()));
DCHECK(error_code);
DCHECK(delegate_);
std::unique_ptr<FileSystemOperationContext> operation_context =
delegate_->CreateFileSystemOperationContext(url, context, error_code);
if (!operation_context)
return nullptr;
SpecialStoragePolicy* policy = delegate_->special_storage_policy();
if (policy && policy->IsStorageUnlimited(url.origin().GetURL()))
operation_context->set_quota_limit_type(QuotaLimitType::kUnlimited);
else
operation_context->set_quota_limit_type(QuotaLimitType::kLimited);
return FileSystemOperation::Create(type, url, context,
std::move(operation_context));
}
bool SandboxFileSystemBackend::SupportsStreaming(
const FileSystemURL& url) const {
// Streaming is required for in-memory implementation to access memory-backed
// files.
return delegate_->file_system_options().is_incognito();
}
bool SandboxFileSystemBackend::HasInplaceCopyImplementation(
FileSystemType type) const {
return false;
}
std::unique_ptr<FileStreamReader>
SandboxFileSystemBackend::CreateFileStreamReader(
const FileSystemURL& url,
int64_t offset,
int64_t max_bytes_to_read,
const base::Time& expected_modification_time,
FileSystemContext* context,
file_access::ScopedFileAccessDelegate::
RequestFilesAccessIOCallback /*file_access*/) const {
DCHECK(CanHandleType(url.type()));
DCHECK(delegate_);
return delegate_->CreateFileStreamReader(url, offset,
expected_modification_time, context);
}
std::unique_ptr<FileStreamWriter>
SandboxFileSystemBackend::CreateFileStreamWriter(
const FileSystemURL& url,
int64_t offset,
FileSystemContext* context) const {
DCHECK(CanHandleType(url.type()));
DCHECK(delegate_);
return delegate_->CreateFileStreamWriter(url, offset, context, url.type());
}
FileSystemQuotaUtil* SandboxFileSystemBackend::GetQuotaUtil() {
return delegate_;
}
const UpdateObserverList* SandboxFileSystemBackend::GetUpdateObservers(
FileSystemType type) const {
return delegate_->GetUpdateObservers(type);
}
const ChangeObserverList* SandboxFileSystemBackend::GetChangeObservers(
FileSystemType type) const {
return delegate_->GetChangeObservers(type);
}
const AccessObserverList* SandboxFileSystemBackend::GetAccessObservers(
FileSystemType type) const {
return delegate_->GetAccessObservers(type);
}
SandboxFileSystemBackendDelegate::StorageKeyEnumerator*
SandboxFileSystemBackend::CreateStorageKeyEnumerator() {
DCHECK(delegate_);
return delegate_->CreateStorageKeyEnumerator();
}
} // namespace storage