Index: webkit/fileapi/external_mount_points.cc |
diff --git a/webkit/fileapi/external_mount_points.cc b/webkit/fileapi/external_mount_points.cc |
index 5c84c1bb248e49456e94b1d85b2fae022b7e4d97..b53c34b859485fcbe67ba7ab4a7ec46023f02c9a 100644 |
--- a/webkit/fileapi/external_mount_points.cc |
+++ b/webkit/fileapi/external_mount_points.cc |
@@ -244,12 +244,20 @@ FileSystemURL ExternalMountPoints::CreateCrackedFileSystemURL( |
mount_name, cracked_type, cracked_path); |
} |
-RemoteFileSystemProxyInterface* ExternalMountPoints::GetRemoteFileSystemProxy( |
- const std::string& mount_name) const { |
+RemoteFileSystemProxyInterface* |
+ExternalMountPoints::GetRemoteFileSystemProxyForPath( |
+ const base::FilePath& full_path) const { |
base::AutoLock locker(lock_); |
- NameToInstance::const_iterator found = instance_map_.find(mount_name); |
+ |
+ std::string mount_point; |
+ if (!GetMountPointForPath(full_path, &mount_point, NULL)) |
+ return NULL; |
+ |
+ // Get mount point instance. |
+ NameToInstance::const_iterator found = instance_map_.find(mount_point); |
if (found == instance_map_.end()) |
return NULL; |
+ |
return found->second->remote_proxy(); |
} |
@@ -263,22 +271,21 @@ void ExternalMountPoints::AddMountPointInfosTo( |
} |
} |
-bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path_in, |
+bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path, |
base::FilePath* virtual_path) { |
DCHECK(virtual_path); |
base::AutoLock locker(lock_); |
- base::FilePath path = NormalizeFilePath(path_in); |
- std::map<base::FilePath, std::string>::reverse_iterator iter( |
- path_to_name_map_.upper_bound(path)); |
- if (iter == path_to_name_map_.rend()) |
+ std::string mount_point_name; |
+ base::FilePath mount_point_root; |
+ if (!GetMountPointForPath(path, &mount_point_name, &mount_point_root)) |
return false; |
- *virtual_path = CreateVirtualRootPath(iter->second); |
- if (iter->first == path) |
+ *virtual_path = CreateVirtualRootPath(mount_point_name); |
+ if (mount_point_root == path) |
return true; |
- return iter->first.AppendRelativePath(path, virtual_path); |
+ return mount_point_root.AppendRelativePath(path, virtual_path); |
} |
base::FilePath ExternalMountPoints::CreateVirtualRootPath( |
@@ -332,6 +339,31 @@ bool ExternalMountPoints::ValidateNewMountPoint(const std::string& mount_name, |
!path.IsParent(potential_child->first); |
} |
+bool ExternalMountPoints::GetMountPointForPath( |
+ const base::FilePath& path, |
+ std::string* mount_point_name, |
+ base::FilePath* mount_point_root) const { |
+ DCHECK(mount_point_name); |
+ |
+ // Get mount point the path belongs to. It is the path whose value is smaller |
+ // than normalized path, but also parents the normalized_path. Note that |
+ // ExternalMountPoints are constrained so there cannot be a root path x for |
+ // which the following holds: root_path(path) < x < path. |
+ base::FilePath normalized_path = NormalizeFilePath(path); |
+ std::map<base::FilePath, std::string>::const_reverse_iterator iter( |
+ path_to_name_map_.upper_bound(normalized_path)); |
+ if (iter == path_to_name_map_.rend() || |
+ (iter->first != normalized_path && |
+ !iter->first.IsParent(normalized_path))) { |
+ return false; |
+ } |
+ |
+ *mount_point_name = iter->second; |
+ if (mount_point_root) |
+ *mount_point_root = iter->first; |
+ return true; |
+} |
+ |
ScopedExternalFileSystem::ScopedExternalFileSystem( |
const std::string& mount_name, |
FileSystemType type, |