| Index: webkit/fileapi/file_system_file_util.cc
|
| diff --git a/webkit/fileapi/file_system_file_util.cc b/webkit/fileapi/file_system_file_util.cc
|
| index 3600a8fd414dc8a13e47e7c19c159f87dd4a439f..c6b4fac820716680e300edb90ade2774b03d2c58 100644
|
| --- a/webkit/fileapi/file_system_file_util.cc
|
| +++ b/webkit/fileapi/file_system_file_util.cc
|
| @@ -136,13 +136,10 @@ PlatformFileError FileSystemFileUtil::ReadDirectory(
|
| }
|
|
|
| PlatformFileError FileSystemFileUtil::CreateDirectory(
|
| - FileSystemOperationContext* fs_context,
|
| + FileSystemOperationContext* unused,
|
| const FilePath& file_path,
|
| bool exclusive,
|
| bool recursive) {
|
| - if (fs_context->do_not_write_actually())
|
| - return base::PLATFORM_FILE_OK;
|
| -
|
| // If parent dir of file doesn't exist.
|
| if (!recursive && !file_util::PathExists(file_path.DirName()))
|
| return base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
| @@ -253,21 +250,26 @@ FileSystemFileUtil::PerformCommonCheckAndPreparationForMoveAndCopy(
|
| (context->src_type() == context->dest_type());
|
| FileSystemFileUtil* dest_util = context->dest_file_system_file_util();
|
| DCHECK(dest_util);
|
| - if (same_file_system)
|
| + scoped_ptr<FileSystemOperationContext> local_dest_context;
|
| + FileSystemOperationContext* dest_context = NULL;
|
| + if (same_file_system) {
|
| + dest_context = context;
|
| DCHECK(context->src_file_system_file_util() ==
|
| context->dest_file_system_file_util());
|
| - // All the single-path virtual FSFU methods expect the context information
|
| - // to be in the src_* variables, not the dest_* variables, so we have to
|
| - // make a new context if we want to call them on the dest_file_path.
|
| - scoped_ptr<FileSystemOperationContext> dest_context(
|
| - context->CreateInheritedContextForDest());
|
| + } else {
|
| + local_dest_context.reset(context->CreateInheritedContextForDest());
|
| + // All the single-path virtual FSFU methods expect the context information
|
| + // to be in the src_* variables, not the dest_* variables, so we have to
|
| + // make a new context if we want to call them on the dest_file_path.
|
| + dest_context = local_dest_context.get();
|
| + }
|
|
|
| // Exits earlier if the source path does not exist.
|
| if (!PathExists(context, src_file_path))
|
| return base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
|
|
| // The parent of the |dest_file_path| does not exist.
|
| - if (!ParentExists(dest_context.get(), dest_util, dest_file_path))
|
| + if (!ParentExists(dest_context, dest_util, dest_file_path))
|
| return base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
|
|
| // It is an error to try to copy/move an entry into its child.
|
| @@ -275,14 +277,14 @@ FileSystemFileUtil::PerformCommonCheckAndPreparationForMoveAndCopy(
|
| return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
|
|
|
| // Now it is ok to return if the |dest_file_path| does not exist.
|
| - if (!dest_util->PathExists(dest_context.get(), dest_file_path))
|
| + if (!dest_util->PathExists(dest_context, dest_file_path))
|
| return base::PLATFORM_FILE_OK;
|
|
|
| // |src_file_path| exists and is a directory.
|
| // |dest_file_path| exists and is a file.
|
| bool src_is_directory = DirectoryExists(context, src_file_path);
|
| bool dest_is_directory =
|
| - dest_util->DirectoryExists(dest_context.get(), dest_file_path);
|
| + dest_util->DirectoryExists(dest_context, dest_file_path);
|
| if (src_is_directory && !dest_is_directory)
|
| return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
|
|
|
| @@ -301,14 +303,16 @@ FileSystemFileUtil::PerformCommonCheckAndPreparationForMoveAndCopy(
|
| // the file_util's Copy or Move method doesn't perform overwrite
|
| // on all platforms, so we delete the destination directory here.
|
| // TODO(kinuko): may be better to change the file_util::{Copy,Move}.
|
| - PlatformFileError error = dest_util->Delete(
|
| - dest_context.get(), dest_file_path, false /* recursive */);
|
| - context->ImportAllowedBytesGrowth(*dest_context);
|
| - if (base::PLATFORM_FILE_OK != error) {
|
| - if (!dest_util->IsDirectoryEmpty(dest_context.get(), dest_file_path))
|
| + if (base::PLATFORM_FILE_OK !=
|
| + dest_util->Delete(dest_context, dest_file_path,
|
| + false /* recursive */)) {
|
| + if (!dest_util->IsDirectoryEmpty(dest_context, dest_file_path))
|
| return base::PLATFORM_FILE_ERROR_NOT_EMPTY;
|
| return base::PLATFORM_FILE_ERROR_FAILED;
|
| }
|
| + // Reflect changes in usage back to the original context.
|
| + if (!same_file_system)
|
| + context->set_allowed_bytes_growth(dest_context->allowed_bytes_growth());
|
| }
|
| return base::PLATFORM_FILE_OK;
|
| }
|
| @@ -342,6 +346,9 @@ PlatformFileError FileSystemFileUtil::CopyOrMoveDirectory(
|
| const FilePath& dest_file_path,
|
| bool copy) {
|
| FileSystemFileUtil* dest_util = context->dest_file_system_file_util();
|
| + // All the single-path virtual FSFU methods expect the context information to
|
| + // be in the src_* variables, not the dest_* variables, so we have to make a
|
| + // new context if we want to call them on the dest_file_path.
|
| scoped_ptr<FileSystemOperationContext> dest_context(
|
| context->CreateInheritedContextForDest());
|
|
|
| @@ -356,9 +363,10 @@ PlatformFileError FileSystemFileUtil::CopyOrMoveDirectory(
|
| if (!dest_util->DirectoryExists(dest_context.get(), dest_file_path)) {
|
| PlatformFileError error = dest_util->CreateDirectory(dest_context.get(),
|
| dest_file_path, false, false);
|
| - context->ImportAllowedBytesGrowth(*dest_context);
|
| if (error != base::PLATFORM_FILE_OK)
|
| return error;
|
| + // Reflect changes in usage back to the original context.
|
| + context->set_allowed_bytes_growth(dest_context->allowed_bytes_growth());
|
| }
|
|
|
| scoped_ptr<AbstractFileEnumerator> file_enum(
|
| @@ -369,21 +377,15 @@ PlatformFileError FileSystemFileUtil::CopyOrMoveDirectory(
|
| src_file_path.AppendRelativePath(src_file_path_each, &dest_file_path_each);
|
|
|
| if (file_enum->IsDirectory()) {
|
| - scoped_ptr<FileSystemOperationContext> new_directory_context(
|
| - dest_context->CreateInheritedContextWithNewVirtualPaths(
|
| - dest_file_path_each, FilePath()));
|
| - PlatformFileError error = dest_util->CreateDirectory(
|
| - new_directory_context.get(), dest_file_path_each, false, false);
|
| - context->ImportAllowedBytesGrowth(*new_directory_context);
|
| + PlatformFileError error = dest_util->CreateDirectory(dest_context.get(),
|
| + dest_file_path_each, false, false);
|
| if (error != base::PLATFORM_FILE_OK)
|
| return error;
|
| + // Reflect changes in usage back to the original context.
|
| + context->set_allowed_bytes_growth(dest_context->allowed_bytes_growth());
|
| } else {
|
| - scoped_ptr<FileSystemOperationContext> copy_context(
|
| - context->CreateInheritedContextWithNewVirtualPaths(
|
| - src_file_path_each, dest_file_path_each));
|
| PlatformFileError error = CopyOrMoveFileHelper(
|
| - copy_context.get(), src_file_path_each, dest_file_path_each, copy);
|
| - context->ImportAllowedBytesGrowth(*copy_context);
|
| + context, src_file_path_each, dest_file_path_each, copy);
|
| if (error != base::PLATFORM_FILE_OK)
|
| return error;
|
| }
|
| @@ -394,6 +396,7 @@ PlatformFileError FileSystemFileUtil::CopyOrMoveDirectory(
|
| if (error != base::PLATFORM_FILE_OK)
|
| return error;
|
| }
|
| +
|
| return base::PLATFORM_FILE_OK;
|
| }
|
|
|
| @@ -469,12 +472,7 @@ PlatformFileError FileSystemFileUtil::DeleteDirectoryRecursive(
|
| directories.push(file_path_each);
|
| } else {
|
| // DeleteFile here is the virtual overridden member function.
|
| - scoped_ptr<FileSystemOperationContext> inherited_context(
|
| - context->CreateInheritedContextWithNewVirtualPaths(
|
| - file_path_each, FilePath()));
|
| - PlatformFileError error =
|
| - DeleteFile(inherited_context.get(), file_path_each);
|
| - context->ImportAllowedBytesGrowth(*inherited_context);
|
| + PlatformFileError error = DeleteFile(context, file_path_each);
|
| if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
|
| return base::PLATFORM_FILE_ERROR_FAILED;
|
| else if (error != base::PLATFORM_FILE_OK)
|
| @@ -483,12 +481,7 @@ PlatformFileError FileSystemFileUtil::DeleteDirectoryRecursive(
|
| }
|
|
|
| while (!directories.empty()) {
|
| - scoped_ptr<FileSystemOperationContext> inherited_context(
|
| - context->CreateInheritedContextWithNewVirtualPaths(
|
| - directories.top(), FilePath()));
|
| - PlatformFileError error =
|
| - DeleteSingleDirectory(inherited_context.get(), directories.top());
|
| - context->ImportAllowedBytesGrowth(*inherited_context);
|
| + PlatformFileError error = DeleteSingleDirectory(context, directories.top());
|
| if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
|
| return base::PLATFORM_FILE_ERROR_FAILED;
|
| else if (error != base::PLATFORM_FILE_OK)
|
|
|