Chromium Code Reviews| Index: webkit/fileapi/isolated_context.cc |
| diff --git a/webkit/fileapi/isolated_context.cc b/webkit/fileapi/isolated_context.cc |
| index e8b52ae83f0ae9bc77904e2934878aac00714bde..a7386fb0e810d55f4c3f6bfe88c9bef5f90013b9 100644 |
| --- a/webkit/fileapi/isolated_context.cc |
| +++ b/webkit/fileapi/isolated_context.cc |
| @@ -29,10 +29,8 @@ std::string IsolatedContext::RegisterIsolatedFileSystem( |
| PathMap toplevels; |
| for (std::set<FilePath>::const_iterator iter = files.begin(); |
| iter != files.end(); ++iter) { |
| - // If the given path contains any '..' or is not an absolute path, |
| - // return an empty (invalid) id. |
| - if (iter->ReferencesParent() || !iter->IsAbsolute()) |
| - return std::string(); |
| + // The given path should not contain any '..' and must be an absolute path. |
| + DCHECK(!iter->ReferencesParent() && iter->IsAbsolute()); |
|
tzik
2012/06/25 10:37:54
As we chatted, platform_app_launcher seems to pass
|
| // Register the basename -> fullpath map. (We only expose the basename |
| // part to the user scripts) |
| @@ -43,15 +41,34 @@ std::string IsolatedContext::RegisterIsolatedFileSystem( |
| toplevels.insert(std::make_pair(basename, fullpath)); |
| } |
| toplevel_map_[filesystem_id] = toplevels; |
| + |
| + // Each file system is created with refcount == 0. |
| + ref_counts_[filesystem_id] = 0; |
| + |
| return filesystem_id; |
| } |
| -// Revoke any registered drag context for the child_id. |
| void IsolatedContext::RevokeIsolatedFileSystem( |
| const std::string& filesystem_id) { |
| base::AutoLock locker(lock_); |
| - toplevel_map_.erase(filesystem_id); |
| - writable_ids_.erase(filesystem_id); |
| + RevokeWithoutLocking(filesystem_id); |
| +} |
| + |
| +void IsolatedContext::AddReference(const std::string& filesystem_id) { |
| + base::AutoLock locker(lock_); |
| + DCHECK(ref_counts_.find(filesystem_id) != ref_counts_.end()); |
| + ref_counts_[filesystem_id]++; |
| +} |
| + |
| +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 RevokeIsolatedFileSystem. |
| + if (ref_counts_.find(filesystem_id) == ref_counts_.end()) |
| + return; |
| + DCHECK(ref_counts_[filesystem_id] > 0); |
| + if (--ref_counts_[filesystem_id] == 0) |
| + RevokeWithoutLocking(filesystem_id); |
| } |
| bool IsolatedContext::CrackIsolatedPath(const FilePath& virtual_path, |
| @@ -147,6 +164,13 @@ IsolatedContext::IsolatedContext() { |
| IsolatedContext::~IsolatedContext() { |
| } |
| +void IsolatedContext::RevokeWithoutLocking( |
| + const std::string& filesystem_id) { |
| + toplevel_map_.erase(filesystem_id); |
| + writable_ids_.erase(filesystem_id); |
| + ref_counts_.erase(filesystem_id); |
| +} |
| + |
| std::string IsolatedContext::GetNewFileSystemId() const { |
| // Returns an arbitrary random string which must be unique in the map. |
| uint32 random_data[4]; |