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]; |