| 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/sandbox_mount_point_provider.h" | 5 #include "webkit/browser/fileapi/sandbox_mount_point_provider.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/memory/scoped_ptr.h" | |
| 12 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 13 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 14 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
| 15 #include "net/base/net_util.h" | 14 #include "net/base/net_util.h" |
| 16 #include "url/gurl.h" | |
| 17 #include "webkit/browser/fileapi/async_file_util_adapter.h" | 15 #include "webkit/browser/fileapi/async_file_util_adapter.h" |
| 18 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" | 16 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" |
| 19 #include "webkit/browser/fileapi/file_system_context.h" | 17 #include "webkit/browser/fileapi/file_system_context.h" |
| 20 #include "webkit/browser/fileapi/file_system_file_stream_reader.h" | 18 #include "webkit/browser/fileapi/file_system_file_stream_reader.h" |
| 21 #include "webkit/browser/fileapi/file_system_operation_context.h" | 19 #include "webkit/browser/fileapi/file_system_operation_context.h" |
| 22 #include "webkit/browser/fileapi/file_system_options.h" | 20 #include "webkit/browser/fileapi/file_system_options.h" |
| 23 #include "webkit/browser/fileapi/file_system_task_runners.h" | 21 #include "webkit/browser/fileapi/file_system_task_runners.h" |
| 24 #include "webkit/browser/fileapi/file_system_usage_cache.h" | 22 #include "webkit/browser/fileapi/file_system_usage_cache.h" |
| 25 #include "webkit/browser/fileapi/local_file_system_operation.h" | 23 #include "webkit/browser/fileapi/local_file_system_operation.h" |
| 26 #include "webkit/browser/fileapi/obfuscated_file_util.h" | 24 #include "webkit/browser/fileapi/obfuscated_file_util.h" |
| 27 #include "webkit/browser/fileapi/sandbox_file_stream_writer.h" | 25 #include "webkit/browser/fileapi/sandbox_file_stream_writer.h" |
| 28 #include "webkit/browser/fileapi/sandbox_quota_observer.h" | 26 #include "webkit/browser/fileapi/sandbox_quota_observer.h" |
| 29 #include "webkit/browser/fileapi/syncable/syncable_file_system_operation.h" | |
| 30 #include "webkit/browser/quota/quota_manager.h" | 27 #include "webkit/browser/quota/quota_manager.h" |
| 31 #include "webkit/common/fileapi/file_system_types.h" | 28 #include "webkit/common/fileapi/file_system_types.h" |
| 32 #include "webkit/common/fileapi/file_system_util.h" | 29 #include "webkit/common/fileapi/file_system_util.h" |
| 33 | 30 |
| 34 using quota::QuotaManagerProxy; | |
| 35 | |
| 36 namespace fileapi { | 31 namespace fileapi { |
| 37 | 32 |
| 38 namespace { | 33 namespace { |
| 39 | 34 |
| 40 const char kChromeScheme[] = "chrome"; | 35 const char kChromeScheme[] = "chrome"; |
| 41 const char kExtensionScheme[] = "chrome-extension"; | 36 const char kExtensionScheme[] = "chrome-extension"; |
| 42 | 37 |
| 43 const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem"; | 38 const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem"; |
| 44 const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail"; | 39 const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail"; |
| 45 const char kOpenFileSystemDetailNonThrottledLabel[] = | 40 const char kOpenFileSystemDetailNonThrottledLabel[] = |
| 46 "FileSystem.OpenFileSystemDetailNonthrottled"; | 41 "FileSystem.OpenFileSystemDetailNonthrottled"; |
| 47 int64 kMinimumStatsCollectionIntervalHours = 1; | 42 int64 kMinimumStatsCollectionIntervalHours = 1; |
| 48 | 43 |
| 49 // A command line switch to disable usage tracking. | 44 // A command line switch to disable usage tracking. |
| 50 const char kDisableUsageTracking[] = "disable-file-system-usage-tracking"; | 45 const char kDisableUsageTracking[] = "disable-file-system-usage-tracking"; |
| 51 | 46 |
| 52 enum FileSystemError { | 47 enum FileSystemError { |
| 53 kOK = 0, | 48 kOK = 0, |
| 54 kIncognito, | 49 kIncognito, |
| 55 kInvalidSchemeError, | 50 kInvalidSchemeError, |
| 56 kCreateDirectoryError, | 51 kCreateDirectoryError, |
| 57 kNotFound, | 52 kNotFound, |
| 58 kUnknownError, | 53 kUnknownError, |
| 59 kFileSystemErrorMax, | 54 kFileSystemErrorMax, |
| 60 }; | 55 }; |
| 61 | 56 |
| 62 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; | 57 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; |
| 63 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; | 58 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; |
| 64 const char kSyncableOriginsCountLabel[] = "FileSystem.SyncableOriginsCount"; | |
| 65 | 59 |
| 66 // Restricted names. | 60 // Restricted names. |
| 67 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions | 61 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions |
| 68 const base::FilePath::CharType* const kRestrictedNames[] = { | 62 const base::FilePath::CharType* const kRestrictedNames[] = { |
| 69 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), | 63 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), |
| 70 }; | 64 }; |
| 71 | 65 |
| 72 // Restricted chars. | 66 // Restricted chars. |
| 73 const base::FilePath::CharType kRestrictedChars[] = { | 67 const base::FilePath::CharType kRestrictedChars[] = { |
| 74 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), | 68 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 SandboxMountPointProvider::SandboxMountPointProvider( | 130 SandboxMountPointProvider::SandboxMountPointProvider( |
| 137 quota::QuotaManagerProxy* quota_manager_proxy, | 131 quota::QuotaManagerProxy* quota_manager_proxy, |
| 138 base::SequencedTaskRunner* file_task_runner, | 132 base::SequencedTaskRunner* file_task_runner, |
| 139 const base::FilePath& profile_path, | 133 const base::FilePath& profile_path, |
| 140 const FileSystemOptions& file_system_options, | 134 const FileSystemOptions& file_system_options, |
| 141 quota::SpecialStoragePolicy* special_storage_policy) | 135 quota::SpecialStoragePolicy* special_storage_policy) |
| 142 : file_task_runner_(file_task_runner), | 136 : file_task_runner_(file_task_runner), |
| 143 profile_path_(profile_path), | 137 profile_path_(profile_path), |
| 144 file_system_options_(file_system_options), | 138 file_system_options_(file_system_options), |
| 145 enable_temporary_file_system_in_incognito_(false), | 139 enable_temporary_file_system_in_incognito_(false), |
| 146 sandbox_file_util_( | |
| 147 new AsyncFileUtilAdapter( | |
| 148 new ObfuscatedFileUtil( | |
| 149 special_storage_policy, | |
| 150 profile_path.Append(kFileSystemDirectory), | |
| 151 file_task_runner))), | |
| 152 file_system_usage_cache_(new FileSystemUsageCache(file_task_runner)), | 140 file_system_usage_cache_(new FileSystemUsageCache(file_task_runner)), |
| 153 quota_observer_(new SandboxQuotaObserver( | |
| 154 quota_manager_proxy, | |
| 155 file_task_runner, | |
| 156 sandbox_sync_file_util(), | |
| 157 file_system_usage_cache_.get())), | |
| 158 enable_usage_tracking_( | 141 enable_usage_tracking_( |
| 159 !CommandLine::ForCurrentProcess()->HasSwitch( | 142 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 160 kDisableUsageTracking)), | 143 kDisableUsageTracking)), |
| 161 special_storage_policy_(special_storage_policy), | 144 special_storage_policy_(special_storage_policy), |
| 162 weak_factory_(this) { | 145 weak_factory_(this) { |
| 146 sandbox_file_util_.reset(new AsyncFileUtilAdapter( |
| 147 new ObfuscatedFileUtil( |
| 148 special_storage_policy, |
| 149 profile_path.Append(kFileSystemDirectory), |
| 150 file_task_runner))); |
| 151 |
| 152 quota_observer_.reset(new SandboxQuotaObserver( |
| 153 quota_manager_proxy, |
| 154 file_task_runner, |
| 155 sandbox_sync_file_util(), |
| 156 file_system_usage_cache_.get())); |
| 157 |
| 163 // Set quota observers. | 158 // Set quota observers. |
| 164 UpdateObserverList::Source update_observers_src; | 159 UpdateObserverList::Source update_observers_src; |
| 165 AccessObserverList::Source access_observers_src; | 160 AccessObserverList::Source access_observers_src; |
| 166 | 161 |
| 167 if (enable_usage_tracking_) { | 162 if (enable_usage_tracking_) { |
| 168 update_observers_src.AddObserver(quota_observer_.get(), | 163 update_observers_src.AddObserver(quota_observer_.get(), |
| 169 file_task_runner_.get()); | 164 file_task_runner_.get()); |
| 170 access_observers_src.AddObserver(quota_observer_.get(), NULL); | 165 access_observers_src.AddObserver(quota_observer_.get(), NULL); |
| 171 } | 166 } |
| 172 | 167 |
| 173 update_observers_ = UpdateObserverList(update_observers_src); | 168 update_observers_ = UpdateObserverList(update_observers_src); |
| 174 access_observers_ = AccessObserverList(access_observers_src); | 169 access_observers_ = AccessObserverList(access_observers_src); |
| 175 syncable_update_observers_ = UpdateObserverList(update_observers_src); | |
| 176 | 170 |
| 177 if (!file_task_runner_->RunsTasksOnCurrentThread()) { | 171 if (!file_task_runner_->RunsTasksOnCurrentThread()) { |
| 178 // Post prepopulate task only if it's not already running on | 172 // Post prepopulate task only if it's not already running on |
| 179 // file_task_runner (which implies running in tests). | 173 // file_task_runner (which implies running in tests). |
| 180 file_task_runner_->PostTask( | 174 file_task_runner_->PostTask( |
| 181 FROM_HERE, | 175 FROM_HERE, |
| 182 base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase, | 176 base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase, |
| 183 base::Unretained(sandbox_sync_file_util()))); | 177 base::Unretained(sandbox_sync_file_util()))); |
| 184 } | 178 } |
| 185 } | 179 } |
| 186 | 180 |
| 187 SandboxMountPointProvider::~SandboxMountPointProvider() { | 181 SandboxMountPointProvider::~SandboxMountPointProvider() { |
| 188 if (!file_task_runner_->RunsTasksOnCurrentThread()) { | 182 if (!file_task_runner_->RunsTasksOnCurrentThread()) { |
| 189 AsyncFileUtilAdapter* sandbox_file_util = sandbox_file_util_.release(); | 183 AsyncFileUtilAdapter* sandbox_file_util = sandbox_file_util_.release(); |
| 190 SandboxQuotaObserver* quota_observer = quota_observer_.release(); | 184 SandboxQuotaObserver* quota_observer = quota_observer_.release(); |
| 191 FileSystemUsageCache* file_system_usage_cache = | 185 FileSystemUsageCache* file_system_usage_cache = |
| 192 file_system_usage_cache_.release(); | 186 file_system_usage_cache_.release(); |
| 193 if (!file_task_runner_->DeleteSoon(FROM_HERE, sandbox_file_util)) | 187 if (!file_task_runner_->DeleteSoon(FROM_HERE, sandbox_file_util)) |
| 194 delete sandbox_file_util; | 188 delete sandbox_file_util; |
| 195 if (!file_task_runner_->DeleteSoon(FROM_HERE, quota_observer)) | 189 if (!file_task_runner_->DeleteSoon(FROM_HERE, quota_observer)) |
| 196 delete quota_observer; | 190 delete quota_observer; |
| 197 if (!file_task_runner_->DeleteSoon(FROM_HERE, file_system_usage_cache)) | 191 if (!file_task_runner_->DeleteSoon(FROM_HERE, file_system_usage_cache)) |
| 198 delete file_system_usage_cache; | 192 delete file_system_usage_cache; |
| 199 } | 193 } |
| 200 } | 194 } |
| 201 | 195 |
| 202 bool SandboxMountPointProvider::CanHandleType(FileSystemType type) const { | 196 bool SandboxMountPointProvider::CanHandleType(FileSystemType type) const { |
| 203 return type == kFileSystemTypeTemporary || | 197 return type == kFileSystemTypeTemporary || |
| 204 type == kFileSystemTypePersistent || | 198 type == kFileSystemTypePersistent; |
| 205 type == kFileSystemTypeSyncable || | 199 } |
| 206 type == kFileSystemTypeSyncableForInternalSync; | 200 |
| 201 GURL SandboxMountPointProvider::GetRootURI(const GURL& origin_url, |
| 202 FileSystemType type) const { |
| 203 if (!CanHandleType(type)) |
| 204 return GURL(); |
| 205 return GetFileSystemRootURI(origin_url, type); |
| 207 } | 206 } |
| 208 | 207 |
| 209 void SandboxMountPointProvider::OpenFileSystem( | 208 void SandboxMountPointProvider::OpenFileSystem( |
| 210 const GURL& origin_url, fileapi::FileSystemType type, | 209 const GURL& origin_url, fileapi::FileSystemType type, |
| 211 OpenFileSystemMode mode, | 210 OpenFileSystemMode mode, |
| 212 const OpenFileSystemCallback& callback) { | 211 const OpenFileSystemCallback& callback) { |
| 213 if (file_system_options_.is_incognito() && | 212 if (file_system_options_.is_incognito() && |
| 214 !(type == kFileSystemTypeTemporary && | 213 !(type == kFileSystemTypeTemporary && |
| 215 enable_temporary_file_system_in_incognito_)) { | 214 enable_temporary_file_system_in_incognito_)) { |
| 216 // TODO(kinuko): return an isolated temporary directory. | 215 // TODO(kinuko): return an isolated temporary directory. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 const FileSystemURL& url, | 275 const FileSystemURL& url, |
| 277 FileSystemContext* context, | 276 FileSystemContext* context, |
| 278 base::PlatformFileError* error_code) const { | 277 base::PlatformFileError* error_code) const { |
| 279 if (!IsAccessValid(url)) { | 278 if (!IsAccessValid(url)) { |
| 280 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; | 279 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; |
| 281 return NULL; | 280 return NULL; |
| 282 } | 281 } |
| 283 | 282 |
| 284 scoped_ptr<FileSystemOperationContext> operation_context( | 283 scoped_ptr<FileSystemOperationContext> operation_context( |
| 285 new FileSystemOperationContext(context)); | 284 new FileSystemOperationContext(context)); |
| 286 | |
| 287 // Copy the observer lists (assuming we only have small number of observers). | |
| 288 if (url.type() == kFileSystemTypeSyncable) { | |
| 289 operation_context->set_update_observers(syncable_update_observers_); | |
| 290 operation_context->set_change_observers(syncable_change_observers_); | |
| 291 return new sync_file_system::SyncableFileSystemOperation( | |
| 292 url, context, operation_context.Pass()); | |
| 293 } | |
| 294 | |
| 295 // For regular sandboxed types. | |
| 296 operation_context->set_update_observers(update_observers_); | 285 operation_context->set_update_observers(update_observers_); |
| 297 operation_context->set_change_observers(change_observers_); | 286 operation_context->set_change_observers(change_observers_); |
| 298 | 287 |
| 299 if (special_storage_policy_.get() && | 288 if (special_storage_policy_.get() && |
| 300 special_storage_policy_->IsStorageUnlimited(url.origin())) { | 289 special_storage_policy_->IsStorageUnlimited(url.origin())) { |
| 301 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited); | 290 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited); |
| 302 } else { | 291 } else { |
| 303 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeLimited); | 292 operation_context->set_quota_limit_type(quota::kQuotaLimitTypeLimited); |
| 304 } | 293 } |
| 305 | 294 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 327 if (!IsAccessValid(url)) | 316 if (!IsAccessValid(url)) |
| 328 return scoped_ptr<fileapi::FileStreamWriter>(); | 317 return scoped_ptr<fileapi::FileStreamWriter>(); |
| 329 return scoped_ptr<fileapi::FileStreamWriter>( | 318 return scoped_ptr<fileapi::FileStreamWriter>( |
| 330 new SandboxFileStreamWriter(context, url, offset, update_observers_)); | 319 new SandboxFileStreamWriter(context, url, offset, update_observers_)); |
| 331 } | 320 } |
| 332 | 321 |
| 333 FileSystemQuotaUtil* SandboxMountPointProvider::GetQuotaUtil() { | 322 FileSystemQuotaUtil* SandboxMountPointProvider::GetQuotaUtil() { |
| 334 return this; | 323 return this; |
| 335 } | 324 } |
| 336 | 325 |
| 326 const UpdateObserverList* |
| 327 SandboxMountPointProvider::GetUpdateObservers(FileSystemType type) const { |
| 328 return &update_observers_; |
| 329 } |
| 330 |
| 337 SandboxMountPointProvider::OriginEnumerator* | 331 SandboxMountPointProvider::OriginEnumerator* |
| 338 SandboxMountPointProvider::CreateOriginEnumerator() { | 332 SandboxMountPointProvider::CreateOriginEnumerator() { |
| 339 return new ObfuscatedOriginEnumerator(sandbox_sync_file_util()); | 333 return new ObfuscatedOriginEnumerator(sandbox_sync_file_util()); |
| 340 } | 334 } |
| 341 | 335 |
| 342 base::FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType( | 336 base::FilePath SandboxMountPointProvider::GetBaseDirectoryForOriginAndType( |
| 343 const GURL& origin_url, fileapi::FileSystemType type, bool create) { | 337 const GURL& origin_url, fileapi::FileSystemType type, bool create) { |
| 344 | 338 |
| 345 base::PlatformFileError error = base::PLATFORM_FILE_OK; | 339 base::PlatformFileError error = base::PLATFORM_FILE_OK; |
| 346 base::FilePath path = sandbox_sync_file_util()->GetDirectoryForOriginAndType( | 340 base::FilePath path = sandbox_sync_file_util()->GetDirectoryForOriginAndType( |
| 347 origin_url, type, create, &error); | 341 origin_url, type, create, &error); |
| 348 if (error != base::PLATFORM_FILE_OK) | 342 if (error != base::PLATFORM_FILE_OK) |
| 349 return base::FilePath(); | 343 return base::FilePath(); |
| 350 return path; | 344 return path; |
| 351 } | 345 } |
| 352 | 346 |
| 353 base::PlatformFileError | 347 base::PlatformFileError |
| 354 SandboxMountPointProvider::DeleteOriginDataOnFileThread( | 348 SandboxMountPointProvider::DeleteOriginDataOnFileThread( |
| 355 FileSystemContext* file_system_context, | 349 FileSystemContext* file_system_context, |
| 356 QuotaManagerProxy* proxy, | 350 quota::QuotaManagerProxy* proxy, |
| 357 const GURL& origin_url, | 351 const GURL& origin_url, |
| 358 fileapi::FileSystemType type) { | 352 fileapi::FileSystemType type) { |
| 359 | 353 |
| 360 int64 usage = GetOriginUsageOnFileThread(file_system_context, | 354 int64 usage = GetOriginUsageOnFileThread(file_system_context, |
| 361 origin_url, type); | 355 origin_url, type); |
| 362 | 356 |
| 363 file_system_usage_cache_->CloseCacheFiles(); | 357 file_system_usage_cache_->CloseCacheFiles(); |
| 364 bool result = sandbox_sync_file_util()->DeleteDirectoryForOriginAndType( | 358 bool result = sandbox_sync_file_util()->DeleteDirectoryForOriginAndType( |
| 365 origin_url, type); | 359 origin_url, type); |
| 366 if (result && proxy) { | 360 if (result && proxy) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 386 if (enumerator->HasFileSystemType(type)) | 380 if (enumerator->HasFileSystemType(type)) |
| 387 origins->insert(origin); | 381 origins->insert(origin); |
| 388 } | 382 } |
| 389 switch (type) { | 383 switch (type) { |
| 390 case kFileSystemTypeTemporary: | 384 case kFileSystemTypeTemporary: |
| 391 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); | 385 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); |
| 392 break; | 386 break; |
| 393 case kFileSystemTypePersistent: | 387 case kFileSystemTypePersistent: |
| 394 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); | 388 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); |
| 395 break; | 389 break; |
| 396 case kFileSystemTypeSyncable: | |
| 397 UMA_HISTOGRAM_COUNTS(kSyncableOriginsCountLabel, origins->size()); | |
| 398 break; | |
| 399 default: | 390 default: |
| 400 break; | 391 break; |
| 401 } | 392 } |
| 402 } | 393 } |
| 403 | 394 |
| 404 void SandboxMountPointProvider::GetOriginsForHostOnFileThread( | 395 void SandboxMountPointProvider::GetOriginsForHostOnFileThread( |
| 405 fileapi::FileSystemType type, const std::string& host, | 396 fileapi::FileSystemType type, |
| 397 const std::string& host, |
| 406 std::set<GURL>* origins) { | 398 std::set<GURL>* origins) { |
| 407 DCHECK(CanHandleType(type)); | 399 DCHECK(CanHandleType(type)); |
| 408 DCHECK(origins); | 400 DCHECK(origins); |
| 409 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | 401 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); |
| 410 GURL origin; | 402 GURL origin; |
| 411 while (!(origin = enumerator->Next()).is_empty()) { | 403 while (!(origin = enumerator->Next()).is_empty()) { |
| 412 if (host == net::GetHostOrSpecFromURL(origin) && | 404 if (host == net::GetHostOrSpecFromURL(origin) && |
| 413 enumerator->HasFileSystemType(type)) | 405 enumerator->HasFileSystemType(type)) |
| 414 origins->insert(origin); | 406 origins->insert(origin); |
| 415 } | 407 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 REPORT(kNotFound); | 501 REPORT(kNotFound); |
| 510 break; | 502 break; |
| 511 case base::PLATFORM_FILE_ERROR_FAILED: | 503 case base::PLATFORM_FILE_ERROR_FAILED: |
| 512 default: | 504 default: |
| 513 REPORT(kUnknownError); | 505 REPORT(kUnknownError); |
| 514 break; | 506 break; |
| 515 } | 507 } |
| 516 #undef REPORT | 508 #undef REPORT |
| 517 } | 509 } |
| 518 | 510 |
| 519 const UpdateObserverList* SandboxMountPointProvider::GetUpdateObservers( | |
| 520 FileSystemType type) const { | |
| 521 DCHECK(CanHandleType(type)); | |
| 522 if (type == kFileSystemTypeSyncable) | |
| 523 return &syncable_update_observers_; | |
| 524 return &update_observers_; | |
| 525 } | |
| 526 | |
| 527 const AccessObserverList* SandboxMountPointProvider::GetAccessObservers( | 511 const AccessObserverList* SandboxMountPointProvider::GetAccessObservers( |
| 528 FileSystemType type) const { | 512 FileSystemType type) const { |
| 529 DCHECK(CanHandleType(type)); | 513 DCHECK(CanHandleType(type)); |
| 530 return &access_observers_; | 514 return &access_observers_; |
| 531 } | 515 } |
| 532 | 516 |
| 533 void SandboxMountPointProvider::AddFileUpdateObserver( | 517 void SandboxMountPointProvider::AddFileUpdateObserver( |
| 534 FileSystemType type, | 518 FileSystemType type, |
| 535 FileUpdateObserver* observer, | 519 FileUpdateObserver* observer, |
| 536 base::SequencedTaskRunner* task_runner) { | 520 base::SequencedTaskRunner* task_runner) { |
| 537 DCHECK(CanHandleType(type)); | 521 DCHECK(CanHandleType(type)); |
| 538 UpdateObserverList* list = &update_observers_; | 522 UpdateObserverList* list = &update_observers_; |
| 539 if (type == kFileSystemTypeSyncable) | |
| 540 list = &syncable_update_observers_; | |
| 541 UpdateObserverList::Source observer_source = list->source(); | 523 UpdateObserverList::Source observer_source = list->source(); |
| 542 observer_source.AddObserver(observer, task_runner); | 524 observer_source.AddObserver(observer, task_runner); |
| 543 *list = UpdateObserverList(observer_source); | 525 *list = UpdateObserverList(observer_source); |
| 544 } | 526 } |
| 545 | 527 |
| 546 void SandboxMountPointProvider::AddFileChangeObserver( | 528 void SandboxMountPointProvider::AddFileChangeObserver( |
| 547 FileSystemType type, | 529 FileSystemType type, |
| 548 FileChangeObserver* observer, | 530 FileChangeObserver* observer, |
| 549 base::SequencedTaskRunner* task_runner) { | 531 base::SequencedTaskRunner* task_runner) { |
| 550 ChangeObserverList* list = &change_observers_; | 532 ChangeObserverList* list = &change_observers_; |
| 551 if (type == kFileSystemTypeSyncable) | |
| 552 list = &syncable_change_observers_; | |
| 553 ChangeObserverList::Source observer_source = list->source(); | 533 ChangeObserverList::Source observer_source = list->source(); |
| 554 observer_source.AddObserver(observer, task_runner); | 534 observer_source.AddObserver(observer, task_runner); |
| 555 *list = ChangeObserverList(observer_source); | 535 *list = ChangeObserverList(observer_source); |
| 556 } | 536 } |
| 557 | 537 |
| 558 bool SandboxMountPointProvider::IsAccessValid( | 538 bool SandboxMountPointProvider::IsAccessValid( |
| 559 const FileSystemURL& url) const { | 539 const FileSystemURL& url) const { |
| 560 if (!IsAllowedScheme(url.origin())) | 540 if (!IsAllowedScheme(url.origin())) |
| 561 return false; | 541 return false; |
| 562 | 542 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 | 647 |
| 668 while (!(file_path_each = enumerator->Next()).empty()) { | 648 while (!(file_path_each = enumerator->Next()).empty()) { |
| 669 usage += enumerator->Size(); | 649 usage += enumerator->Size(); |
| 670 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); | 650 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); |
| 671 } | 651 } |
| 672 | 652 |
| 673 return usage; | 653 return usage; |
| 674 } | 654 } |
| 675 | 655 |
| 676 } // namespace fileapi | 656 } // namespace fileapi |
| OLD | NEW |