| Index: webkit/fileapi/isolated_context.cc
|
| diff --git a/webkit/fileapi/isolated_context.cc b/webkit/fileapi/isolated_context.cc
|
| index 057d508c6f993f5fa584700f9a903f5fbff125b3..1433e7240b2dcdcc6010b760f2586dbe46a70cd4 100644
|
| --- a/webkit/fileapi/isolated_context.cc
|
| +++ b/webkit/fileapi/isolated_context.cc
|
| @@ -42,7 +42,7 @@ FilePath::StringType GetRegisterNameForPath(const FilePath& path) {
|
| bool IsSinglePathIsolatedFileSystem(FileSystemType type) {
|
| switch (type) {
|
| // As of writing dragged file system is the only filesystem
|
| - // which could have multiple toplevel paths.
|
| + // which could have multiple top-level paths.
|
| case kFileSystemTypeDragged:
|
| return false;
|
|
|
| @@ -57,15 +57,10 @@ bool IsSinglePathIsolatedFileSystem(FileSystemType type) {
|
| return true;
|
| }
|
|
|
| -} // namespace
|
| -
|
| static base::LazyInstance<IsolatedContext>::Leaky g_isolated_context =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
| -IsolatedContext::FileInfo::FileInfo() {}
|
| -IsolatedContext::FileInfo::FileInfo(
|
| - const std::string& name, const FilePath& path)
|
| - : name(name), path(path) {}
|
| +} // namespace
|
|
|
| IsolatedContext::FileInfoSet::FileInfoSet() {}
|
| IsolatedContext::FileInfoSet::~FileInfoSet() {}
|
| @@ -78,7 +73,8 @@ bool IsolatedContext::FileInfoSet::AddPath(
|
| FilePath::StringType name = GetRegisterNameForPath(path);
|
| std::string utf8name = FilePath(name).AsUTF8Unsafe();
|
| FilePath normalized_path = path.NormalizePathSeparators();
|
| - bool inserted = fileset_.insert(FileInfo(utf8name, normalized_path)).second;
|
| + bool inserted =
|
| + fileset_.insert(MountPointInfo(utf8name, normalized_path)).second;
|
| if (!inserted) {
|
| int suffix = 1;
|
| std::string basepart = FilePath(name).RemoveExtension().AsUTF8Unsafe();
|
| @@ -87,7 +83,8 @@ bool IsolatedContext::FileInfoSet::AddPath(
|
| utf8name = base::StringPrintf("%s (%d)", basepart.c_str(), suffix++);
|
| if (!ext.empty())
|
| utf8name.append(ext);
|
| - inserted = fileset_.insert(FileInfo(utf8name, normalized_path)).second;
|
| + inserted =
|
| + fileset_.insert(MountPointInfo(utf8name, normalized_path)).second;
|
| }
|
| }
|
| if (registered_name)
|
| @@ -100,34 +97,29 @@ bool IsolatedContext::FileInfoSet::AddPathWithName(
|
| // The given path should not contain any '..' and should be absolute.
|
| if (path.ReferencesParent() || !path.IsAbsolute())
|
| return false;
|
| - return fileset_.insert(FileInfo(name, path.NormalizePathSeparators())).second;
|
| + return fileset_.insert(
|
| + MountPointInfo(name, path.NormalizePathSeparators())).second;
|
| }
|
|
|
| //--------------------------------------------------------------------------
|
|
|
| class IsolatedContext::Instance {
|
| public:
|
| - typedef FileSystemType MountType;
|
| -
|
| // For a single-path isolated file system, which could be registered by
|
| // IsolatedContext::RegisterFileSystemForPath().
|
| // Most of isolated file system contexts should be of this type.
|
| - Instance(FileSystemType type, const FileInfo& file_info);
|
| + Instance(FileSystemType type, const MountPointInfo& file_info);
|
|
|
| // For a multi-paths isolated file system. As of writing only file system
|
| // type which could have multi-paths is Dragged file system, and
|
| // could be registered by IsolatedContext::RegisterDraggedFileSystem().
|
| - Instance(FileSystemType type, const std::set<FileInfo>& files);
|
| -
|
| - // For a single-path external file system.
|
| - Instance(FileSystemType type, const FilePath& path);
|
| + Instance(FileSystemType type, const std::set<MountPointInfo>& files);
|
|
|
| ~Instance();
|
|
|
| - MountType mount_type() const { return mount_type_; }
|
| FileSystemType type() const { return type_; }
|
| - const FileInfo& file_info() const { return file_info_; }
|
| - const std::set<FileInfo>& files() const { return files_; }
|
| + const MountPointInfo& file_info() const { return file_info_; }
|
| + const std::set<MountPointInfo>& files() const { return files_; }
|
| int ref_counts() const { return ref_counts_; }
|
|
|
| void AddRef() { ++ref_counts_; }
|
| @@ -139,14 +131,13 @@ class IsolatedContext::Instance {
|
| bool IsSinglePathInstance() const;
|
|
|
| private:
|
| - const MountType mount_type_;
|
| const FileSystemType type_;
|
|
|
| // For single-path instance.
|
| - const FileInfo file_info_;
|
| + const MountPointInfo file_info_;
|
|
|
| // For multiple-path instance (e.g. dragged file system).
|
| - const std::set<FileInfo> files_;
|
| + const std::set<MountPointInfo> files_;
|
|
|
| // Reference counts. Note that an isolated filesystem is created with ref==0
|
| // and will get deleted when the ref count reaches <=0.
|
| @@ -156,32 +147,21 @@ class IsolatedContext::Instance {
|
| };
|
|
|
| IsolatedContext::Instance::Instance(FileSystemType type,
|
| - const FileInfo& file_info)
|
| - : mount_type_(kFileSystemTypeIsolated),
|
| - type_(type),
|
| + const MountPointInfo& file_info)
|
| + : type_(type),
|
| file_info_(file_info),
|
| ref_counts_(0) {
|
| DCHECK(IsSinglePathIsolatedFileSystem(type_));
|
| }
|
|
|
| IsolatedContext::Instance::Instance(FileSystemType type,
|
| - const std::set<FileInfo>& files)
|
| - : mount_type_(kFileSystemTypeIsolated),
|
| - type_(type),
|
| + const std::set<MountPointInfo>& files)
|
| + : type_(type),
|
| files_(files),
|
| ref_counts_(0) {
|
| DCHECK(!IsSinglePathIsolatedFileSystem(type_));
|
| }
|
|
|
| -IsolatedContext::Instance::Instance(FileSystemType type,
|
| - const FilePath& path)
|
| - : mount_type_(kFileSystemTypeExternal),
|
| - type_(type),
|
| - file_info_(FileInfo("", path)),
|
| - ref_counts_(0) {
|
| - DCHECK(IsSinglePathIsolatedFileSystem(type_));
|
| -}
|
| -
|
| IsolatedContext::Instance::~Instance() {}
|
|
|
| bool IsolatedContext::Instance::ResolvePathForName(const std::string& name,
|
| @@ -190,8 +170,8 @@ bool IsolatedContext::Instance::ResolvePathForName(const std::string& name,
|
| *path = file_info_.path;
|
| return file_info_.name == name;
|
| }
|
| - std::set<FileInfo>::const_iterator found = files_.find(
|
| - FileInfo(name, FilePath()));
|
| + std::set<MountPointInfo>::const_iterator found = files_.find(
|
| + MountPointInfo(name, FilePath()));
|
| if (found == files_.end())
|
| return false;
|
| *path = found->path;
|
| @@ -240,83 +220,28 @@ std::string IsolatedContext::RegisterFileSystemForPath(
|
|
|
| base::AutoLock locker(lock_);
|
| std::string filesystem_id = GetNewFileSystemId();
|
| - instance_map_[filesystem_id] = new Instance(type, FileInfo(name, path));
|
| + instance_map_[filesystem_id] = new Instance(type, MountPointInfo(name, path));
|
| path_to_id_map_[path].insert(filesystem_id);
|
| return filesystem_id;
|
| }
|
|
|
| -bool IsolatedContext::RegisterExternalFileSystem(const std::string& mount_name,
|
| - FileSystemType type,
|
| - const FilePath& path) {
|
| - base::AutoLock locker(lock_);
|
| - IDToInstance::iterator found = instance_map_.find(mount_name);
|
| - if (found != instance_map_.end())
|
| - return false;
|
| - instance_map_[mount_name] = new Instance(type, path);
|
| - path_to_id_map_[path].insert(mount_name);
|
| - return true;
|
| -}
|
| -
|
| -std::vector<IsolatedContext::FileInfo>
|
| -IsolatedContext::GetExternalMountPoints() const {
|
| - base::AutoLock locker(lock_);
|
| - std::vector<FileInfo> files;
|
| - for (IDToInstance::const_iterator iter = instance_map_.begin();
|
| - iter != instance_map_.end();
|
| - ++iter) {
|
| - if (iter->second->mount_type() == kFileSystemTypeExternal)
|
| - files.push_back(FileInfo(iter->first, iter->second->file_info().path));
|
| - }
|
| - return files;
|
| -}
|
| -
|
| bool IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) {
|
| base::AutoLock locker(lock_);
|
| return UnregisterFileSystem(filesystem_id);
|
| }
|
|
|
| -void IsolatedContext::RevokeFileSystemByPath(const FilePath& path_in) {
|
| - base::AutoLock locker(lock_);
|
| - FilePath path(path_in.NormalizePathSeparators());
|
| - PathToID::iterator ids_iter = path_to_id_map_.find(path);
|
| - if (ids_iter == path_to_id_map_.end())
|
| - return;
|
| - std::set<std::string>& ids = ids_iter->second;
|
| - for (std::set<std::string>::iterator iter = ids.begin();
|
| - iter != ids.end(); ++iter) {
|
| - IDToInstance::iterator found = instance_map_.find(*iter);
|
| - if (found != instance_map_.end()) {
|
| - delete found->second;
|
| - instance_map_.erase(found);
|
| - }
|
| - }
|
| - path_to_id_map_.erase(ids_iter);
|
| -}
|
| -
|
| -void IsolatedContext::AddReference(const std::string& filesystem_id) {
|
| - base::AutoLock locker(lock_);
|
| - DCHECK(instance_map_.find(filesystem_id) != instance_map_.end());
|
| - instance_map_[filesystem_id]->AddRef();
|
| -}
|
| -
|
| -void IsolatedContext::RemoveReference(const std::string& filesystem_id) {
|
| +bool IsolatedContext::GetRegisteredPath(
|
| + const std::string& filesystem_id, FilePath* path) const {
|
| + DCHECK(path);
|
| base::AutoLock locker(lock_);
|
| - // This could get called for non-existent filesystem if it has been
|
| - // already deleted by RevokeFileSystemByPath.
|
| - IDToInstance::iterator found = instance_map_.find(filesystem_id);
|
| - if (found == instance_map_.end())
|
| - return;
|
| - Instance* instance = found->second;
|
| - DCHECK_GT(instance->ref_counts(), 0);
|
| - instance->RemoveRef();
|
| - if (instance->ref_counts() == 0 &&
|
| - instance->mount_type() != kFileSystemTypeExternal) {
|
| - bool deleted = UnregisterFileSystem(filesystem_id);
|
| - DCHECK(deleted);
|
| - }
|
| + IDToInstance::const_iterator found = instance_map_.find(filesystem_id);
|
| + if (found == instance_map_.end() || !found->second->IsSinglePathInstance())
|
| + return false;
|
| + *path = found->second->file_info().path;
|
| + return true;
|
| }
|
|
|
| -bool IsolatedContext::CrackIsolatedPath(const FilePath& virtual_path,
|
| +bool IsolatedContext::CrackVirtualPath(const FilePath& virtual_path,
|
| std::string* id_or_name,
|
| FileSystemType* type,
|
| FilePath* path) const {
|
| @@ -348,26 +273,17 @@ bool IsolatedContext::CrackIsolatedPath(const FilePath& virtual_path,
|
| const Instance* instance = found_instance->second;
|
| if (type)
|
| *type = instance->type();
|
| - switch (instance->mount_type()) {
|
| - case kFileSystemTypeIsolated: {
|
| - if (component_iter == components.end()) {
|
| - // The virtual root case.
|
| - path->clear();
|
| - return true;
|
| - }
|
| - // *component_iter should be a name of the registered path.
|
| - std::string name = FilePath(*component_iter++).AsUTF8Unsafe();
|
| - if (!instance->ResolvePathForName(name, &cracked_path))
|
| - return false;
|
| - break;
|
| - }
|
| - case kFileSystemTypeExternal:
|
| - cracked_path = instance->file_info().path;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| +
|
| + if (component_iter == components.end()) {
|
| + // The virtual root case.
|
| + path->clear();
|
| + return true;
|
| }
|
| +
|
| + // *component_iter should be a name of the registered path.
|
| + std::string name = FilePath(*component_iter++).AsUTF8Unsafe();
|
| + if (!instance->ResolvePathForName(name, &cracked_path))
|
| + return false;
|
| }
|
|
|
| for (; component_iter != components.end(); ++component_iter)
|
| @@ -376,8 +292,49 @@ bool IsolatedContext::CrackIsolatedPath(const FilePath& virtual_path,
|
| return true;
|
| }
|
|
|
| +void IsolatedContext::RevokeFileSystemByPath(const FilePath& path_in) {
|
| + base::AutoLock locker(lock_);
|
| + FilePath path(path_in.NormalizePathSeparators());
|
| + PathToID::iterator ids_iter = path_to_id_map_.find(path);
|
| + if (ids_iter == path_to_id_map_.end())
|
| + return;
|
| + std::set<std::string>& ids = ids_iter->second;
|
| + for (std::set<std::string>::iterator iter = ids.begin();
|
| + iter != ids.end(); ++iter) {
|
| + IDToInstance::iterator found = instance_map_.find(*iter);
|
| + if (found != instance_map_.end()) {
|
| + delete found->second;
|
| + instance_map_.erase(found);
|
| + }
|
| + }
|
| + path_to_id_map_.erase(ids_iter);
|
| +}
|
| +
|
| +void IsolatedContext::AddReference(const std::string& filesystem_id) {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(instance_map_.find(filesystem_id) != instance_map_.end());
|
| + instance_map_[filesystem_id]->AddRef();
|
| +}
|
| +
|
| +void IsolatedContext::RemoveReference(const std::string& filesystem_id) {
|
| + base::AutoLock locker(lock_);
|
| + // This could get called for non-existent filesystem if it has been
|
| + // already deleted by RevokeFileSystemByPath.
|
| + IDToInstance::iterator found = instance_map_.find(filesystem_id);
|
| + if (found == instance_map_.end())
|
| + return;
|
| + Instance* instance = found->second;
|
| + DCHECK_GT(instance->ref_counts(), 0);
|
| + instance->RemoveRef();
|
| + if (instance->ref_counts() == 0) {
|
| + bool deleted = UnregisterFileSystem(filesystem_id);
|
| + DCHECK(deleted);
|
| + }
|
| +}
|
| +
|
| bool IsolatedContext::GetDraggedFileInfo(
|
| - const std::string& filesystem_id, std::vector<FileInfo>* files) const {
|
| + const std::string& filesystem_id,
|
| + std::vector<MountPointInfo>* files) const {
|
| DCHECK(files);
|
| base::AutoLock locker(lock_);
|
| IDToInstance::const_iterator found = instance_map_.find(filesystem_id);
|
| @@ -389,17 +346,6 @@ bool IsolatedContext::GetDraggedFileInfo(
|
| return true;
|
| }
|
|
|
| -bool IsolatedContext::GetRegisteredPath(
|
| - const std::string& filesystem_id, FilePath* path) const {
|
| - DCHECK(path);
|
| - base::AutoLock locker(lock_);
|
| - IDToInstance::const_iterator found = instance_map_.find(filesystem_id);
|
| - if (found == instance_map_.end() || !found->second->IsSinglePathInstance())
|
| - return false;
|
| - *path = found->second->file_info().path;
|
| - return true;
|
| -}
|
| -
|
| FilePath IsolatedContext::CreateVirtualRootPath(
|
| const std::string& filesystem_id) const {
|
| return FilePath().AppendASCII(filesystem_id);
|
| @@ -444,21 +390,4 @@ std::string IsolatedContext::GetNewFileSystemId() const {
|
| return id;
|
| }
|
|
|
| -ScopedExternalFileSystem::ScopedExternalFileSystem(
|
| - const std::string& mount_name,
|
| - FileSystemType type,
|
| - const FilePath& path)
|
| - : mount_name_(mount_name) {
|
| - IsolatedContext::GetInstance()->RegisterExternalFileSystem(
|
| - mount_name, type, path);
|
| -}
|
| -
|
| -FilePath ScopedExternalFileSystem::GetVirtualRootPath() const {
|
| - return IsolatedContext::GetInstance()->CreateVirtualRootPath(mount_name_);
|
| -}
|
| -
|
| -ScopedExternalFileSystem::~ScopedExternalFileSystem() {
|
| - IsolatedContext::GetInstance()->RevokeFileSystem(mount_name_);
|
| -}
|
| -
|
| } // namespace fileapi
|
|
|