diff options
author | ericu@chromium.org <ericu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-19 04:56:06 +0000 |
---|---|---|
committer | ericu@chromium.org <ericu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-19 04:56:06 +0000 |
commit | c7a4a10f9b942a0d00781283e249927bbb6883c0 (patch) | |
tree | f55299cc73912b70e0183d5e9218e7160ee6028f /webkit/fileapi/file_system_operation.cc | |
parent | 06ef6d985b07d87216bd926553e70261a073f8e4 (diff) | |
download | chromium_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.cc | 143 |
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; } |