| Index: webkit/browser/fileapi/external_mount_points.cc
|
| diff --git a/webkit/browser/fileapi/external_mount_points.cc b/webkit/browser/fileapi/external_mount_points.cc
|
| deleted file mode 100644
|
| index 29ea8aeb50219a3380660a0269e84443a0676923..0000000000000000000000000000000000000000
|
| --- a/webkit/browser/fileapi/external_mount_points.cc
|
| +++ /dev/null
|
| @@ -1,357 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "webkit/browser/fileapi/external_mount_points.h"
|
| -
|
| -#include "base/files/file_path.h"
|
| -#include "base/lazy_instance.h"
|
| -#include "base/path_service.h"
|
| -#include "base/stl_util.h"
|
| -#include "webkit/browser/fileapi/file_system_url.h"
|
| -
|
| -namespace {
|
| -
|
| -// Normalizes file path so it has normalized separators and ends with exactly
|
| -// one separator. Paths have to be normalized this way for use in
|
| -// GetVirtualPath method. Separators cannot be completely stripped, or
|
| -// GetVirtualPath could not working in some edge cases.
|
| -// For example, /a/b/c(1)/d would be erroneously resolved as c/d if the
|
| -// following mount points were registered: "/a/b/c", "/a/b/c(1)". (Note:
|
| -// "/a/b/c" < "/a/b/c(1)" < "/a/b/c/").
|
| -base::FilePath NormalizeFilePath(const base::FilePath& path) {
|
| - if (path.empty())
|
| - return path;
|
| -
|
| - base::FilePath::StringType path_str = path.StripTrailingSeparators().value();
|
| - if (!base::FilePath::IsSeparator(path_str[path_str.length() - 1]))
|
| - path_str.append(FILE_PATH_LITERAL("/"));
|
| -
|
| - return base::FilePath(path_str).NormalizePathSeparators();
|
| -}
|
| -
|
| -bool IsOverlappingMountPathForbidden(storage::FileSystemType type) {
|
| - return type != storage::kFileSystemTypeNativeMedia &&
|
| - type != storage::kFileSystemTypeDeviceMedia;
|
| -}
|
| -
|
| -// Wrapper around ref-counted ExternalMountPoints that will be used to lazily
|
| -// create and initialize LazyInstance system ExternalMountPoints.
|
| -class SystemMountPointsLazyWrapper {
|
| - public:
|
| - SystemMountPointsLazyWrapper()
|
| - : system_mount_points_(storage::ExternalMountPoints::CreateRefCounted()) {
|
| - }
|
| -
|
| - ~SystemMountPointsLazyWrapper() {}
|
| -
|
| - storage::ExternalMountPoints* get() { return system_mount_points_.get(); }
|
| -
|
| - private:
|
| - scoped_refptr<storage::ExternalMountPoints> system_mount_points_;
|
| -};
|
| -
|
| -base::LazyInstance<SystemMountPointsLazyWrapper>::Leaky
|
| - g_external_mount_points = LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -} // namespace
|
| -
|
| -namespace storage {
|
| -
|
| -class ExternalMountPoints::Instance {
|
| - public:
|
| - Instance(FileSystemType type,
|
| - const base::FilePath& path,
|
| - const FileSystemMountOption& mount_option)
|
| - : type_(type),
|
| - path_(path.StripTrailingSeparators()),
|
| - mount_option_(mount_option) {}
|
| - ~Instance() {}
|
| -
|
| - FileSystemType type() const { return type_; }
|
| - const base::FilePath& path() const { return path_; }
|
| - const FileSystemMountOption& mount_option() const { return mount_option_; }
|
| -
|
| - private:
|
| - const FileSystemType type_;
|
| - const base::FilePath path_;
|
| - const FileSystemMountOption mount_option_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Instance);
|
| -};
|
| -
|
| -//--------------------------------------------------------------------------
|
| -
|
| -// static
|
| -ExternalMountPoints* ExternalMountPoints::GetSystemInstance() {
|
| - return g_external_mount_points.Pointer()->get();
|
| -}
|
| -
|
| -// static
|
| -scoped_refptr<ExternalMountPoints> ExternalMountPoints::CreateRefCounted() {
|
| - return new ExternalMountPoints();
|
| -}
|
| -
|
| -bool ExternalMountPoints::RegisterFileSystem(
|
| - const std::string& mount_name,
|
| - FileSystemType type,
|
| - const FileSystemMountOption& mount_option,
|
| - const base::FilePath& path_in) {
|
| - // COPY_SYNC_OPTION_SYNC is only applicable to native local file system.
|
| - DCHECK(type == kFileSystemTypeNativeLocal ||
|
| - mount_option.copy_sync_option() != COPY_SYNC_OPTION_SYNC);
|
| -
|
| - base::AutoLock locker(lock_);
|
| -
|
| - base::FilePath path = NormalizeFilePath(path_in);
|
| - if (!ValidateNewMountPoint(mount_name, type, path))
|
| - return false;
|
| -
|
| - instance_map_[mount_name] = new Instance(type, path, mount_option);
|
| - if (!path.empty() && IsOverlappingMountPathForbidden(type))
|
| - path_to_name_map_.insert(std::make_pair(path, mount_name));
|
| - return true;
|
| -}
|
| -
|
| -bool ExternalMountPoints::HandlesFileSystemMountType(
|
| - FileSystemType type) const {
|
| - return type == kFileSystemTypeExternal ||
|
| - type == kFileSystemTypeNativeForPlatformApp;
|
| -}
|
| -
|
| -bool ExternalMountPoints::RevokeFileSystem(const std::string& mount_name) {
|
| - base::AutoLock locker(lock_);
|
| - NameToInstance::iterator found = instance_map_.find(mount_name);
|
| - if (found == instance_map_.end())
|
| - return false;
|
| - Instance* instance = found->second;
|
| - if (IsOverlappingMountPathForbidden(instance->type()))
|
| - path_to_name_map_.erase(NormalizeFilePath(instance->path()));
|
| - delete found->second;
|
| - instance_map_.erase(found);
|
| - return true;
|
| -}
|
| -
|
| -bool ExternalMountPoints::GetRegisteredPath(
|
| - const std::string& filesystem_id, base::FilePath* path) const {
|
| - DCHECK(path);
|
| - base::AutoLock locker(lock_);
|
| - NameToInstance::const_iterator found = instance_map_.find(filesystem_id);
|
| - if (found == instance_map_.end())
|
| - return false;
|
| - *path = found->second->path();
|
| - return true;
|
| -}
|
| -
|
| -bool ExternalMountPoints::CrackVirtualPath(
|
| - const base::FilePath& virtual_path,
|
| - std::string* mount_name,
|
| - FileSystemType* type,
|
| - std::string* cracked_id,
|
| - base::FilePath* path,
|
| - FileSystemMountOption* mount_option) const {
|
| - DCHECK(mount_name);
|
| - DCHECK(path);
|
| -
|
| - // The path should not contain any '..' references.
|
| - if (virtual_path.ReferencesParent())
|
| - return false;
|
| -
|
| - // The virtual_path should comprise of <mount_name> and <relative_path> parts.
|
| - std::vector<base::FilePath::StringType> components;
|
| - virtual_path.GetComponents(&components);
|
| - if (components.size() < 1)
|
| - return false;
|
| -
|
| - std::vector<base::FilePath::StringType>::iterator component_iter =
|
| - components.begin();
|
| - std::string maybe_mount_name =
|
| - base::FilePath(*component_iter++).MaybeAsASCII();
|
| - if (maybe_mount_name.empty())
|
| - return false;
|
| -
|
| - base::FilePath cracked_path;
|
| - {
|
| - base::AutoLock locker(lock_);
|
| - NameToInstance::const_iterator found_instance =
|
| - instance_map_.find(maybe_mount_name);
|
| - if (found_instance == instance_map_.end())
|
| - return false;
|
| -
|
| - *mount_name = maybe_mount_name;
|
| - const Instance* instance = found_instance->second;
|
| - if (type)
|
| - *type = instance->type();
|
| - cracked_path = instance->path();
|
| - *mount_option = instance->mount_option();
|
| - }
|
| -
|
| - for (; component_iter != components.end(); ++component_iter)
|
| - cracked_path = cracked_path.Append(*component_iter);
|
| - *path = cracked_path;
|
| - return true;
|
| -}
|
| -
|
| -FileSystemURL ExternalMountPoints::CrackURL(const GURL& url) const {
|
| - FileSystemURL filesystem_url = FileSystemURL(url);
|
| - if (!filesystem_url.is_valid())
|
| - return FileSystemURL();
|
| - return CrackFileSystemURL(filesystem_url);
|
| -}
|
| -
|
| -FileSystemURL ExternalMountPoints::CreateCrackedFileSystemURL(
|
| - const GURL& origin,
|
| - FileSystemType type,
|
| - const base::FilePath& path) const {
|
| - return CrackFileSystemURL(FileSystemURL(origin, type, path));
|
| -}
|
| -
|
| -void ExternalMountPoints::AddMountPointInfosTo(
|
| - std::vector<MountPointInfo>* mount_points) const {
|
| - base::AutoLock locker(lock_);
|
| - DCHECK(mount_points);
|
| - for (NameToInstance::const_iterator iter = instance_map_.begin();
|
| - iter != instance_map_.end(); ++iter) {
|
| - mount_points->push_back(MountPointInfo(iter->first, iter->second->path()));
|
| - }
|
| -}
|
| -
|
| -bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path_in,
|
| - base::FilePath* virtual_path) const {
|
| - DCHECK(virtual_path);
|
| -
|
| - base::AutoLock locker(lock_);
|
| -
|
| - base::FilePath path = NormalizeFilePath(path_in);
|
| - std::map<base::FilePath, std::string>::const_reverse_iterator iter(
|
| - path_to_name_map_.upper_bound(path));
|
| - if (iter == path_to_name_map_.rend())
|
| - return false;
|
| -
|
| - *virtual_path = CreateVirtualRootPath(iter->second);
|
| - if (iter->first == path)
|
| - return true;
|
| - return iter->first.AppendRelativePath(path, virtual_path);
|
| -}
|
| -
|
| -base::FilePath ExternalMountPoints::CreateVirtualRootPath(
|
| - const std::string& mount_name) const {
|
| - return base::FilePath().AppendASCII(mount_name);
|
| -}
|
| -
|
| -FileSystemURL ExternalMountPoints::CreateExternalFileSystemURL(
|
| - const GURL& origin,
|
| - const std::string& mount_name,
|
| - const base::FilePath& path) const {
|
| - return CreateCrackedFileSystemURL(
|
| - origin,
|
| - storage::kFileSystemTypeExternal,
|
| - // Avoid using FilePath::Append as path may be an absolute path.
|
| - base::FilePath(CreateVirtualRootPath(mount_name).value() +
|
| - base::FilePath::kSeparators[0] + path.value()));
|
| -}
|
| -
|
| -void ExternalMountPoints::RevokeAllFileSystems() {
|
| - NameToInstance instance_map_copy;
|
| - {
|
| - base::AutoLock locker(lock_);
|
| - instance_map_copy = instance_map_;
|
| - instance_map_.clear();
|
| - path_to_name_map_.clear();
|
| - }
|
| - STLDeleteContainerPairSecondPointers(instance_map_copy.begin(),
|
| - instance_map_copy.end());
|
| -}
|
| -
|
| -ExternalMountPoints::ExternalMountPoints() {}
|
| -
|
| -ExternalMountPoints::~ExternalMountPoints() {
|
| - STLDeleteContainerPairSecondPointers(instance_map_.begin(),
|
| - instance_map_.end());
|
| -}
|
| -
|
| -FileSystemURL ExternalMountPoints::CrackFileSystemURL(
|
| - const FileSystemURL& url) const {
|
| - if (!HandlesFileSystemMountType(url.type()))
|
| - return FileSystemURL();
|
| -
|
| - base::FilePath virtual_path = url.path();
|
| - if (url.type() == kFileSystemTypeNativeForPlatformApp) {
|
| -#if defined(OS_CHROMEOS)
|
| - // On Chrome OS, find a mount point and virtual path for the external fs.
|
| - if (!GetVirtualPath(url.path(), &virtual_path))
|
| - return FileSystemURL();
|
| -#else
|
| - // On other OS, it is simply a native local path.
|
| - return FileSystemURL(
|
| - url.origin(), url.mount_type(), url.virtual_path(),
|
| - url.mount_filesystem_id(), kFileSystemTypeNativeLocal,
|
| - url.path(), url.filesystem_id(), url.mount_option());
|
| -#endif
|
| - }
|
| -
|
| - std::string mount_name;
|
| - FileSystemType cracked_type;
|
| - std::string cracked_id;
|
| - base::FilePath cracked_path;
|
| - FileSystemMountOption cracked_mount_option;
|
| -
|
| - if (!CrackVirtualPath(virtual_path, &mount_name, &cracked_type,
|
| - &cracked_id, &cracked_path, &cracked_mount_option)) {
|
| - return FileSystemURL();
|
| - }
|
| -
|
| - return FileSystemURL(
|
| - url.origin(), url.mount_type(), url.virtual_path(),
|
| - !url.filesystem_id().empty() ? url.filesystem_id() : mount_name,
|
| - cracked_type, cracked_path,
|
| - cracked_id.empty() ? mount_name : cracked_id, cracked_mount_option);
|
| -}
|
| -
|
| -bool ExternalMountPoints::ValidateNewMountPoint(const std::string& mount_name,
|
| - FileSystemType type,
|
| - const base::FilePath& path) {
|
| - lock_.AssertAcquired();
|
| -
|
| - // Mount name must not be empty.
|
| - if (mount_name.empty())
|
| - return false;
|
| -
|
| - // Verify there is no registered mount point with the same name.
|
| - NameToInstance::iterator found = instance_map_.find(mount_name);
|
| - if (found != instance_map_.end())
|
| - return false;
|
| -
|
| - // Allow empty paths.
|
| - if (path.empty())
|
| - return true;
|
| -
|
| - // Verify path is legal.
|
| - if (path.ReferencesParent() || !path.IsAbsolute())
|
| - return false;
|
| -
|
| - if (IsOverlappingMountPathForbidden(type)) {
|
| - // Check there the new path does not overlap with one of the existing ones.
|
| - std::map<base::FilePath, std::string>::reverse_iterator potential_parent(
|
| - path_to_name_map_.upper_bound(path));
|
| - if (potential_parent != path_to_name_map_.rend()) {
|
| - if (potential_parent->first == path ||
|
| - potential_parent->first.IsParent(path)) {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - std::map<base::FilePath, std::string>::iterator potential_child =
|
| - path_to_name_map_.upper_bound(path);
|
| - if (potential_child != path_to_name_map_.end()) {
|
| - if (potential_child->first == path ||
|
| - path.IsParent(potential_child->first)) {
|
| - return false;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -} // namespace storage
|
|
|