summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcalvinlo@chromium.org <calvinlo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-14 04:30:02 +0000
committercalvinlo@chromium.org <calvinlo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-14 04:30:02 +0000
commitdd68456b1e554972c87cb3e7491c1d0bf315d509 (patch)
tree9271bb1223d3dbed8560cb3a031e1a875a64ec02
parentf31cb8663c7b38c39bf8875decc57c128a35db6d (diff)
downloadchromium_src-dd68456b1e554972c87cb3e7491c1d0bf315d509.zip
chromium_src-dd68456b1e554972c87cb3e7491c1d0bf315d509.tar.gz
chromium_src-dd68456b1e554972c87cb3e7491c1d0bf315d509.tar.bz2
Exposed CopyInForeignFile to LocalFileSystemOperation. Also added positive and negative test cases.
BUG=146318 Review URL: https://chromiumcodereview.appspot.com/10917210 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@156745 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--webkit/fileapi/file_system_file_util_proxy.cc14
-rw-r--r--webkit/fileapi/file_system_file_util_proxy.h9
-rw-r--r--webkit/fileapi/file_system_operation.h1
-rw-r--r--webkit/fileapi/local_file_system_operation.cc34
-rw-r--r--webkit/fileapi/local_file_system_operation.h6
-rw-r--r--webkit/fileapi/local_file_system_operation_unittest.cc60
-rw-r--r--webkit/fileapi/local_file_util.h6
7 files changed, 126 insertions, 4 deletions
diff --git a/webkit/fileapi/file_system_file_util_proxy.cc b/webkit/fileapi/file_system_file_util_proxy.cc
index 11fd441..d2dd021 100644
--- a/webkit/fileapi/file_system_file_util_proxy.cc
+++ b/webkit/fileapi/file_system_file_util_proxy.cc
@@ -151,6 +151,20 @@ bool FileSystemFileUtilProxy::Copy(
}
// static
+bool FileSystemFileUtilProxy::CopyInForeignFile(
+ FileSystemOperationContext* context,
+ FileSystemFileUtil* dest_util,
+ const FilePath& src_local_disk_file_path,
+ const FileSystemURL& dest_url,
+ const StatusCallback& callback) {
+ return base::FileUtilProxy::RelayFileTask(
+ context->task_runner(), FROM_HERE,
+ Bind(&FileSystemFileUtil::CopyInForeignFile, Unretained(dest_util),
+ context, src_local_disk_file_path, dest_url),
+ callback);
+}
+
+// static
bool FileSystemFileUtilProxy::Move(
FileSystemOperationContext* context,
FileSystemFileUtil* src_util,
diff --git a/webkit/fileapi/file_system_file_util_proxy.h b/webkit/fileapi/file_system_file_util_proxy.h
index f6ff686..9798542 100644
--- a/webkit/fileapi/file_system_file_util_proxy.h
+++ b/webkit/fileapi/file_system_file_util_proxy.h
@@ -88,6 +88,15 @@ class FileSystemFileUtilProxy {
const FileSystemURL& dest_url,
const StatusCallback& callback);
+ // Copies a file from local disk to the given filesystem destination.
+ // Primarily used for the Syncable filesystem type (e.g. GDrive).
+ static bool CopyInForeignFile(
+ FileSystemOperationContext* context,
+ FileSystemFileUtil* dest_util,
+ const FilePath& src_local_disk_file_path,
+ const FileSystemURL& dest_url,
+ const StatusCallback& callback);
+
// Moves a file or a directory from |src_url| to |dest_url| by calling
// FileSystemFileUtil's following methods on the given context's
// task_runner.
diff --git a/webkit/fileapi/file_system_operation.h b/webkit/fileapi/file_system_operation.h
index 26db793..ab4bb80 100644
--- a/webkit/fileapi/file_system_operation.h
+++ b/webkit/fileapi/file_system_operation.h
@@ -259,6 +259,7 @@ class FileSystemOperation {
kOperationCreateDirectory,
kOperationCreateSnapshotFile,
kOperationCopy,
+ kOperationCopyInForeignFile,
kOperationMove,
kOperationDirectoryExists,
kOperationFileExists,
diff --git a/webkit/fileapi/local_file_system_operation.cc b/webkit/fileapi/local_file_system_operation.cc
index 1107257..ff46be5 100644
--- a/webkit/fileapi/local_file_system_operation.cc
+++ b/webkit/fileapi/local_file_system_operation.cc
@@ -138,6 +138,28 @@ void LocalFileSystemOperation::Copy(const FileSystemURL& src_url,
base::Bind(callback, base::PLATFORM_FILE_ERROR_FAILED));
}
+void LocalFileSystemOperation::CopyInForeignFile(
+ const FilePath& src_local_disk_file_path,
+ const FileSystemURL& dest_url,
+ const StatusCallback& callback) {
+ DCHECK(SetPendingOperationType(kOperationCopyInForeignFile));
+
+ base::PlatformFileError result = SetUp(
+ dest_url, &dest_util_, SETUP_FOR_CREATE);
+ if (result != base::PLATFORM_FILE_OK) {
+ callback.Run(result);
+ delete this;
+ return;
+ }
+
+ GetUsageAndQuotaThenRunTask(
+ dest_url,
+ base::Bind(&LocalFileSystemOperation::DoCopyInForeignFile,
+ base::Unretained(this), src_local_disk_file_path, dest_url,
+ callback),
+ base::Bind(callback, base::PLATFORM_FILE_ERROR_FAILED));
+}
+
void LocalFileSystemOperation::Move(const FileSystemURL& src_url,
const FileSystemURL& dest_url,
const StatusCallback& callback) {
@@ -547,6 +569,18 @@ void LocalFileSystemOperation::DoCopy(const FileSystemURL& src_url,
base::Owned(this), callback));
}
+void LocalFileSystemOperation::DoCopyInForeignFile(
+ const FilePath& src_local_disk_file_path,
+ const FileSystemURL& dest_url,
+ const StatusCallback& callback) {
+ FileSystemFileUtilProxy::CopyInForeignFile(
+ operation_context_.get(),
+ dest_util_,
+ src_local_disk_file_path, dest_url,
+ base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
+ base::Owned(this), callback));
+}
+
void LocalFileSystemOperation::DoMove(const FileSystemURL& src_url,
const FileSystemURL& dest_url,
const StatusCallback& callback) {
diff --git a/webkit/fileapi/local_file_system_operation.h b/webkit/fileapi/local_file_system_operation.h
index 10dd19d..e4ba541 100644
--- a/webkit/fileapi/local_file_system_operation.h
+++ b/webkit/fileapi/local_file_system_operation.h
@@ -60,6 +60,9 @@ class FILEAPI_EXPORT LocalFileSystemOperation
virtual void Copy(const FileSystemURL& src_url,
const FileSystemURL& dest_url,
const StatusCallback& callback) OVERRIDE;
+ virtual void CopyInForeignFile(const FilePath& src_local_disk_path,
+ const FileSystemURL& dest_url,
+ const StatusCallback& callback);
virtual void Move(const FileSystemURL& src_url,
const FileSystemURL& dest_url,
const StatusCallback& callback) OVERRIDE;
@@ -170,6 +173,9 @@ class FILEAPI_EXPORT LocalFileSystemOperation
void DoCopy(const FileSystemURL& src,
const FileSystemURL& dest,
const StatusCallback& callback);
+ void DoCopyInForeignFile(const FilePath& src_local_disk_file_path,
+ const FileSystemURL& dest,
+ const StatusCallback& callback);
void DoMove(const FileSystemURL& src,
const FileSystemURL& dest,
const StatusCallback& callback);
diff --git a/webkit/fileapi/local_file_system_operation_unittest.cc b/webkit/fileapi/local_file_system_operation_unittest.cc
index d2aa935..44a1bf9 100644
--- a/webkit/fileapi/local_file_system_operation_unittest.cc
+++ b/webkit/fileapi/local_file_system_operation_unittest.cc
@@ -786,7 +786,6 @@ TEST_F(LocalFileSystemOperationTest, TestCopySuccessSrcDirRecursive) {
CreateUniqueFileInDir(child_dir_path));
FilePath dest_dir_path(CreateUniqueDir());
-
operation()->Copy(URLForPath(src_dir_path), URLForPath(dest_dir_path),
RecordStatusCallback());
MessageLoop::current()->RunAllPending();
@@ -804,6 +803,65 @@ TEST_F(LocalFileSystemOperationTest, TestCopySuccessSrcDirRecursive) {
EXPECT_TRUE(change_observer()->HasNoChange());
}
+TEST_F(LocalFileSystemOperationTest, TestCopyInForeignFileSuccess) {
+ FilePath src_local_disk_file_path;
+ file_util::CreateTemporaryFile(&src_local_disk_file_path);
+ const char test_data[] = "foo";
+ int data_size = ARRAYSIZE_UNSAFE(test_data);
+ file_util::WriteFile(src_local_disk_file_path, test_data, data_size);
+ FilePath dest_dir_path(CreateUniqueDir());
+ FilePath dest_file_path(dest_dir_path.Append(
+ src_local_disk_file_path.BaseName()));
+ FileSystemURL dest_file_url = URLForPath(dest_file_path);
+ int64 before_usage;
+ GetUsageAndQuota(&before_usage, NULL);
+
+ // Check that the file copied and corresponding usage increased.
+ operation()->CopyInForeignFile(src_local_disk_file_path,
+ dest_file_url,
+ RecordStatusCallback());
+ MessageLoop::current()->RunAllPending();
+ EXPECT_EQ(1, change_observer()->create_file_count());
+ EXPECT_EQ(base::PLATFORM_FILE_OK, status());
+ EXPECT_TRUE(FileExists(dest_file_path));
+ int64 after_usage;
+ GetUsageAndQuota(&after_usage, NULL);
+ EXPECT_GT(after_usage, before_usage);
+
+ // Compare contents of src and copied file.
+ char buffer[100];
+ EXPECT_EQ(data_size, file_util::ReadFile(PlatformPath(dest_file_path),
+ buffer, data_size));
+ for (int i = 0; i < data_size; ++i)
+ EXPECT_EQ(test_data[i], buffer[i]);
+}
+
+TEST_F(LocalFileSystemOperationTest, TestCopyInForeignFileFailureByQuota) {
+ FilePath src_local_disk_file_path;
+ file_util::CreateTemporaryFile(&src_local_disk_file_path);
+ const char test_data[] = "foo";
+ file_util::WriteFile(src_local_disk_file_path, test_data,
+ ARRAYSIZE_UNSAFE(test_data));
+
+ FilePath dest_dir_path(CreateUniqueDir());
+ FilePath dest_file_path(dest_dir_path.Append(
+ src_local_disk_file_path.BaseName()));
+ FileSystemURL dest_file_url = URLForPath(dest_file_path);
+
+ // Set quota of 0 which should force copy to fail by quota.
+ quota_manager_proxy()->SetQuota(dest_file_url.origin(),
+ test_helper_.storage_type(),
+ static_cast<int64>(0));
+ operation()->CopyInForeignFile(src_local_disk_file_path,
+ dest_file_url,
+ RecordStatusCallback());
+ MessageLoop::current()->RunAllPending();
+
+ EXPECT_TRUE(!FileExists(dest_file_path));
+ EXPECT_EQ(0, change_observer()->create_file_count());
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status());
+}
+
TEST_F(LocalFileSystemOperationTest, TestCreateFileFailure) {
// Already existing file and exclusive true.
FilePath dir_path(CreateUniqueDir());
diff --git a/webkit/fileapi/local_file_util.h b/webkit/fileapi/local_file_util.h
index 5de2a06..4eaf2fa 100644
--- a/webkit/fileapi/local_file_util.h
+++ b/webkit/fileapi/local_file_util.h
@@ -88,9 +88,9 @@ class FILEAPI_EXPORT_PRIVATE LocalFileUtil : public FileSystemFileUtil {
const FileSystemURL& dest_url,
bool copy) OVERRIDE;
virtual PlatformFileError CopyInForeignFile(
- FileSystemOperationContext* context,
- const FilePath& src_file_path,
- const FileSystemURL& dest_url) OVERRIDE;
+ FileSystemOperationContext* context,
+ const FilePath& src_file_path,
+ const FileSystemURL& dest_url) OVERRIDE;
virtual PlatformFileError DeleteFile(
FileSystemOperationContext* context,
const FileSystemURL& url) OVERRIDE;