Chromium Code Reviews| Index: webkit/fileapi/isolated_context.cc |
| diff --git a/webkit/fileapi/isolated_context.cc b/webkit/fileapi/isolated_context.cc |
| index 957680d06f3b7701d55e88a25a31b6399bc8540a..6398e42ea336db68c8c0b0898a7f66d41eafc05d 100644 |
| --- a/webkit/fileapi/isolated_context.cc |
| +++ b/webkit/fileapi/isolated_context.cc |
| @@ -166,8 +166,9 @@ std::string IsolatedContext::RegisterDraggedFileSystem( |
| std::string IsolatedContext::RegisterFileSystemForPath( |
| FileSystemType type, |
| - const FilePath& path, |
| + const FilePath& path_in, |
| std::string* register_name) { |
| + FilePath path(path_in.NormalizePathSeparators()); |
| DCHECK(!path.ReferencesParent() && path.IsAbsolute()); |
| std::string name; |
| if (register_name && !register_name->empty()) { |
| @@ -185,8 +186,14 @@ std::string IsolatedContext::RegisterFileSystemForPath( |
| return filesystem_id; |
| } |
| -void IsolatedContext::RevokeFileSystemByPath(const FilePath& path) { |
| +bool IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) { |
| base::AutoLock locker(lock_); |
| + return UnregisterFileSystem(filesystem_id); |
|
kinuko
2012/08/13 09:20:26
Changed the mysterious argument name to our usual
|
| +} |
| + |
| +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; |
| @@ -219,16 +226,8 @@ void IsolatedContext::RemoveReference(const std::string& filesystem_id) { |
| DCHECK(instance->ref_counts() > 0); |
| instance->RemoveRef(); |
| if (instance->ref_counts() == 0) { |
| - if (instance->IsSinglePathInstance()) { |
| - PathToID::iterator ids_iter = path_to_id_map_.find( |
| - instance->file_info().path); |
| - DCHECK(ids_iter != path_to_id_map_.end()); |
| - ids_iter->second.erase(filesystem_id); |
| - if (ids_iter->second.empty()) |
| - path_to_id_map_.erase(ids_iter); |
| - } |
| - delete instance; |
| - instance_map_.erase(found); |
| + bool deleted = UnregisterFileSystem(filesystem_id); |
| + DCHECK(deleted); |
| } |
| } |
| @@ -268,6 +267,7 @@ bool IsolatedContext::CrackIsolatedPath(const FilePath& virtual_path, |
| std::string name = FilePath(components[1]).AsUTF8Unsafe(); |
| if (!found_instance->second->ResolvePathForName(name, &cracked_path)) |
| return false; |
| + |
| for (size_t i = 2; i < components.size(); ++i) |
| cracked_path = cracked_path.Append(components[i]); |
| *path = cracked_path; |
| @@ -311,8 +311,28 @@ IsolatedContext::~IsolatedContext() { |
| instance_map_.end()); |
| } |
| +bool IsolatedContext::UnregisterFileSystem(const std::string& filesystem_id) { |
| + lock_.AssertAcquired(); |
| + IDToInstance::iterator found = instance_map_.find(filesystem_id); |
| + if (found == instance_map_.end()) |
| + return false; |
| + Instance* instance = found->second; |
| + if (instance->IsSinglePathInstance()) { |
| + PathToID::iterator ids_iter = path_to_id_map_.find( |
| + instance->file_info().path); |
| + DCHECK(ids_iter != path_to_id_map_.end()); |
| + ids_iter->second.erase(filesystem_id); |
| + if (ids_iter->second.empty()) |
| + path_to_id_map_.erase(ids_iter); |
| + } |
| + delete found->second; |
| + instance_map_.erase(found); |
| + return true; |
| +} |
| + |
| std::string IsolatedContext::GetNewFileSystemId() const { |
| // Returns an arbitrary random string which must be unique in the map. |
| + lock_.AssertAcquired(); |
| uint32 random_data[4]; |
| std::string id; |
| do { |