summaryrefslogtreecommitdiffstats
path: root/webkit/fileapi
diff options
context:
space:
mode:
authorericu@google.com <ericu@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-16 00:02:53 +0000
committerericu@google.com <ericu@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-16 00:02:53 +0000
commit07c3d212963a1638659c4130f05bd5196957b2f6 (patch)
treef9fcfd54a7e26b443b1b941f80475725cb4d79cd /webkit/fileapi
parent5800f19aa9967928eca31752678ac7d8e4e0cd1d (diff)
downloadchromium_src-07c3d212963a1638659c4130f05bd5196957b2f6.zip
chromium_src-07c3d212963a1638659c4130f05bd5196957b2f6.tar.gz
chromium_src-07c3d212963a1638659c4130f05bd5196957b2f6.tar.bz2
Let Pepper open FileSystem files again.
TEST=none [existing tests, but they're not currently run automatically] BUG=none Review URL: http://codereview.chromium.org/6850027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81837 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi')
-rw-r--r--webkit/fileapi/file_system_callback_dispatcher.h11
-rw-r--r--webkit/fileapi/file_system_operation.cc57
-rw-r--r--webkit/fileapi/file_system_operation.h14
3 files changed, 82 insertions, 0 deletions
diff --git a/webkit/fileapi/file_system_callback_dispatcher.h b/webkit/fileapi/file_system_callback_dispatcher.h
index 8504af9..c32e333 100644
--- a/webkit/fileapi/file_system_callback_dispatcher.h
+++ b/webkit/fileapi/file_system_callback_dispatcher.h
@@ -8,6 +8,9 @@
#include <vector>
#include "base/file_util_proxy.h"
+#include "base/logging.h"
+#include "base/platform_file.h"
+#include "base/process.h"
class GURL;
@@ -50,6 +53,14 @@ class FileSystemCallbackDispatcher {
// Callback for FileWriter's write() call.
virtual void DidWrite(int64 bytes, bool complete) = 0;
+
+ // Callback for OpenFile. This isn't in WebFileSystemCallbacks, as it's just
+ // for Pepper.
+ virtual void DidOpenFile(
+ base::PlatformFile file,
+ base::ProcessHandle peer_handle) {
+ NOTREACHED();
+ }
};
} // namespace fileapi
diff --git a/webkit/fileapi/file_system_operation.cc b/webkit/fileapi/file_system_operation.cc
index 0e258c1..e242e86 100644
--- a/webkit/fileapi/file_system_operation.cc
+++ b/webkit/fileapi/file_system_operation.cc
@@ -375,6 +375,52 @@ void FileSystemOperation::TouchFile(const GURL& path,
callback_factory_.NewCallback(&FileSystemOperation::DidTouchFile));
}
+void FileSystemOperation::OpenFile(const GURL& path,
+ int file_flags,
+ base::ProcessHandle peer_handle) {
+#ifndef NDEBUG
+ DCHECK(kOperationNone == pending_operation_);
+ pending_operation_ = kOperationOpenFile;
+#endif
+
+ peer_handle_ = peer_handle;
+ FilePath virtual_path;
+ GURL origin_url;
+ FileSystemType type;
+ if (file_flags & (
+ (base::PLATFORM_FILE_ENUMERATE | base::PLATFORM_FILE_TEMPORARY |
+ base::PLATFORM_FILE_HIDDEN))) {
+ delete this;
+ return;
+ }
+ if (file_flags &
+ (base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_OPEN_ALWAYS |
+ base::PLATFORM_FILE_CREATE_ALWAYS |
+ base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_EXCLUSIVE_WRITE |
+ 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)) {
+ delete this;
+ return;
+ }
+ } else {
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ delete this;
+ return;
+ }
+ }
+ file_system_operation_context_.set_src_origin_url(origin_url);
+ file_system_operation_context_.set_src_type(type);
+ FileSystemFileUtilProxy::CreateOrOpen(
+ file_system_operation_context_,
+ proxy_,
+ virtual_path,
+ file_flags,
+ callback_factory_.NewCallback(
+ &FileSystemOperation::DidOpenFile));
+}
+
// We can only get here on a write or truncate that's not yet completed.
// We don't support cancelling any other operation at this time.
void FileSystemOperation::Cancel(FileSystemOperation* cancel_operation_ptr) {
@@ -527,6 +573,17 @@ void FileSystemOperation::DidTouchFile(base::PlatformFileError rv) {
delete this;
}
+void FileSystemOperation::DidOpenFile(
+ base::PlatformFileError rv,
+ base::PassPlatformFile file,
+ bool unused) {
+ if (rv == base::PLATFORM_FILE_OK)
+ dispatcher_->DidOpenFile(file.ReleaseValue(), peer_handle_);
+ else
+ dispatcher_->DidFail(rv);
+ delete this;
+}
+
void FileSystemOperation::OnFileOpenedForWrite(
base::PlatformFileError rv,
base::PassPlatformFile file,
diff --git a/webkit/fileapi/file_system_operation.h b/webkit/fileapi/file_system_operation.h
index 8ca3be5..c726403 100644
--- a/webkit/fileapi/file_system_operation.h
+++ b/webkit/fileapi/file_system_operation.h
@@ -15,6 +15,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop_proxy.h"
#include "base/platform_file.h"
+#include "base/process.h"
#include "googleurl/src/gurl.h"
#include "webkit/fileapi/file_system_types.h"
#include "webkit/fileapi/file_system_operation_context.h"
@@ -79,6 +80,10 @@ class FileSystemOperation {
void TouchFile(const GURL& path,
const base::Time& last_access_time,
const base::Time& last_modified_time);
+ void OpenFile(
+ const GURL& path,
+ int file_flags,
+ base::ProcessHandle peer_handle);
// Try to cancel the current operation [we support cancelling write or
// truncate only]. Report failure for the current operation, then tell the
@@ -129,6 +134,10 @@ class FileSystemOperation {
int64 bytes,
bool complete);
void DidTouchFile(base::PlatformFileError rv);
+ void DidOpenFile(
+ base::PlatformFileError rv,
+ base::PassPlatformFile file,
+ bool created);
// Helper for Write().
void OnFileOpenedForWrite(
@@ -184,6 +193,7 @@ class FileSystemOperation {
kOperationWrite,
kOperationTruncate,
kOperationTouchFile,
+ kOperationOpenFile,
kOperationCancel,
};
@@ -206,6 +216,10 @@ class FileSystemOperation {
scoped_ptr<net::URLRequest> blob_request_;
scoped_ptr<FileSystemOperation> cancel_operation_;
+ // Used only by OpenFile, in order to clone the file handle back to the
+ // requesting process.
+ base::ProcessHandle peer_handle_;
+
DISALLOW_COPY_AND_ASSIGN(FileSystemOperation);
};