| OLD | NEW |
| 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/browser/fileapi/file_system_context.h" | 5 #include "webkit/browser/fileapi/file_system_context.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
| 11 #include "url/gurl.h" | 11 #include "url/gurl.h" |
| 12 #include "webkit/browser/blob/file_stream_reader.h" | 12 #include "webkit/browser/blob/file_stream_reader.h" |
| 13 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" | 13 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" |
| 14 #include "webkit/browser/fileapi/external_mount_points.h" | 14 #include "webkit/browser/fileapi/external_mount_points.h" |
| 15 #include "webkit/browser/fileapi/file_permission_policy.h" | 15 #include "webkit/browser/fileapi/file_permission_policy.h" |
| 16 #include "webkit/browser/fileapi/file_stream_writer.h" | 16 #include "webkit/browser/fileapi/file_stream_writer.h" |
| 17 #include "webkit/browser/fileapi/file_system_file_util.h" | 17 #include "webkit/browser/fileapi/file_system_file_util.h" |
| 18 #include "webkit/browser/fileapi/file_system_operation.h" | 18 #include "webkit/browser/fileapi/file_system_operation.h" |
| 19 #include "webkit/browser/fileapi/file_system_operation_runner.h" | 19 #include "webkit/browser/fileapi/file_system_operation_runner.h" |
| 20 #include "webkit/browser/fileapi/file_system_options.h" | 20 #include "webkit/browser/fileapi/file_system_options.h" |
| 21 #include "webkit/browser/fileapi/file_system_quota_client.h" | 21 #include "webkit/browser/fileapi/file_system_quota_client.h" |
| 22 #include "webkit/browser/fileapi/file_system_task_runners.h" | 22 #include "webkit/browser/fileapi/file_system_task_runners.h" |
| 23 #include "webkit/browser/fileapi/file_system_url.h" | 23 #include "webkit/browser/fileapi/file_system_url.h" |
| 24 #include "webkit/browser/fileapi/isolated_context.h" | 24 #include "webkit/browser/fileapi/isolated_context.h" |
| 25 #include "webkit/browser/fileapi/isolated_file_system_backend.h" | 25 #include "webkit/browser/fileapi/isolated_file_system_backend.h" |
| 26 #include "webkit/browser/fileapi/mount_points.h" | 26 #include "webkit/browser/fileapi/mount_points.h" |
| 27 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" | 27 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" |
| 28 #include "webkit/browser/fileapi/syncable/local_file_change_tracker.h" | |
| 29 #include "webkit/browser/fileapi/syncable/local_file_sync_context.h" | |
| 30 #include "webkit/browser/fileapi/test_file_system_backend.h" | 28 #include "webkit/browser/fileapi/test_file_system_backend.h" |
| 31 #include "webkit/browser/quota/quota_manager.h" | 29 #include "webkit/browser/quota/quota_manager.h" |
| 32 #include "webkit/browser/quota/special_storage_policy.h" | 30 #include "webkit/browser/quota/special_storage_policy.h" |
| 33 #include "webkit/common/fileapi/file_system_util.h" | 31 #include "webkit/common/fileapi/file_system_util.h" |
| 34 | 32 |
| 35 using quota::QuotaClient; | 33 using quota::QuotaClient; |
| 36 | 34 |
| 37 namespace fileapi { | 35 namespace fileapi { |
| 38 | 36 |
| 39 namespace { | 37 namespace { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 const FileSystemOptions& options) | 107 const FileSystemOptions& options) |
| 110 : task_runners_(task_runners.Pass()), | 108 : task_runners_(task_runners.Pass()), |
| 111 quota_manager_proxy_(quota_manager_proxy), | 109 quota_manager_proxy_(quota_manager_proxy), |
| 112 sandbox_context_(new SandboxContext( | 110 sandbox_context_(new SandboxContext( |
| 113 quota_manager_proxy, | 111 quota_manager_proxy, |
| 114 task_runners_->file_task_runner(), | 112 task_runners_->file_task_runner(), |
| 115 partition_path, | 113 partition_path, |
| 116 special_storage_policy)), | 114 special_storage_policy)), |
| 117 sandbox_backend_(new SandboxFileSystemBackend( | 115 sandbox_backend_(new SandboxFileSystemBackend( |
| 118 sandbox_context_.get(), | 116 sandbox_context_.get(), |
| 117 task_runners_->file_task_runner(), |
| 119 options)), | 118 options)), |
| 120 isolated_backend_(new IsolatedFileSystemBackend()), | 119 isolated_backend_(new IsolatedFileSystemBackend()), |
| 121 additional_backends_(additional_backends.Pass()), | 120 additional_backends_(additional_backends.Pass()), |
| 122 external_mount_points_(external_mount_points), | 121 external_mount_points_(external_mount_points), |
| 123 partition_path_(partition_path), | 122 partition_path_(partition_path), |
| 124 operation_runner_(new FileSystemOperationRunner(this)) { | 123 operation_runner_(new FileSystemOperationRunner(this)) { |
| 125 DCHECK(task_runners_.get()); | 124 DCHECK(task_runners_.get()); |
| 126 | 125 |
| 127 if (quota_manager_proxy) { | 126 if (quota_manager_proxy) { |
| 128 quota_manager_proxy->RegisterClient(CreateQuotaClient( | 127 quota_manager_proxy->RegisterClient(CreateQuotaClient( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 if (!backend) | 174 if (!backend) |
| 176 return NULL; | 175 return NULL; |
| 177 return backend->GetQuotaUtil(); | 176 return backend->GetQuotaUtil(); |
| 178 } | 177 } |
| 179 | 178 |
| 180 AsyncFileUtil* FileSystemContext::GetAsyncFileUtil( | 179 AsyncFileUtil* FileSystemContext::GetAsyncFileUtil( |
| 181 FileSystemType type) const { | 180 FileSystemType type) const { |
| 182 FileSystemBackend* backend = GetFileSystemBackend(type); | 181 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 183 if (!backend) | 182 if (!backend) |
| 184 return NULL; | 183 return NULL; |
| 185 return backend->GetAsyncFileUtil(type); | 184 return backend->GetAsyncFileUtil(type, this); |
| 186 } | 185 } |
| 187 | 186 |
| 188 FileSystemFileUtil* FileSystemContext::GetFileUtil( | 187 FileSystemFileUtil* FileSystemContext::GetFileUtil( |
| 189 FileSystemType type) const { | 188 FileSystemType type) const { |
| 190 FileSystemBackend* backend = GetFileSystemBackend(type); | 189 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 191 if (!backend) | 190 if (!backend) |
| 192 return NULL; | 191 return NULL; |
| 193 return backend->GetFileUtil(type); | 192 return backend->GetFileUtil(type, this); |
| 194 } | 193 } |
| 195 | 194 |
| 196 CopyOrMoveFileValidatorFactory* | 195 CopyOrMoveFileValidatorFactory* |
| 197 FileSystemContext::GetCopyOrMoveFileValidatorFactory( | 196 FileSystemContext::GetCopyOrMoveFileValidatorFactory( |
| 198 FileSystemType type, base::PlatformFileError* error_code) const { | 197 FileSystemType type, base::PlatformFileError* error_code) const { |
| 199 DCHECK(error_code); | 198 DCHECK(error_code); |
| 200 *error_code = base::PLATFORM_FILE_OK; | 199 *error_code = base::PLATFORM_FILE_OK; |
| 201 FileSystemBackend* backend = GetFileSystemBackend(type); | 200 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 202 if (!backend) | 201 if (!backend) |
| 203 return NULL; | 202 return NULL; |
| 204 return backend->GetCopyOrMoveFileValidatorFactory( | 203 return backend->GetCopyOrMoveFileValidatorFactory( |
| 205 type, error_code); | 204 type, error_code); |
| 206 } | 205 } |
| 207 | 206 |
| 208 FileSystemBackend* FileSystemContext::GetFileSystemBackend( | 207 FileSystemBackend* FileSystemContext::GetFileSystemBackend( |
| 209 FileSystemType type) const { | 208 FileSystemType type) const { |
| 210 FileSystemBackendMap::const_iterator found = backend_map_.find(type); | 209 FileSystemBackendMap::const_iterator found = backend_map_.find(type); |
| 211 if (found != backend_map_.end()) | 210 if (found != backend_map_.end()) |
| 212 return found->second; | 211 return found->second; |
| 213 NOTREACHED() << "Unknown filesystem type: " << type; | 212 NOTREACHED() << "Unknown filesystem type: " << type; |
| 214 return NULL; | 213 return NULL; |
| 215 } | 214 } |
| 216 | 215 |
| 217 bool FileSystemContext::IsSandboxFileSystem(FileSystemType type) const { | 216 bool FileSystemContext::IsSandboxFileSystem(FileSystemType type) const { |
| 218 return GetQuotaUtil(type) != NULL; | 217 return GetQuotaUtil(type) != NULL; |
| 219 } | 218 } |
| 220 | 219 |
| 221 const UpdateObserverList* FileSystemContext::GetUpdateObservers( | 220 const UpdateObserverList* FileSystemContext::GetUpdateObservers( |
| 222 FileSystemType type) const { | 221 FileSystemType type) const { |
| 223 // Currently update observer is only available in SandboxFileSystemBackend | 222 // Currently update observer is only available in SandboxFileSystemBackend, |
| 224 // and TestFileSystemBackend. | 223 // SyncFileSystemBackend and TestFileSystemBackend. |
| 225 // TODO(kinuko): Probably GetUpdateObservers() virtual method should be | |
| 226 // added to FileSystemBackend interface and be called like | |
| 227 // other GetFoo() methods do. | |
| 228 if (sandbox_backend_->CanHandleType(type)) | 224 if (sandbox_backend_->CanHandleType(type)) |
| 229 return sandbox_backend_->GetUpdateObservers(type); | 225 return sandbox_backend_->GetUpdateObservers(type); |
| 230 if (type != kFileSystemTypeTest) | |
| 231 return NULL; | |
| 232 FileSystemBackend* backend = GetFileSystemBackend(type); | 226 FileSystemBackend* backend = GetFileSystemBackend(type); |
| 233 return static_cast<TestFileSystemBackend*>( | 227 if (type == kFileSystemTypeSyncable || |
| 234 backend)->GetUpdateObservers(type); | 228 type == kFileSystemTypeSyncableForInternalSync) { |
| 229 return static_cast<SandboxFileSystemBackend*>( |
| 230 backend)->GetUpdateObservers(type); |
| 231 } |
| 232 if (type == kFileSystemTypeTest) { |
| 233 return static_cast<TestFileSystemBackend*>( |
| 234 backend)->GetUpdateObservers(type); |
| 235 } |
| 236 return NULL; |
| 235 } | 237 } |
| 236 | 238 |
| 237 const AccessObserverList* FileSystemContext::GetAccessObservers( | 239 const AccessObserverList* FileSystemContext::GetAccessObservers( |
| 238 FileSystemType type) const { | 240 FileSystemType type) const { |
| 239 // Currently access observer is only available in SandboxFileSystemBackend. | 241 // Currently access observer is only available in SandboxFileSystemBackend and |
| 242 // SyncFileSystemBackend. |
| 240 if (sandbox_backend_->CanHandleType(type)) | 243 if (sandbox_backend_->CanHandleType(type)) |
| 241 return sandbox_backend_->GetAccessObservers(type); | 244 return sandbox_backend_->GetAccessObservers(type); |
| 245 if (type == kFileSystemTypeSyncable || |
| 246 type == kFileSystemTypeSyncableForInternalSync) { |
| 247 return static_cast<SandboxFileSystemBackend*>( |
| 248 GetFileSystemBackend(type))->GetAccessObservers(type); |
| 249 } |
| 242 return NULL; | 250 return NULL; |
| 243 } | 251 } |
| 244 | 252 |
| 245 void FileSystemContext::GetFileSystemTypes( | 253 void FileSystemContext::GetFileSystemTypes( |
| 246 std::vector<FileSystemType>* types) const { | 254 std::vector<FileSystemType>* types) const { |
| 247 types->clear(); | 255 types->clear(); |
| 248 for (FileSystemBackendMap::const_iterator iter = backend_map_.begin(); | 256 for (FileSystemBackendMap::const_iterator iter = backend_map_.begin(); |
| 249 iter != backend_map_.end(); ++iter) | 257 iter != backend_map_.end(); ++iter) |
| 250 types->push_back(iter->first); | 258 types->push_back(iter->first); |
| 251 } | 259 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 const FileSystemURL& url, | 327 const FileSystemURL& url, |
| 320 int64 offset) { | 328 int64 offset) { |
| 321 if (!url.is_valid()) | 329 if (!url.is_valid()) |
| 322 return scoped_ptr<FileStreamWriter>(); | 330 return scoped_ptr<FileStreamWriter>(); |
| 323 FileSystemBackend* backend = GetFileSystemBackend(url.type()); | 331 FileSystemBackend* backend = GetFileSystemBackend(url.type()); |
| 324 if (!backend) | 332 if (!backend) |
| 325 return scoped_ptr<FileStreamWriter>(); | 333 return scoped_ptr<FileStreamWriter>(); |
| 326 return backend->CreateFileStreamWriter(url, offset, this); | 334 return backend->CreateFileStreamWriter(url, offset, this); |
| 327 } | 335 } |
| 328 | 336 |
| 329 void FileSystemContext::SetLocalFileChangeTracker( | |
| 330 scoped_ptr<sync_file_system::LocalFileChangeTracker> tracker) { | |
| 331 DCHECK(!change_tracker_.get()); | |
| 332 DCHECK(tracker.get()); | |
| 333 change_tracker_ = tracker.Pass(); | |
| 334 sandbox_backend_->AddFileUpdateObserver( | |
| 335 kFileSystemTypeSyncable, | |
| 336 change_tracker_.get(), | |
| 337 task_runners_->file_task_runner()); | |
| 338 sandbox_backend_->AddFileChangeObserver( | |
| 339 kFileSystemTypeSyncable, | |
| 340 change_tracker_.get(), | |
| 341 task_runners_->file_task_runner()); | |
| 342 } | |
| 343 | |
| 344 void FileSystemContext::set_sync_context( | |
| 345 sync_file_system::LocalFileSyncContext* sync_context) { | |
| 346 sync_context_ = sync_context; | |
| 347 } | |
| 348 | |
| 349 FileSystemURL FileSystemContext::CrackURL(const GURL& url) const { | 337 FileSystemURL FileSystemContext::CrackURL(const GURL& url) const { |
| 350 return CrackFileSystemURL(FileSystemURL(url)); | 338 return CrackFileSystemURL(FileSystemURL(url)); |
| 351 } | 339 } |
| 352 | 340 |
| 353 FileSystemURL FileSystemContext::CreateCrackedFileSystemURL( | 341 FileSystemURL FileSystemContext::CreateCrackedFileSystemURL( |
| 354 const GURL& origin, | 342 const GURL& origin, |
| 355 FileSystemType type, | 343 FileSystemType type, |
| 356 const base::FilePath& path) const { | 344 const base::FilePath& path) const { |
| 357 return CrackFileSystemURL(FileSystemURL(origin, type, path)); | 345 return CrackFileSystemURL(FileSystemURL(origin, type, path)); |
| 358 } | 346 } |
| 359 | 347 |
| 360 #if defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD) | 348 #if defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD) |
| 361 void FileSystemContext::EnableTemporaryFileSystemInIncognito() { | 349 void FileSystemContext::EnableTemporaryFileSystemInIncognito() { |
| 362 sandbox_backend_->set_enable_temporary_file_system_in_incognito(true); | 350 sandbox_backend_->set_enable_temporary_file_system_in_incognito(true); |
| 363 } | 351 } |
| 364 #endif | 352 #endif |
| 365 | 353 |
| 366 FileSystemContext::~FileSystemContext() { | 354 FileSystemContext::~FileSystemContext() { |
| 367 task_runners_->file_task_runner()->DeleteSoon( | |
| 368 FROM_HERE, change_tracker_.release()); | |
| 369 } | 355 } |
| 370 | 356 |
| 371 void FileSystemContext::DeleteOnCorrectThread() const { | 357 void FileSystemContext::DeleteOnCorrectThread() const { |
| 372 if (!task_runners_->io_task_runner()->RunsTasksOnCurrentThread() && | 358 if (!task_runners_->io_task_runner()->RunsTasksOnCurrentThread() && |
| 373 task_runners_->io_task_runner()->DeleteSoon(FROM_HERE, this)) { | 359 task_runners_->io_task_runner()->DeleteSoon(FROM_HERE, this)) { |
| 374 return; | 360 return; |
| 375 } | 361 } |
| 376 delete this; | 362 delete this; |
| 377 } | 363 } |
| 378 | 364 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 FileSystemType type = static_cast<FileSystemType>(t); | 436 FileSystemType type = static_cast<FileSystemType>(t); |
| 451 if (backend->CanHandleType(type)) { | 437 if (backend->CanHandleType(type)) { |
| 452 const bool inserted = backend_map_.insert( | 438 const bool inserted = backend_map_.insert( |
| 453 std::make_pair(type, backend)).second; | 439 std::make_pair(type, backend)).second; |
| 454 DCHECK(inserted); | 440 DCHECK(inserted); |
| 455 } | 441 } |
| 456 } | 442 } |
| 457 } | 443 } |
| 458 | 444 |
| 459 } // namespace fileapi | 445 } // namespace fileapi |
| OLD | NEW |