summaryrefslogtreecommitdiffstats
path: root/webkit/fileapi/file_system_operation.cc
diff options
context:
space:
mode:
authorericu@chromium.org <ericu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-19 04:56:06 +0000
committerericu@chromium.org <ericu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-19 04:56:06 +0000
commitc7a4a10f9b942a0d00781283e249927bbb6883c0 (patch)
treef55299cc73912b70e0183d5e9218e7160ee6028f /webkit/fileapi/file_system_operation.cc
parent06ef6d985b07d87216bd926553e70261a073f8e4 (diff)
downloadchromium_src-c7a4a10f9b942a0d00781283e249927bbb6883c0.zip
chromium_src-c7a4a10f9b942a0d00781283e249927bbb6883c0.tar.gz
chromium_src-c7a4a10f9b942a0d00781283e249927bbb6883c0.tar.bz2
This integrates the obfuscated filesystem, but keeps it turned off with a flag.
This doesn't include proper quota integration, which will happen in a later CL. Current status: seems to work [test_shell_tests and layout tests], barring backwards-compatibility mode and File() issues [so turning the flag off just gives you a broken filesystem for now, and any test that uses File() fails]. BUG=none TEST=existing tests Review URL: http://codereview.chromium.org/7036023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85872 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi/file_system_operation.cc')
-rw-r--r--webkit/fileapi/file_system_operation.cc143
1 files changed, 118 insertions, 25 deletions
diff --git a/webkit/fileapi/file_system_operation.cc b/webkit/fileapi/file_system_operation.cc
index de86b6f..8479808 100644
--- a/webkit/fileapi/file_system_operation.cc
+++ b/webkit/fileapi/file_system_operation.cc
@@ -29,9 +29,8 @@ FileSystemOperation::FileSystemOperation(
FileSystemFileUtil* file_system_file_util)
: proxy_(proxy),
dispatcher_(dispatcher),
- file_system_operation_context_(file_system_context,
- file_system_file_util ? file_system_file_util :
- LocalFileSystemFileUtil::GetInstance()),
+ file_system_operation_context_(
+ file_system_context, file_system_file_util),
callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
DCHECK(dispatcher);
#ifndef NDEBUG
@@ -80,13 +79,18 @@ void FileSystemOperation::CreateFile(const GURL& path,
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (!VerifyFileSystemPathForWrite(
- path, true /* create */, &origin_url, &type, &virtual_path)) {
+ path, true /* create */, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::EnsureFileExists(
file_system_operation_context_,
proxy_, virtual_path, callback_factory_.NewCallback(
@@ -104,14 +108,19 @@ void FileSystemOperation::CreateDirectory(const GURL& path,
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (!VerifyFileSystemPathForWrite(
- path, true /* create */, &origin_url, &type, &virtual_path)) {
+ path, true /* create */, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::CreateDirectory(
file_system_operation_context_,
proxy_, virtual_path, exclusive, recursive, callback_factory_.NewCallback(
@@ -130,11 +139,14 @@ void FileSystemOperation::Copy(const GURL& src_path,
GURL dest_origin_url;
FileSystemType src_type;
FileSystemType dest_type;
+ FileSystemFileUtil* src_file_system_file_util;
+ FileSystemFileUtil* dest_file_system_file_util;
if (!VerifyFileSystemPathForRead(src_path, &src_origin_url, &src_type,
- &virtual_path_0) ||
+ &virtual_path_0, &src_file_system_file_util) ||
!VerifyFileSystemPathForWrite(dest_path, true /* create */,
- &dest_origin_url, &dest_type, &virtual_path_1)) {
+ &dest_origin_url, &dest_type, &virtual_path_1,
+ &dest_file_system_file_util)) {
delete this;
return;
}
@@ -146,12 +158,23 @@ void FileSystemOperation::Copy(const GURL& src_path,
delete this;
return;
}
+ if (src_file_system_file_util != dest_file_system_file_util) {
+ // TODO(ericu): implement this.
+ delete this;
+ return;
+ }
file_system_operation_context_.set_src_origin_url(src_origin_url);
file_system_operation_context_.set_dest_origin_url(dest_origin_url);
file_system_operation_context_.set_src_type(src_type);
file_system_operation_context_.set_dest_type(dest_type);
file_system_operation_context_.set_src_virtual_path(virtual_path_0);
file_system_operation_context_.set_dest_virtual_path(virtual_path_1);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ src_file_system_file_util);
+ if (!file_system_operation_context_.dest_file_system_file_util())
+ file_system_operation_context_.set_dest_file_system_file_util(
+ dest_file_system_file_util);
GetUsageAndQuotaThenCallback(dest_origin_url, callback_factory_.NewCallback(
&FileSystemOperation::DelayedCopyForQuota));
@@ -188,13 +211,14 @@ void FileSystemOperation::Move(const GURL& src_path,
GURL dest_origin_url;
FileSystemType src_type;
FileSystemType dest_type;
+ FileSystemFileUtil* src_file_system_file_util;
+ FileSystemFileUtil* dest_file_system_file_util;
- //TODO(ericu): Move alters the source path as well, so we should be checking
- //both for write!
- if (!VerifyFileSystemPathForRead(src_path, &src_origin_url, &src_type,
- &virtual_path_0) ||
+ if (!VerifyFileSystemPathForWrite(src_path, false, &src_origin_url, &src_type,
+ &virtual_path_0, &src_file_system_file_util) ||
!VerifyFileSystemPathForWrite(dest_path, true /* create */,
- &dest_origin_url, &dest_type, &virtual_path_1)) {
+ &dest_origin_url, &dest_type, &virtual_path_1,
+ &dest_file_system_file_util)) {
delete this;
return;
}
@@ -204,12 +228,23 @@ void FileSystemOperation::Move(const GURL& src_path,
delete this;
return;
}
+ if (src_file_system_file_util != dest_file_system_file_util) {
+ // TODO(ericu): implement this.
+ delete this;
+ return;
+ }
file_system_operation_context_.set_src_origin_url(src_origin_url);
file_system_operation_context_.set_dest_origin_url(dest_origin_url);
file_system_operation_context_.set_src_type(src_type);
file_system_operation_context_.set_dest_type(dest_type);
file_system_operation_context_.set_src_virtual_path(virtual_path_0);
file_system_operation_context_.set_dest_virtual_path(virtual_path_1);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ src_file_system_file_util);
+ if (!file_system_operation_context_.dest_file_system_file_util())
+ file_system_operation_context_.set_dest_file_system_file_util(
+ dest_file_system_file_util);
GetUsageAndQuotaThenCallback(dest_origin_url, callback_factory_.NewCallback(
&FileSystemOperation::DelayedMoveForQuota));
@@ -243,12 +278,17 @@ void FileSystemOperation::DirectoryExists(const GURL& path) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
- if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ FileSystemFileUtil* file_system_file_util;
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::GetFileInfo(
file_system_operation_context_,
proxy_, virtual_path, callback_factory_.NewCallback(
@@ -264,12 +304,17 @@ void FileSystemOperation::FileExists(const GURL& path) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
- if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ FileSystemFileUtil* file_system_file_util;
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::GetFileInfo(
file_system_operation_context_,
proxy_, virtual_path, callback_factory_.NewCallback(
@@ -285,12 +330,17 @@ void FileSystemOperation::GetLocalPath(const GURL& path) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
- if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ FileSystemFileUtil* file_system_file_util;
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::GetLocalPath(
file_system_operation_context_,
proxy_, virtual_path, callback_factory_.NewCallback(
@@ -306,12 +356,17 @@ void FileSystemOperation::GetMetadata(const GURL& path) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
- if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ FileSystemFileUtil* file_system_file_util;
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::GetFileInfo(
file_system_operation_context_,
proxy_, virtual_path, callback_factory_.NewCallback(
@@ -327,12 +382,17 @@ void FileSystemOperation::ReadDirectory(const GURL& path) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
- if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ FileSystemFileUtil* file_system_file_util;
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::ReadDirectory(
file_system_operation_context_,
proxy_, virtual_path, callback_factory_.NewCallback(
@@ -348,13 +408,17 @@ void FileSystemOperation::Remove(const GURL& path, bool recursive) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (!VerifyFileSystemPathForWrite(path, false /* create */, &origin_url,
- &type, &virtual_path)) {
+ &type, &virtual_path, &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::Delete(
file_system_operation_context_,
proxy_, virtual_path, recursive, callback_factory_.NewCallback(
@@ -373,14 +437,18 @@ void FileSystemOperation::Write(
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url,
- &type, &virtual_path)) {
+ &type, &virtual_path, &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
file_system_operation_context_.set_src_virtual_path(virtual_path);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
DCHECK(blob_url.is_valid());
file_writer_delegate_.reset(new FileWriterDelegate(this, offset, proxy_));
blob_request_.reset(
@@ -419,14 +487,18 @@ void FileSystemOperation::Truncate(const GURL& path, int64 length) {
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (!VerifyFileSystemPathForWrite(path, false /* create */, &origin_url,
- &type, &virtual_path)) {
+ &type, &virtual_path, &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
file_system_operation_context_.set_src_virtual_path(virtual_path);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
length_ = length;
GetUsageAndQuotaThenCallback(origin_url, callback_factory_.NewCallback(
@@ -462,13 +534,17 @@ void FileSystemOperation::TouchFile(const GURL& path,
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url,
- &type, &virtual_path)) {
+ &type, &virtual_path, &file_system_file_util)) {
delete this;
return;
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::Touch(
file_system_operation_context_,
proxy_, virtual_path, last_access_time, last_modified_time,
@@ -487,6 +563,7 @@ void FileSystemOperation::OpenFile(const GURL& path,
FilePath virtual_path;
GURL origin_url;
FileSystemType type;
+ FileSystemFileUtil* file_system_file_util;
if (file_flags & (
(base::PLATFORM_FILE_ENUMERATE | base::PLATFORM_FILE_TEMPORARY |
base::PLATFORM_FILE_HIDDEN))) {
@@ -500,18 +577,22 @@ void FileSystemOperation::OpenFile(const GURL& path,
base::PLATFORM_FILE_DELETE_ON_CLOSE | base::PLATFORM_FILE_TRUNCATE |
base::PLATFORM_FILE_WRITE_ATTRIBUTES)) {
if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url,
- &type, &virtual_path)) {
+ &type, &virtual_path, &file_system_file_util)) {
delete this;
return;
}
} else {
- if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path,
+ &file_system_file_util)) {
delete this;
return;
}
}
file_system_operation_context_.set_src_origin_url(origin_url);
file_system_operation_context_.set_src_type(type);
+ if (!file_system_operation_context_.src_file_system_file_util())
+ file_system_operation_context_.set_src_file_system_file_util(
+ file_system_file_util);
FileSystemFileUtilProxy::CreateOrOpen(
file_system_operation_context_,
proxy_,
@@ -554,6 +635,7 @@ void FileSystemOperation::Cancel(FileSystemOperation* cancel_operation_ptr) {
}
}
+// TODO(ericu): Obfuscation integration.
bool FileSystemOperation::GetUsageAndQuotaThenCallback(
const GURL& origin_url,
quota::QuotaManager::GetUsageAndQuotaCallback* callback) {
@@ -733,7 +815,7 @@ void FileSystemOperation::OnFileOpenedForWrite(
bool FileSystemOperation::VerifyFileSystemPathForRead(
const GURL& path, GURL* origin_url, FileSystemType* type,
- FilePath* virtual_path) {
+ FilePath* virtual_path, FileSystemFileUtil** file_system_file_util) {
// If we have no context, we just allow any operations, for testing.
// TODO(ericu): Revisit this hack for security.
@@ -752,6 +834,7 @@ bool FileSystemOperation::VerifyFileSystemPathForRead(
#endif
*type = file_system_operation_context_.src_type();
*origin_url = file_system_operation_context_.src_origin_url();
+ *file_system_file_util = NULL;
return true;
}
@@ -766,13 +849,17 @@ bool FileSystemOperation::VerifyFileSystemPathForRead(
dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY);
return false;
}
+ DCHECK(file_system_file_util);
+ *file_system_file_util =
+ file_system_context()->path_manager()->GetFileSystemFileUtil(*type);
+ DCHECK(*file_system_file_util);
return true;
}
bool FileSystemOperation::VerifyFileSystemPathForWrite(
const GURL& path, bool create, GURL* origin_url, FileSystemType* type,
- FilePath* virtual_path) {
+ FilePath* virtual_path, FileSystemFileUtil** file_system_file_util) {
// If we have no context, we just allow any operations, for testing.
// TODO(ericu): Revisit this hack for security.
@@ -791,6 +878,7 @@ bool FileSystemOperation::VerifyFileSystemPathForWrite(
#endif
*type = file_system_operation_context_.dest_type();
*origin_url = file_system_operation_context_.dest_origin_url();
+ *file_system_file_util = NULL;
return true;
}
@@ -814,6 +902,11 @@ bool FileSystemOperation::VerifyFileSystemPathForWrite(
dispatcher_->DidFail(base::PLATFORM_FILE_ERROR_SECURITY);
return false;
}
+ DCHECK(file_system_file_util);
+ *file_system_file_util =
+ file_system_context()->path_manager()->GetFileSystemFileUtil(*type);
+ DCHECK(*file_system_file_util);
+
return true;
}