| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/sandbox_file_system_backend_delegate.h" | 5 #include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 100 |
| 101 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { | 101 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { |
| 102 return enum_->HasTypeDirectory( | 102 return enum_->HasTypeDirectory( |
| 103 SandboxFileSystemBackendDelegate::GetTypeString(type)); | 103 SandboxFileSystemBackendDelegate::GetTypeString(type)); |
| 104 } | 104 } |
| 105 | 105 |
| 106 private: | 106 private: |
| 107 scoped_ptr<ObfuscatedFileUtil::AbstractOriginEnumerator> enum_; | 107 scoped_ptr<ObfuscatedFileUtil::AbstractOriginEnumerator> enum_; |
| 108 }; | 108 }; |
| 109 | 109 |
| 110 void OpenFileSystemOnFileThread( | 110 void OpenFileSystemOnFileTaskRunner( |
| 111 ObfuscatedFileUtil* file_util, | 111 ObfuscatedFileUtil* file_util, |
| 112 const GURL& origin_url, | 112 const GURL& origin_url, |
| 113 FileSystemType type, | 113 FileSystemType type, |
| 114 OpenFileSystemMode mode, | 114 OpenFileSystemMode mode, |
| 115 base::PlatformFileError* error_ptr) { | 115 base::PlatformFileError* error_ptr) { |
| 116 DCHECK(error_ptr); | 116 DCHECK(error_ptr); |
| 117 const bool create = (mode == OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT); | 117 const bool create = (mode == OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT); |
| 118 file_util->GetDirectoryForOriginAndType( | 118 file_util->GetDirectoryForOriginAndType( |
| 119 origin_url, SandboxFileSystemBackendDelegate::GetTypeString(type), | 119 origin_url, SandboxFileSystemBackendDelegate::GetTypeString(type), |
| 120 create, error_ptr); | 120 create, error_ptr); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 if (!IsAllowedScheme(origin_url)) { | 253 if (!IsAllowedScheme(origin_url)) { |
| 254 callback.Run(GURL(), std::string(), base::PLATFORM_FILE_ERROR_SECURITY); | 254 callback.Run(GURL(), std::string(), base::PLATFORM_FILE_ERROR_SECURITY); |
| 255 return; | 255 return; |
| 256 } | 256 } |
| 257 | 257 |
| 258 std::string name = GetFileSystemName(origin_url, type); | 258 std::string name = GetFileSystemName(origin_url, type); |
| 259 | 259 |
| 260 base::PlatformFileError* error_ptr = new base::PlatformFileError; | 260 base::PlatformFileError* error_ptr = new base::PlatformFileError; |
| 261 file_task_runner_->PostTaskAndReply( | 261 file_task_runner_->PostTaskAndReply( |
| 262 FROM_HERE, | 262 FROM_HERE, |
| 263 base::Bind(&OpenFileSystemOnFileThread, | 263 base::Bind(&OpenFileSystemOnFileTaskRunner, |
| 264 obfuscated_file_util(), origin_url, type, mode, | 264 obfuscated_file_util(), origin_url, type, mode, |
| 265 base::Unretained(error_ptr)), | 265 base::Unretained(error_ptr)), |
| 266 base::Bind(&DidOpenFileSystem, | 266 base::Bind(&DidOpenFileSystem, |
| 267 weak_factory_.GetWeakPtr(), | 267 weak_factory_.GetWeakPtr(), |
| 268 base::Bind(callback, root_url, name), | 268 base::Bind(callback, root_url, name), |
| 269 base::Owned(error_ptr))); | 269 base::Owned(error_ptr))); |
| 270 | 270 |
| 271 io_thread_checker_.DetachFromThread(); | 271 io_thread_checker_.DetachFromThread(); |
| 272 is_filesystem_opened_ = true; | 272 is_filesystem_opened_ = true; |
| 273 } | 273 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 FileSystemType type) const { | 316 FileSystemType type) const { |
| 317 if (!IsAccessValid(url)) | 317 if (!IsAccessValid(url)) |
| 318 return scoped_ptr<FileStreamWriter>(); | 318 return scoped_ptr<FileStreamWriter>(); |
| 319 const UpdateObserverList* observers = GetUpdateObservers(type); | 319 const UpdateObserverList* observers = GetUpdateObservers(type); |
| 320 DCHECK(observers); | 320 DCHECK(observers); |
| 321 return scoped_ptr<FileStreamWriter>( | 321 return scoped_ptr<FileStreamWriter>( |
| 322 new SandboxFileStreamWriter(context, url, offset, *observers)); | 322 new SandboxFileStreamWriter(context, url, offset, *observers)); |
| 323 } | 323 } |
| 324 | 324 |
| 325 base::PlatformFileError | 325 base::PlatformFileError |
| 326 SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileThread( | 326 SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileTaskRunner( |
| 327 FileSystemContext* file_system_context, | 327 FileSystemContext* file_system_context, |
| 328 quota::QuotaManagerProxy* proxy, | 328 quota::QuotaManagerProxy* proxy, |
| 329 const GURL& origin_url, | 329 const GURL& origin_url, |
| 330 FileSystemType type) { | 330 FileSystemType type) { |
| 331 int64 usage = GetOriginUsageOnFileThread( | 331 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 332 int64 usage = GetOriginUsageOnFileTaskRunner( |
| 332 file_system_context, origin_url, type); | 333 file_system_context, origin_url, type); |
| 333 usage_cache()->CloseCacheFiles(); | 334 usage_cache()->CloseCacheFiles(); |
| 334 bool result = obfuscated_file_util()->DeleteDirectoryForOriginAndType( | 335 bool result = obfuscated_file_util()->DeleteDirectoryForOriginAndType( |
| 335 origin_url, GetTypeString(type)); | 336 origin_url, GetTypeString(type)); |
| 336 if (result && proxy) { | 337 if (result && proxy) { |
| 337 proxy->NotifyStorageModified( | 338 proxy->NotifyStorageModified( |
| 338 quota::QuotaClient::kFileSystem, | 339 quota::QuotaClient::kFileSystem, |
| 339 origin_url, | 340 origin_url, |
| 340 FileSystemTypeToQuotaStorageType(type), | 341 FileSystemTypeToQuotaStorageType(type), |
| 341 -usage); | 342 -usage); |
| 342 } | 343 } |
| 343 | 344 |
| 344 if (result) | 345 if (result) |
| 345 return base::PLATFORM_FILE_OK; | 346 return base::PLATFORM_FILE_OK; |
| 346 return base::PLATFORM_FILE_ERROR_FAILED; | 347 return base::PLATFORM_FILE_ERROR_FAILED; |
| 347 } | 348 } |
| 348 | 349 |
| 349 void SandboxFileSystemBackendDelegate::GetOriginsForTypeOnFileThread( | 350 void SandboxFileSystemBackendDelegate::GetOriginsForTypeOnFileTaskRunner( |
| 350 FileSystemType type, std::set<GURL>* origins) { | 351 FileSystemType type, std::set<GURL>* origins) { |
| 352 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 351 DCHECK(origins); | 353 DCHECK(origins); |
| 352 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | 354 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); |
| 353 GURL origin; | 355 GURL origin; |
| 354 while (!(origin = enumerator->Next()).is_empty()) { | 356 while (!(origin = enumerator->Next()).is_empty()) { |
| 355 if (enumerator->HasFileSystemType(type)) | 357 if (enumerator->HasFileSystemType(type)) |
| 356 origins->insert(origin); | 358 origins->insert(origin); |
| 357 } | 359 } |
| 358 switch (type) { | 360 switch (type) { |
| 359 case kFileSystemTypeTemporary: | 361 case kFileSystemTypeTemporary: |
| 360 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); | 362 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); |
| 361 break; | 363 break; |
| 362 case kFileSystemTypePersistent: | 364 case kFileSystemTypePersistent: |
| 363 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); | 365 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); |
| 364 break; | 366 break; |
| 365 default: | 367 default: |
| 366 break; | 368 break; |
| 367 } | 369 } |
| 368 } | 370 } |
| 369 | 371 |
| 370 void SandboxFileSystemBackendDelegate::GetOriginsForHostOnFileThread( | 372 void SandboxFileSystemBackendDelegate::GetOriginsForHostOnFileTaskRunner( |
| 371 FileSystemType type, const std::string& host, | 373 FileSystemType type, const std::string& host, |
| 372 std::set<GURL>* origins) { | 374 std::set<GURL>* origins) { |
| 375 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 373 DCHECK(origins); | 376 DCHECK(origins); |
| 374 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | 377 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); |
| 375 GURL origin; | 378 GURL origin; |
| 376 while (!(origin = enumerator->Next()).is_empty()) { | 379 while (!(origin = enumerator->Next()).is_empty()) { |
| 377 if (host == net::GetHostOrSpecFromURL(origin) && | 380 if (host == net::GetHostOrSpecFromURL(origin) && |
| 378 enumerator->HasFileSystemType(type)) | 381 enumerator->HasFileSystemType(type)) |
| 379 origins->insert(origin); | 382 origins->insert(origin); |
| 380 } | 383 } |
| 381 } | 384 } |
| 382 | 385 |
| 383 int64 SandboxFileSystemBackendDelegate::GetOriginUsageOnFileThread( | 386 int64 SandboxFileSystemBackendDelegate::GetOriginUsageOnFileTaskRunner( |
| 384 FileSystemContext* file_system_context, | 387 FileSystemContext* file_system_context, |
| 385 const GURL& origin_url, | 388 const GURL& origin_url, |
| 386 FileSystemType type) { | 389 FileSystemType type) { |
| 390 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 391 |
| 387 // Don't use usage cache and return recalculated usage for sticky invalidated | 392 // Don't use usage cache and return recalculated usage for sticky invalidated |
| 388 // origins. | 393 // origins. |
| 389 if (ContainsKey(sticky_dirty_origins_, std::make_pair(origin_url, type))) | 394 if (ContainsKey(sticky_dirty_origins_, std::make_pair(origin_url, type))) |
| 390 return RecalculateUsage(file_system_context, origin_url, type); | 395 return RecalculateUsage(file_system_context, origin_url, type); |
| 391 | 396 |
| 392 base::FilePath base_path = | 397 base::FilePath base_path = |
| 393 GetBaseDirectoryForOriginAndType(origin_url, type, false); | 398 GetBaseDirectoryForOriginAndType(origin_url, type, false); |
| 394 if (base_path.empty() || !base::DirectoryExists(base_path)) | 399 if (base_path.empty() || !base::DirectoryExists(base_path)) |
| 395 return 0; | 400 return 0; |
| 396 base::FilePath usage_file_path = | 401 base::FilePath usage_file_path = |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 base::SequencedTaskRunner* file_task_runner) { | 663 base::SequencedTaskRunner* file_task_runner) { |
| 659 return new ObfuscatedFileUtil(special_storage_policy, | 664 return new ObfuscatedFileUtil(special_storage_policy, |
| 660 file_system_directory, | 665 file_system_directory, |
| 661 file_task_runner, | 666 file_task_runner, |
| 662 base::Bind(&GetTypeStringForURL), | 667 base::Bind(&GetTypeStringForURL), |
| 663 GetKnownTypeStrings(), | 668 GetKnownTypeStrings(), |
| 664 NULL); | 669 NULL); |
| 665 } | 670 } |
| 666 | 671 |
| 667 } // namespace fileapi | 672 } // namespace fileapi |
| OLD | NEW |