| Index: chrome/browser/extensions/api/file_handlers/app_file_handler_util.cc
|
| diff --git a/chrome/browser/extensions/api/file_handlers/app_file_handler_util.cc b/chrome/browser/extensions/api/file_handlers/app_file_handler_util.cc
|
| index 64c81728b2520a0694dba4b772d2ed684739db2a..81648f0adbe2d82125eb6fb70d60a44d015c946e 100644
|
| --- a/chrome/browser/extensions/api/file_handlers/app_file_handler_util.cc
|
| +++ b/chrome/browser/extensions/api/file_handlers/app_file_handler_util.cc
|
| @@ -59,11 +59,14 @@ bool FileHandlerCanHandleFileWithMimeType(
|
| return false;
|
| }
|
|
|
| -bool DoCheckWritableFile(const base::FilePath& path) {
|
| +bool DoCheckWritableFile(const base::FilePath& path, bool is_directory) {
|
| // Don't allow links.
|
| if (base::PathExists(path) && file_util::IsLink(path))
|
| return false;
|
|
|
| + if (is_directory)
|
| + return base::DirectoryExists(path);
|
| +
|
| // Create the file if it doesn't already exist.
|
| base::PlatformFileError error = base::PLATFORM_FILE_OK;
|
| int creation_flags = base::PLATFORM_FILE_CREATE |
|
| @@ -92,6 +95,7 @@ class WritableFileChecker
|
| WritableFileChecker(
|
| const std::vector<base::FilePath>& paths,
|
| Profile* profile,
|
| + bool is_directory,
|
| const base::Closure& on_success,
|
| const base::Callback<void(const base::FilePath&)>& on_failure);
|
|
|
| @@ -119,6 +123,7 @@ class WritableFileChecker
|
|
|
| const std::vector<base::FilePath> paths_;
|
| Profile* profile_;
|
| + const bool is_directory_;
|
| int outstanding_tasks_;
|
| base::FilePath error_path_;
|
| base::Closure on_success_;
|
| @@ -128,10 +133,12 @@ class WritableFileChecker
|
| WritableFileChecker::WritableFileChecker(
|
| const std::vector<base::FilePath>& paths,
|
| Profile* profile,
|
| + bool is_directory,
|
| const base::Closure& on_success,
|
| const base::Callback<void(const base::FilePath&)>& on_failure)
|
| : paths_(paths),
|
| profile_(profile),
|
| + is_directory_(is_directory),
|
| outstanding_tasks_(1),
|
| on_success_(on_success),
|
| on_failure_(on_failure) {}
|
| @@ -184,7 +191,7 @@ void WritableFileChecker::CheckLocalWritableFiles() {
|
| for (std::vector<base::FilePath>::const_iterator it = paths_.begin();
|
| it != paths_.end();
|
| ++it) {
|
| - if (!DoCheckWritableFile(*it)) {
|
| + if (!DoCheckWritableFile(*it, is_directory_)) {
|
| content::BrowserThread::PostTask(
|
| content::BrowserThread::UI,
|
| FROM_HERE,
|
| @@ -290,7 +297,8 @@ GrantedFileEntry CreateFileEntry(
|
| Profile* profile,
|
| const Extension* extension,
|
| int renderer_id,
|
| - const base::FilePath& path) {
|
| + const base::FilePath& path,
|
| + bool is_directory) {
|
| GrantedFileEntry result;
|
| fileapi::IsolatedContext* isolated_context =
|
| fileapi::IsolatedContext::GetInstance();
|
| @@ -303,8 +311,11 @@ GrantedFileEntry CreateFileEntry(
|
| content::ChildProcessSecurityPolicy* policy =
|
| content::ChildProcessSecurityPolicy::GetInstance();
|
| policy->GrantReadFileSystem(renderer_id, result.filesystem_id);
|
| - if (HasFileSystemWritePermission(extension))
|
| + if (HasFileSystemWritePermission(extension)) {
|
| policy->GrantWriteFileSystem(renderer_id, result.filesystem_id);
|
| + if (is_directory)
|
| + policy->GrantCreateFileForFileSystem(renderer_id, result.filesystem_id);
|
| + }
|
|
|
| result.id = result.filesystem_id + ":" + result.registered_name;
|
| return result;
|
| @@ -313,13 +324,16 @@ GrantedFileEntry CreateFileEntry(
|
| void CheckWritableFiles(
|
| const std::vector<base::FilePath>& paths,
|
| Profile* profile,
|
| + bool is_directory,
|
| const base::Closure& on_success,
|
| const base::Callback<void(const base::FilePath&)>& on_failure) {
|
| - scoped_refptr<WritableFileChecker> checker(
|
| - new WritableFileChecker(paths, profile, on_success, on_failure));
|
| + scoped_refptr<WritableFileChecker> checker(new WritableFileChecker(
|
| + paths, profile, is_directory, on_success, on_failure));
|
| checker->Check();
|
| }
|
|
|
| +GrantedFileEntry::GrantedFileEntry() {}
|
| +
|
| bool HasFileSystemWritePermission(const Extension* extension) {
|
| return extension->HasAPIPermission(APIPermission::kFileSystemWrite);
|
| }
|
|
|