| Index: webkit/chromeos/fileapi/cros_mount_point_provider.cc | 
| =================================================================== | 
| --- webkit/chromeos/fileapi/cros_mount_point_provider.cc	(revision 81835) | 
| +++ webkit/chromeos/fileapi/cros_mount_point_provider.cc	(working copy) | 
| @@ -14,14 +14,13 @@ | 
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h" | 
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystem.h" | 
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" | 
| +#include "webkit/chromeos/fileapi/file_access_permissions.h" | 
| #include "webkit/fileapi/file_system_path_manager.h" | 
| +#include "webkit/fileapi/file_system_util.h" | 
| #include "webkit/glue/webkit_glue.h" | 
|  | 
| namespace chromeos { | 
|  | 
| -const char CrosMountPointProvider::kLocalName[] = "Local"; | 
| -const char CrosMountPointProvider::kLocalDirName[] = "/local/"; | 
| - | 
| typedef struct { | 
| const char* local_root_path; | 
| const char* web_root_path; | 
| @@ -36,28 +35,12 @@ | 
|  | 
| CrosMountPointProvider::CrosMountPointProvider( | 
| scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy) | 
| -    : local_dir_name_(kLocalName), | 
| -      special_storage_policy_(special_storage_policy) { | 
| - | 
| -  // TODO(zelidrag): There's got to be a better way to generate UUID. | 
| -  srand(time(NULL)); | 
| -  std::string virtual_root; | 
| -  virtual_root.append(base::StringPrintf("%hx%hx-%hx-%hx-%hx-%hx%hx%hx", | 
| -      static_cast<unsigned short>(rand()), static_cast<unsigned short>(rand()), | 
| -      static_cast<unsigned short>(rand()), | 
| -      static_cast<unsigned short>(rand()), | 
| -      static_cast<unsigned short>(rand()), | 
| -      static_cast<unsigned short>(rand()), static_cast<unsigned short>(rand()), | 
| -          static_cast<unsigned short>(rand()))); | 
| - | 
| -  // Create virtual root node. | 
| -  virtual_root_path_ = FilePath(virtual_root); | 
| -  base_path_ = virtual_root_path_.Append(local_dir_name_); | 
| - | 
| +    : special_storage_policy_(special_storage_policy), | 
| +      file_access_permissions_(new FileAccessPermissions()) { | 
| for (size_t i = 0; i < arraysize(fixed_exposed_paths); i++) { | 
| -    mount_point_map_.insert(std::pair<std::string, std::string>( | 
| +    mount_point_map_.insert(std::pair<std::string, FilePath>( | 
| std::string(fixed_exposed_paths[i].web_root_path), | 
| -        std::string(fixed_exposed_paths[i].local_root_path))); | 
| +        FilePath(std::string(fixed_exposed_paths[i].local_root_path)))); | 
| } | 
| } | 
|  | 
| @@ -77,13 +60,13 @@ | 
| fileapi::FileSystemType type, | 
| bool create, | 
| fileapi::FileSystemPathManager::GetRootPathCallback* callback_ptr) { | 
| -  DCHECK(type == fileapi::kFileSystemTypeLocal); | 
| +  DCHECK(type == fileapi::kFileSystemTypeExternal); | 
|  | 
| std::string name(GetOriginIdentifierFromURL(origin_url)); | 
| name += ':'; | 
| -  name += CrosMountPointProvider::kLocalName; | 
| +  name += fileapi::kExternalName; | 
|  | 
| -  FilePath root_path = FilePath(CrosMountPointProvider::kLocalDirName); | 
| +  FilePath root_path = FilePath(fileapi::kExternalDir); | 
| callback_ptr->Run(!root_path.empty(), root_path, name); | 
| } | 
|  | 
| @@ -94,7 +77,7 @@ | 
| fileapi::FileSystemType type, | 
| const FilePath& virtual_path, | 
| bool create) { | 
| -  DCHECK(type == fileapi::kFileSystemTypeLocal); | 
| +  DCHECK(type == fileapi::kFileSystemTypeExternal); | 
|  | 
| std::vector<FilePath::StringType> components; | 
| virtual_path.GetComponents(&components); | 
| @@ -108,7 +91,7 @@ | 
| return FilePath(); | 
| } | 
|  | 
| -  return FilePath(iter->second); | 
| +  return iter->second; | 
| } | 
|  | 
| // TODO(zelidrag): Share this code with SandboxMountPointProvider impl. | 
| @@ -116,9 +99,54 @@ | 
| return false; | 
| } | 
|  | 
| -bool CrosMountPointProvider::IsAccessAllowed(const GURL& origin_url) { | 
| -  return special_storage_policy_->IsLocalFileSystemAccessAllowed(origin_url); | 
| +bool CrosMountPointProvider::IsAccessAllowed(const GURL& origin_url, | 
| +                                             fileapi::FileSystemType type, | 
| +                                             const FilePath& virtual_path) { | 
| +  if (type != fileapi::kFileSystemTypeExternal) | 
| +    return false; | 
| +  std::string extension_id = origin_url.host(); | 
| +  // Check first to make sure this extension has fileBrowserHander permissions. | 
| +  if (!special_storage_policy_->IsFileHandler(extension_id)) | 
| +    return false; | 
| +  return file_access_permissions_->HasAccessPermission(extension_id, | 
| +                                                       virtual_path); | 
| } | 
|  | 
| +void CrosMountPointProvider::GrantFullAccessToExtension( | 
| +    const std::string& extension_id) { | 
| +  DCHECK(special_storage_policy_->IsFileHandler(extension_id)); | 
| +  if (!special_storage_policy_->IsFileHandler(extension_id)) | 
| +    return; | 
| +  for (MountPointMap::const_iterator iter = mount_point_map_.begin(); | 
| +       iter != mount_point_map_.end(); | 
| +       ++iter) { | 
| +    GrantFileAccessToExtension(extension_id, FilePath(iter->first)); | 
| +  } | 
| +} | 
| + | 
| +void CrosMountPointProvider::GrantFileAccessToExtension( | 
| +    const std::string& extension_id, const FilePath& virtual_path) { | 
| +  // All we care about here is access from extensions for now. | 
| +  DCHECK(special_storage_policy_->IsFileHandler(extension_id)); | 
| +  if (!special_storage_policy_->IsFileHandler(extension_id)) | 
| +    return; | 
| +  file_access_permissions_->GrantAccessPermission(extension_id, virtual_path); | 
| +} | 
| + | 
| +void CrosMountPointProvider::RevokeAccessForExtension( | 
| +      const std::string& extension_id) { | 
| +  file_access_permissions_->RevokePermissions(extension_id); | 
| +} | 
| + | 
| +std::vector<FilePath> CrosMountPointProvider::GetRootDirectories() const { | 
| +  std::vector<FilePath> root_dirs; | 
| +  for (MountPointMap::const_iterator iter = mount_point_map_.begin(); | 
| +       iter != mount_point_map_.end(); | 
| +       ++iter) { | 
| +    root_dirs.push_back(iter->second.Append(iter->first)); | 
| +  } | 
| +  return root_dirs; | 
| +} | 
| + | 
| }  // namespace chromeos | 
|  | 
|  |