Index: webkit/fileapi/isolated_context.cc |
diff --git a/webkit/fileapi/isolated_context.cc b/webkit/fileapi/isolated_context.cc |
index 8eac660bdf5582fda8fa2f1b54c9fbf8277c645d..44b3ce558f9dd6d53e13ccd692fbe0e0bdbe9cde 100644 |
--- a/webkit/fileapi/isolated_context.cc |
+++ b/webkit/fileapi/isolated_context.cc |
@@ -90,25 +90,28 @@ bool IsolatedContext::FileInfoSet::AddPathWithName( |
IsolatedContext::Instance::Instance(FileSystemType type, |
const FileInfo& file_info) |
: type_(type), |
+ instance_type_(kSinglePathInstance), |
file_info_(file_info), |
ref_counts_(0) {} |
-IsolatedContext::Instance::Instance(const std::set<FileInfo>& dragged_files) |
- : type_(kFileSystemTypeDragged), |
- dragged_files_(dragged_files), |
+IsolatedContext::Instance::Instance(FileSystemType type, |
+ const std::set<FileInfo>& files) |
+ : type_(type), |
+ instance_type_(kMultiplePathInstance), |
+ files_(files), |
ref_counts_(0) {} |
IsolatedContext::Instance::~Instance() {} |
bool IsolatedContext::Instance::ResolvePathForName(const std::string& name, |
- FilePath* path) { |
- if (type_ != kFileSystemTypeDragged) { |
+ FilePath* path) const { |
+ if (instance_type_ == kSinglePathInstance) { |
*path = file_info_.path; |
return file_info_.name == name; |
} |
- std::set<FileInfo>::const_iterator found = dragged_files_.find( |
+ std::set<FileInfo>::const_iterator found = files_.find( |
FileInfo(name, FilePath())); |
- if (found == dragged_files_.end()) |
+ if (found == files_.end()) |
return false; |
*path = found->path; |
return true; |
@@ -125,7 +128,8 @@ std::string IsolatedContext::RegisterDraggedFileSystem( |
const FileInfoSet& files) { |
base::AutoLock locker(lock_); |
std::string filesystem_id = GetNewFileSystemId(); |
- instance_map_[filesystem_id] = new Instance(files.fileset()); |
+ instance_map_[filesystem_id] = new Instance( |
+ kFileSystemTypeDragged, files.fileset()); |
return filesystem_id; |
} |
@@ -146,16 +150,25 @@ std::string IsolatedContext::RegisterFileSystemForPath( |
base::AutoLock locker(lock_); |
std::string filesystem_id = GetNewFileSystemId(); |
instance_map_[filesystem_id] = new Instance(type, FileInfo(name, path)); |
+ path_to_id_map_[path].insert(filesystem_id); |
return filesystem_id; |
} |
-void IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) { |
+void IsolatedContext::RevokeFileSystemByPath(const FilePath& path) { |
base::AutoLock locker(lock_); |
- IDToInstance::iterator found = instance_map_.find(filesystem_id); |
- if (found == instance_map_.end()) |
+ PathToID::iterator ids_iter = path_to_id_map_.find(path); |
+ if (ids_iter == path_to_id_map_.end()) |
return; |
- delete found->second; |
- instance_map_.erase(found); |
+ 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) { |
@@ -167,14 +180,23 @@ void IsolatedContext::AddReference(const std::string& 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 RevokeFileSystem. |
+ // already deleted by RevokeFileSystemByPath. |
IDToInstance::iterator found = instance_map_.find(filesystem_id); |
if (found == instance_map_.end()) |
return; |
- DCHECK(found->second->ref_counts() > 0); |
- found->second->RemoveRef(); |
- if (found->second->ref_counts() == 0) { |
- delete found->second; |
+ Instance* instance = found->second; |
+ 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); |
} |
} |
@@ -229,8 +251,8 @@ bool IsolatedContext::GetDraggedFileInfo( |
if (found == instance_map_.end() || |
found->second->type() != kFileSystemTypeDragged) |
return false; |
- files->assign(found->second->dragged_files().begin(), |
- found->second->dragged_files().end()); |
+ files->assign(found->second->files().begin(), |
+ found->second->files().end()); |
return true; |
} |
@@ -239,8 +261,7 @@ bool IsolatedContext::GetRegisteredPath( |
DCHECK(path); |
base::AutoLock locker(lock_); |
IDToInstance::const_iterator found = instance_map_.find(filesystem_id); |
- if (found == instance_map_.end() || |
- found->second->type() == kFileSystemTypeDragged) |
+ if (found == instance_map_.end() || !found->second->IsSinglePathInstance()) |
return false; |
*path = found->second->file_info().path; |
return true; |