Index: webkit/fileapi/file_system_context.cc |
diff --git a/webkit/fileapi/file_system_context.cc b/webkit/fileapi/file_system_context.cc |
index 72558d9522434e606dfe2c76e5dacea702188a3a..9d753b6a3729f9660f4474b85c445ecff61fd6bc 100644 |
--- a/webkit/fileapi/file_system_context.cc |
+++ b/webkit/fileapi/file_system_context.cc |
@@ -61,6 +61,7 @@ FileSystemContext::FileSystemContext( |
ExternalMountPoints* external_mount_points, |
quota::SpecialStoragePolicy* special_storage_policy, |
quota::QuotaManagerProxy* quota_manager_proxy, |
+ ScopedVector<FileSystemMountPointProvider> additional_providers, |
const base::FilePath& partition_path, |
const FileSystemOptions& options) |
: task_runners_(task_runners.Pass()), |
@@ -72,6 +73,7 @@ FileSystemContext::FileSystemContext( |
partition_path, |
options)), |
isolated_provider_(new IsolatedMountPointProvider(partition_path)), |
+ additional_providers_(additional_providers.Pass()), |
external_mount_points_(external_mount_points), |
partition_path_(partition_path) { |
DCHECK(task_runners_.get()); |
@@ -81,15 +83,28 @@ FileSystemContext::FileSystemContext( |
this, options.is_incognito())); |
} |
+ RegisterMountPointProvider(sandbox_provider_.get()); |
+ RegisterMountPointProvider(isolated_provider_.get()); |
+ |
#if defined(OS_CHROMEOS) |
+ // TODO(kinuko): Move this out of webkit/fileapi layer. |
DCHECK(external_mount_points); |
external_provider_.reset( |
new chromeos::CrosMountPointProvider( |
special_storage_policy, |
external_mount_points, |
ExternalMountPoints::GetSystemInstance())); |
+ RegisterMountPointProvider(external_provider_.get()); |
#endif |
+ for (ScopedVector<FileSystemMountPointProvider>::const_iterator iter = |
+ additional_providers_.begin(); |
+ iter != additional_providers_.end(); ++iter) { |
+ RegisterMountPointProvider(*iter); |
+ } |
+ |
+ // Additional mount points must be added before regular system-wide |
+ // mount points. |
if (external_mount_points) |
url_crackers_.push_back(external_mount_points); |
url_crackers_.push_back(ExternalMountPoints::GetSystemInstance()); |
@@ -151,35 +166,11 @@ FileSystemContext::GetCopyOrMoveFileValidatorFactory( |
FileSystemMountPointProvider* FileSystemContext::GetMountPointProvider( |
FileSystemType type) const { |
- switch (type) { |
- case kFileSystemTypeTemporary: |
- case kFileSystemTypePersistent: |
- case kFileSystemTypeSyncable: |
- return sandbox_provider_.get(); |
- case kFileSystemTypeExternal: |
- case kFileSystemTypeDrive: |
- case kFileSystemTypeRestrictedNativeLocal: |
- return external_provider_.get(); |
- case kFileSystemTypeIsolated: |
- case kFileSystemTypeDragged: |
- case kFileSystemTypeNativeMedia: |
- case kFileSystemTypeDeviceMedia: |
- return isolated_provider_.get(); |
- case kFileSystemTypeNativeLocal: |
- case kFileSystemTypeNativeForPlatformApp: |
-#if defined(OS_CHROMEOS) |
- return external_provider_.get(); |
-#else |
- return isolated_provider_.get(); |
-#endif |
- default: |
- if (provider_map_.find(type) != provider_map_.end()) |
- return provider_map_.find(type)->second; |
- // Fall through. |
- case kFileSystemTypeUnknown: |
- NOTREACHED(); |
- return NULL; |
- } |
+ MountPointProviderMap::const_iterator found = provider_map_.find(type); |
+ if (found != provider_map_.end()) |
+ return found->second; |
+ NOTREACHED() << "Unknown filesystem type: " << type; |
+ return NULL; |
} |
const UpdateObserverList* FileSystemContext::GetUpdateObservers( |
@@ -189,7 +180,7 @@ const UpdateObserverList* FileSystemContext::GetUpdateObservers( |
// TODO(kinuko): Probably GetUpdateObservers() virtual method should be |
// added to FileSystemMountPointProvider interface and be called like |
// other GetFoo() methods do. |
- if (SandboxMountPointProvider::CanHandleType(type)) |
+ if (SandboxMountPointProvider::IsSandboxType(type)) |
return sandbox_provider()->GetUpdateObservers(type); |
if (type != kFileSystemTypeTest) |
return NULL; |
@@ -320,14 +311,6 @@ scoped_ptr<FileStreamWriter> FileSystemContext::CreateFileStreamWriter( |
return mount_point_provider->CreateFileStreamWriter(url, offset, this); |
} |
-void FileSystemContext::RegisterMountPointProvider( |
- FileSystemType type, |
- FileSystemMountPointProvider* provider) { |
- DCHECK(provider); |
- DCHECK(provider_map_.find(type) == provider_map_.end()); |
- provider_map_[type] = provider; |
-} |
- |
void FileSystemContext::SetLocalFileChangeTracker( |
scoped_ptr<sync_file_system::LocalFileChangeTracker> tracker) { |
DCHECK(!change_tracker_.get()); |
@@ -367,8 +350,6 @@ void FileSystemContext::DeleteOnCorrectThread() const { |
task_runners_->io_task_runner()->DeleteSoon(FROM_HERE, this)) { |
return; |
} |
- STLDeleteContainerPairSecondPointers(provider_map_.begin(), |
- provider_map_.end()); |
delete this; |
} |
@@ -408,4 +389,32 @@ FileSystemFileUtil* FileSystemContext::GetFileUtil( |
return mount_point_provider->GetFileUtil(type); |
} |
+void FileSystemContext::RegisterMountPointProvider( |
+ FileSystemMountPointProvider* provider) { |
+ const FileSystemType mount_types[] = { |
+ kFileSystemTypeTemporary, |
+ kFileSystemTypePersistent, |
+ kFileSystemTypeIsolated, |
+ kFileSystemTypeExternal, |
+ }; |
+ // Register mount point providers for public mount types. |
+ for (size_t j = 0; j < ARRAYSIZE_UNSAFE(mount_types); ++j) { |
+ if (provider->CanHandleType(mount_types[j])) { |
+ const bool inserted = provider_map_.insert( |
+ std::make_pair(mount_types[j], provider)).second; |
+ DCHECK(inserted); |
+ } |
+ } |
+ // Register mount point providers for internal types. |
+ for (int t = kFileSystemInternalTypeEnumStart + 1; |
+ t < kFileSystemInternalTypeEnumEnd; ++t) { |
+ FileSystemType type = static_cast<FileSystemType>(t); |
+ if (provider->CanHandleType(type)) { |
+ const bool inserted = provider_map_.insert( |
+ std::make_pair(type, provider)).second; |
+ DCHECK(inserted); |
+ } |
+ } |
+} |
+ |
} // namespace fileapi |