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 3 // found in the LICENSE file. 4 5 #include "storage/browser/fileapi/sandbox_file_system_backend.h" 6 7 #include "base/bind.h" 8 #include "base/files/file_util.h" 9 #include "base/logging.h" 10 #include "base/metrics/histogram.h" 11 #include "base/task_runner_util.h" 12 #include "storage/browser/blob/file_stream_reader.h" 13 #include "storage/browser/fileapi/async_file_util_adapter.h" 14 #include "storage/browser/fileapi/copy_or_move_file_validator.h" 15 #include "storage/browser/fileapi/file_stream_writer.h" 16 #include "storage/browser/fileapi/file_system_context.h" 17 #include "storage/browser/fileapi/file_system_operation.h" 18 #include "storage/browser/fileapi/file_system_operation_context.h" 19 #include "storage/browser/fileapi/file_system_options.h" 20 #include "storage/browser/fileapi/file_system_usage_cache.h" 21 #include "storage/browser/fileapi/obfuscated_file_util.h" 22 #include "storage/browser/fileapi/sandbox_file_system_backend_delegate.h" 23 #include "storage/browser/fileapi/sandbox_quota_observer.h" 24 #include "storage/browser/quota/quota_manager.h" 25 #include "storage/common/fileapi/file_system_types.h" 26 #include "storage/common/fileapi/file_system_util.h" 27 #include "url/gurl.h" 28 29 using storage::QuotaManagerProxy; 30 using storage::SpecialStoragePolicy; 31 32 namespace storage { 33 34 SandboxFileSystemBackend::SandboxFileSystemBackend( 35 SandboxFileSystemBackendDelegate* delegate) 36 : delegate_(delegate), 37 enable_temporary_file_system_in_incognito_(false) { 38 } 39 40 SandboxFileSystemBackend::~SandboxFileSystemBackend() { 41 } 42 43 bool SandboxFileSystemBackend::CanHandleType(FileSystemType type) const { 44 return type == kFileSystemTypeTemporary || 45 type == kFileSystemTypePersistent; 46 } 47 48 void SandboxFileSystemBackend::Initialize(FileSystemContext* context) { 49 DCHECK(delegate_); 50 51 // Set quota observers. 52 delegate_->RegisterQuotaUpdateObserver(storage::kFileSystemTypeTemporary); 53 delegate_->AddFileAccessObserver( 54 storage::kFileSystemTypeTemporary, delegate_->quota_observer(), NULL); 55 56 delegate_->RegisterQuotaUpdateObserver(storage::kFileSystemTypePersistent); 57 delegate_->AddFileAccessObserver( 58 storage::kFileSystemTypePersistent, delegate_->quota_observer(), NULL); 59 } 60 61 void SandboxFileSystemBackend::ResolveURL( 62 const FileSystemURL& url, 63 OpenFileSystemMode mode, 64 const OpenFileSystemCallback& callback) { 65 DCHECK(CanHandleType(url.type())); 66 DCHECK(delegate_); 67 if (delegate_->file_system_options().is_incognito() && 68 !(url.type() == kFileSystemTypeTemporary && 69 enable_temporary_file_system_in_incognito_)) { 70 // TODO(kinuko): return an isolated temporary directory. 71 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); 72 return; 73 } 74 75 delegate_->OpenFileSystem(url.origin(), 76 url.type(), 77 mode, 78 callback, 79 GetFileSystemRootURI(url.origin(), url.type())); 80 } 81 82 AsyncFileUtil* SandboxFileSystemBackend::GetAsyncFileUtil( 83 FileSystemType type) { 84 DCHECK(delegate_); 85 return delegate_->file_util(); 86 } 87 88 WatcherManager* SandboxFileSystemBackend::GetWatcherManager( 89 FileSystemType type) { 90 return NULL; 91 } 92 93 CopyOrMoveFileValidatorFactory* 94 SandboxFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 95 FileSystemType type, 96 base::File::Error* error_code) { 97 DCHECK(error_code); 98 *error_code = base::File::FILE_OK; 99 return NULL; 100 } 101 102 FileSystemOperation* SandboxFileSystemBackend::CreateFileSystemOperation( 103 const FileSystemURL& url, 104 FileSystemContext* context, 105 base::File::Error* error_code) const { 106 DCHECK(CanHandleType(url.type())); 107 DCHECK(error_code); 108 109 DCHECK(delegate_); 110 scoped_ptr<FileSystemOperationContext> operation_context = 111 delegate_->CreateFileSystemOperationContext(url, context, error_code); 112 if (!operation_context) 113 return NULL; 114 115 SpecialStoragePolicy* policy = delegate_->special_storage_policy(); 116 if (policy && policy->IsStorageUnlimited(url.origin())) 117 operation_context->set_quota_limit_type(storage::kQuotaLimitTypeUnlimited); 118 else 119 operation_context->set_quota_limit_type(storage::kQuotaLimitTypeLimited); 120 121 return FileSystemOperation::Create(url, context, operation_context.Pass()); 122 } 123 124 bool SandboxFileSystemBackend::SupportsStreaming( 125 const storage::FileSystemURL& url) const { 126 return false; 127 } 128 129 bool SandboxFileSystemBackend::HasInplaceCopyImplementation( 130 storage::FileSystemType type) const { 131 return false; 132 } 133 134 scoped_ptr<storage::FileStreamReader> 135 SandboxFileSystemBackend::CreateFileStreamReader( 136 const FileSystemURL& url, 137 int64 offset, 138 int64 max_bytes_to_read, 139 const base::Time& expected_modification_time, 140 FileSystemContext* context) const { 141 DCHECK(CanHandleType(url.type())); 142 DCHECK(delegate_); 143 return delegate_->CreateFileStreamReader( 144 url, offset, expected_modification_time, context); 145 } 146 147 scoped_ptr<storage::FileStreamWriter> 148 SandboxFileSystemBackend::CreateFileStreamWriter( 149 const FileSystemURL& url, 150 int64 offset, 151 FileSystemContext* context) const { 152 DCHECK(CanHandleType(url.type())); 153 DCHECK(delegate_); 154 return delegate_->CreateFileStreamWriter(url, offset, context, url.type()); 155 } 156 157 FileSystemQuotaUtil* SandboxFileSystemBackend::GetQuotaUtil() { 158 return delegate_; 159 } 160 161 const UpdateObserverList* SandboxFileSystemBackend::GetUpdateObservers( 162 FileSystemType type) const { 163 return delegate_->GetUpdateObservers(type); 164 } 165 166 const ChangeObserverList* SandboxFileSystemBackend::GetChangeObservers( 167 FileSystemType type) const { 168 return delegate_->GetChangeObservers(type); 169 } 170 171 const AccessObserverList* SandboxFileSystemBackend::GetAccessObservers( 172 FileSystemType type) const { 173 return delegate_->GetAccessObservers(type); 174 } 175 176 SandboxFileSystemBackendDelegate::OriginEnumerator* 177 SandboxFileSystemBackend::CreateOriginEnumerator() { 178 DCHECK(delegate_); 179 return delegate_->CreateOriginEnumerator(); 180 } 181 182 } // namespace storage 183