diff options
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/fileapi/fileapi_message_filter.cc | 40 | ||||
-rw-r--r-- | content/browser/fileapi/fileapi_message_filter.h | 10 | ||||
-rw-r--r-- | content/child/fileapi/file_system_dispatcher.cc | 38 | ||||
-rw-r--r-- | content/child/fileapi/file_system_dispatcher.h | 12 | ||||
-rw-r--r-- | content/child/fileapi/webfilesystem_impl.cc | 36 | ||||
-rw-r--r-- | content/child/fileapi/webfilesystem_impl.h | 3 | ||||
-rw-r--r-- | content/common/fileapi/file_system_messages.h | 17 |
7 files changed, 152 insertions, 4 deletions
diff --git a/content/browser/fileapi/fileapi_message_filter.cc b/content/browser/fileapi/fileapi_message_filter.cc index ef5f248..1a79ea2 100644 --- a/content/browser/fileapi/fileapi_message_filter.cc +++ b/content/browser/fileapi/fileapi_message_filter.cc @@ -38,6 +38,7 @@ #include "webkit/common/blob/blob_data.h" #include "webkit/common/blob/shareable_file_reference.h" #include "webkit/common/fileapi/directory_entry.h" +#include "webkit/common/fileapi/file_system_info.h" #include "webkit/common/fileapi/file_system_types.h" #include "webkit/common/fileapi/file_system_util.h" @@ -168,6 +169,7 @@ bool FileAPIMessageFilter::OnMessageReceived( bool handled = true; IPC_BEGIN_MESSAGE_MAP_EX(FileAPIMessageFilter, message, *message_was_ok) IPC_MESSAGE_HANDLER(FileSystemHostMsg_Open, OnOpen) + IPC_MESSAGE_HANDLER(FileSystemHostMsg_ResolveURL, OnResolveURL) IPC_MESSAGE_HANDLER(FileSystemHostMsg_DeleteFileSystem, OnDeleteFileSystem) IPC_MESSAGE_HANDLER(FileSystemHostMsg_Move, OnMove) IPC_MESSAGE_HANDLER(FileSystemHostMsg_Copy, OnCopy) @@ -250,6 +252,23 @@ void FileAPIMessageFilter::OnOpen( &FileAPIMessageFilter::DidOpenFileSystem, this, request_id)); } +void FileAPIMessageFilter::OnResolveURL( + int request_id, + const GURL& filesystem_url) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + FileSystemURL url(context_->CrackURL(filesystem_url)); + if (!ValidateFileSystemURL(request_id, url)) + return; + if (!security_policy_->CanReadFileSystemFile(process_id_, url)) { + Send(new FileSystemMsg_DidFail(request_id, + base::PLATFORM_FILE_ERROR_SECURITY)); + return; + } + + context_->ResolveURL(url, base::Bind( + &FileAPIMessageFilter::DidResolveURL, this, request_id)); +} + void FileAPIMessageFilter::OnDeleteFileSystem( int request_id, const GURL& origin_url, @@ -873,18 +892,35 @@ void FileAPIMessageFilter::DidWrite(int request_id, void FileAPIMessageFilter::DidOpenFileSystem(int request_id, base::PlatformFileError result, - const std::string& name, + const std::string& filesystem_name, const GURL& root) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); if (result == base::PLATFORM_FILE_OK) { DCHECK(root.is_valid()); - Send(new FileSystemMsg_DidOpenFileSystem(request_id, name, root)); + Send(new FileSystemMsg_DidOpenFileSystem( + request_id, filesystem_name, root)); } else { Send(new FileSystemMsg_DidFail(request_id, result)); } // For OpenFileSystem we do not create a new operation, so no unregister here. } +void FileAPIMessageFilter::DidResolveURL(int request_id, + base::PlatformFileError result, + const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, + bool is_directory) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + if (result == base::PLATFORM_FILE_OK) { + DCHECK(info.root_url.is_valid()); + Send(new FileSystemMsg_DidResolveURL( + request_id, info, file_path, is_directory)); + } else { + Send(new FileSystemMsg_DidFail(request_id, result)); + } + // For ResolveURL we do not create a new operation, so no unregister here. +} + void FileAPIMessageFilter::DidDeleteFileSystem( int request_id, base::PlatformFileError result) { diff --git a/content/browser/fileapi/fileapi_message_filter.h b/content/browser/fileapi/fileapi_message_filter.h index d1d7373..e9a707f 100644 --- a/content/browser/fileapi/fileapi_message_filter.h +++ b/content/browser/fileapi/fileapi_message_filter.h @@ -37,6 +37,7 @@ class FileSystemURL; class FileSystemContext; class FileSystemOperationRunner; struct DirectoryEntry; +struct FileSystemInfo; } namespace net { @@ -93,6 +94,8 @@ class CONTENT_EXPORT FileAPIMessageFilter : public BrowserMessageFilter { fileapi::FileSystemType type, int64 requested_size, bool create); + void OnResolveURL(int request_id, + const GURL& filesystem_url); void OnDeleteFileSystem(int request_id, const GURL& origin_url, fileapi::FileSystemType type); @@ -201,8 +204,13 @@ class CONTENT_EXPORT FileAPIMessageFilter : public BrowserMessageFilter { bool complete); void DidOpenFileSystem(int request_id, base::PlatformFileError result, - const std::string& name, + const std::string& filesystem_name, const GURL& root); + void DidResolveURL(int request_id, + base::PlatformFileError result, + const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, + bool is_directory); void DidDeleteFileSystem(int request_id, base::PlatformFileError result); void DidCreateSnapshot( diff --git a/content/child/fileapi/file_system_dispatcher.cc b/content/child/fileapi/file_system_dispatcher.cc index c564f8d..fa73ad1 100644 --- a/content/child/fileapi/file_system_dispatcher.cc +++ b/content/child/fileapi/file_system_dispatcher.cc @@ -10,6 +10,7 @@ #include "base/process/process.h" #include "content/child/child_thread.h" #include "content/common/fileapi/file_system_messages.h" +#include "webkit/common/fileapi/file_system_info.h" namespace content { @@ -20,6 +21,7 @@ class FileSystemDispatcher::CallbackDispatcher { typedef FileSystemDispatcher::MetadataCallback MetadataCallback; typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; + typedef FileSystemDispatcher::ResolveURLCallback ResolveURLCallback; typedef FileSystemDispatcher::WriteCallback WriteCallback; typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; @@ -57,6 +59,13 @@ class FileSystemDispatcher::CallbackDispatcher { dispatcher->error_callback_ = error_callback; return dispatcher; } + static CallbackDispatcher* Create(const ResolveURLCallback& callback, + const StatusCallback& error_callback) { + CallbackDispatcher* dispatcher = new CallbackDispatcher; + dispatcher->resolve_callback_ = callback; + dispatcher->error_callback_ = error_callback; + return dispatcher; + } static CallbackDispatcher* Create(const WriteCallback& callback, const StatusCallback& error_callback) { CallbackDispatcher* dispatcher = new CallbackDispatcher; @@ -105,6 +114,12 @@ class FileSystemDispatcher::CallbackDispatcher { filesystem_callback_.Run(name, root); } + void DidResolveURL(const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, + bool is_directory) { + resolve_callback_.Run(info, file_path, is_directory); + } + void DidWrite(int64 bytes, bool complete) { write_callback_.Run(bytes, complete); } @@ -123,6 +138,7 @@ class FileSystemDispatcher::CallbackDispatcher { CreateSnapshotFileCallback snapshot_callback_; ReadDirectoryCallback directory_callback_; OpenFileSystemCallback filesystem_callback_; + ResolveURLCallback resolve_callback_; WriteCallback write_callback_; OpenFileCallback open_callback_; @@ -150,6 +166,7 @@ bool FileSystemDispatcher::OnMessageReceived(const IPC::Message& msg) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(FileSystemDispatcher, msg) IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFileSystem, OnDidOpenFileSystem) + IPC_MESSAGE_HANDLER(FileSystemMsg_DidResolveURL, OnDidResolveURL) IPC_MESSAGE_HANDLER(FileSystemMsg_DidSucceed, OnDidSucceed) IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadDirectory, OnDidReadDirectory) IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadMetadata, OnDidReadMetadata) @@ -174,6 +191,16 @@ void FileSystemDispatcher::OpenFileSystem( request_id, origin_url, type, size, create)); } +void FileSystemDispatcher::ResolveURL( + const GURL& filesystem_url, + const ResolveURLCallback& success_callback, + const StatusCallback& error_callback) { + int request_id = dispatchers_.Add( + CallbackDispatcher::Create(success_callback, error_callback)); + ChildThread::current()->Send(new FileSystemHostMsg_ResolveURL( + request_id, filesystem_url)); +} + void FileSystemDispatcher::DeleteFileSystem( const GURL& origin_url, fileapi::FileSystemType type, @@ -362,6 +389,17 @@ void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, dispatchers_.Remove(request_id); } +void FileSystemDispatcher::OnDidResolveURL(int request_id, + const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, + bool is_directory) { + DCHECK(info.root_url.is_valid()); + CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); + DCHECK(dispatcher); + dispatcher->DidResolveURL(info, file_path, is_directory); + dispatchers_.Remove(request_id); +} + void FileSystemDispatcher::OnDidSucceed(int request_id) { CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); DCHECK(dispatcher); diff --git a/content/child/fileapi/file_system_dispatcher.h b/content/child/fileapi/file_system_dispatcher.h index f3957c3..72ecee6 100644 --- a/content/child/fileapi/file_system_dispatcher.h +++ b/content/child/fileapi/file_system_dispatcher.h @@ -24,6 +24,7 @@ struct PlatformFileInfo; namespace fileapi { struct DirectoryEntry; +struct FileSystemInfo; } class GURL; @@ -49,6 +50,10 @@ class FileSystemDispatcher : public IPC::Listener { const std::string& name, const GURL& root)> OpenFileSystemCallback; typedef base::Callback<void( + const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, + bool is_directory)> ResolveURLCallback; + typedef base::Callback<void( int64 bytes, bool complete)> WriteCallback; typedef base::Callback<void( @@ -68,6 +73,9 @@ class FileSystemDispatcher : public IPC::Listener { bool create, const OpenFileSystemCallback& success_callback, const StatusCallback& error_callback); + void ResolveURL(const GURL& filesystem_url, + const ResolveURLCallback& success_callback, + const StatusCallback& error_callback); void DeleteFileSystem(const GURL& origin_url, fileapi::FileSystemType type, const StatusCallback& callback); @@ -144,6 +152,10 @@ class FileSystemDispatcher : public IPC::Listener { void OnDidOpenFileSystem(int request_id, const std::string& name, const GURL& root); + void OnDidResolveURL(int request_id, + const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, + bool is_directory); void OnDidSucceed(int request_id); void OnDidReadMetadata(int request_id, const base::PlatformFileInfo& file_info); diff --git a/content/child/fileapi/webfilesystem_impl.cc b/content/child/fileapi/webfilesystem_impl.cc index ac91214..ae3be406 100644 --- a/content/child/fileapi/webfilesystem_impl.cc +++ b/content/child/fileapi/webfilesystem_impl.cc @@ -154,6 +154,21 @@ void OpenFileSystemCallbackAdapter( MakeTuple(UTF8ToUTF16(name), root)); } +void ResolveURLCallbackAdapter( + int thread_id, int callbacks_id, + WaitableCallbackResults* waitable_results, + const fileapi::FileSystemInfo& info, + const base::FilePath& file_path, bool is_directory) { + base::FilePath normalized_path( + fileapi::VirtualPath::GetNormalizedFilePath(file_path)); + CallbackFileSystemCallbacks( + thread_id, callbacks_id, waitable_results, + &WebFileSystemCallbacks::didResolveURL, + MakeTuple(UTF8ToUTF16(info.name), info.root_url, + static_cast<WebKit::WebFileSystemType>(info.mount_type), + normalized_path.AsUTF16Unsafe(), is_directory)); +} + void StatusCallbackAdapter(int thread_id, int callbacks_id, WaitableCallbackResults* waitable_results, base::PlatformFileError error) { @@ -332,6 +347,25 @@ void WebFileSystemImpl::openFileSystem( make_scoped_ptr(waitable_results)); } +void WebFileSystemImpl::resolveURL( + const WebKit::WebURL& filesystem_url, + WebFileSystemCallbacks callbacks) { + int callbacks_id = RegisterCallbacks(callbacks); + WaitableCallbackResults* waitable_results = + WaitableCallbackResults::MaybeCreate(callbacks); + CallDispatcherOnMainThread( + main_thread_loop_.get(), + &FileSystemDispatcher::ResolveURL, + MakeTuple(GURL(filesystem_url), + base::Bind(&ResolveURLCallbackAdapter, + CurrentWorkerId(), callbacks_id, + base::Unretained(waitable_results)), + base::Bind(&StatusCallbackAdapter, + CurrentWorkerId(), callbacks_id, + base::Unretained(waitable_results))), + make_scoped_ptr(waitable_results)); +} + void WebFileSystemImpl::deleteFileSystem( const WebKit::WebURL& storage_partition, WebKit::WebFileSystemType type, @@ -481,7 +515,7 @@ void WebFileSystemImpl::fileExists( MakeTuple(GURL(path), false /* directory */, base::Bind(&StatusCallbackAdapter, CurrentWorkerId(), callbacks_id, -base::Unretained(waitable_results))), + base::Unretained(waitable_results))), make_scoped_ptr(waitable_results)); } diff --git a/content/child/fileapi/webfilesystem_impl.h b/content/child/fileapi/webfilesystem_impl.h index 7550545..8f390ff 100644 --- a/content/child/fileapi/webfilesystem_impl.h +++ b/content/child/fileapi/webfilesystem_impl.h @@ -54,6 +54,9 @@ class WebFileSystemImpl const WebKit::WebFileSystemType type, bool create, WebKit::WebFileSystemCallbacks); + virtual void resolveURL( + const WebKit::WebURL& filesystem_url, + WebKit::WebFileSystemCallbacks) OVERRIDE; virtual void deleteFileSystem( const WebKit::WebURL& storage_partition, const WebKit::WebFileSystemType type, diff --git a/content/common/fileapi/file_system_messages.h b/content/common/fileapi/file_system_messages.h index e277e33..191bf9d 100644 --- a/content/common/fileapi/file_system_messages.h +++ b/content/common/fileapi/file_system_messages.h @@ -9,6 +9,7 @@ #include "ipc/ipc_platform_file.h" #include "url/gurl.h" #include "webkit/common/fileapi/directory_entry.h" +#include "webkit/common/fileapi/file_system_info.h" #include "webkit/common/fileapi/file_system_types.h" #include "webkit/common/quota/quota_types.h" @@ -21,6 +22,12 @@ IPC_STRUCT_TRAITS_BEGIN(fileapi::DirectoryEntry) IPC_STRUCT_TRAITS_MEMBER(is_directory) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(fileapi::FileSystemInfo) + IPC_STRUCT_TRAITS_MEMBER(name) + IPC_STRUCT_TRAITS_MEMBER(root_url) + IPC_STRUCT_TRAITS_MEMBER(mount_type) +IPC_STRUCT_TRAITS_END() + IPC_ENUM_TRAITS(fileapi::FileSystemType) IPC_ENUM_TRAITS(quota::QuotaLimitType) @@ -33,6 +40,11 @@ IPC_MESSAGE_CONTROL3(FileSystemMsg_DidOpenFileSystem, GURL /* root_url */) // WebFileSystem response messages. +IPC_MESSAGE_CONTROL4(FileSystemMsg_DidResolveURL, + int /* request_id */, + fileapi::FileSystemInfo /* filesystem_info */, + base::FilePath /* file_path */, + bool /* is_directory */) IPC_MESSAGE_CONTROL1(FileSystemMsg_DidSucceed, int /* request_id */) IPC_MESSAGE_CONTROL2(FileSystemMsg_DidReadMetadata, @@ -69,6 +81,11 @@ IPC_MESSAGE_CONTROL5(FileSystemHostMsg_Open, int64 /* requested_size */, bool /* create */) +// WevFrameClient::resolveURL() message. +IPC_MESSAGE_CONTROL2(FileSystemHostMsg_ResolveURL, + int /* request_id */, + GURL /* filesystem_url */) + // WebFrameClient::deleteFileSystem() message. IPC_MESSAGE_CONTROL3(FileSystemHostMsg_DeleteFileSystem, int /* request_id */, |