Index: webkit/tools/test_shell/simple_file_system.cc |
diff --git a/webkit/tools/test_shell/simple_file_system.cc b/webkit/tools/test_shell/simple_file_system.cc |
index 520f709caffbd72f61b12ef8885301b0ca24708e..29ea45e323209318487e565344ed9ac70bf17813 100644 |
--- a/webkit/tools/test_shell/simple_file_system.cc |
+++ b/webkit/tools/test_shell/simple_file_system.cc |
@@ -6,58 +6,85 @@ |
#include "base/file_path.h" |
#include "base/message_loop_proxy.h" |
+#include "base/scoped_callback_factory.h" |
#include "base/time.h" |
+#include "base/utf_string_conversions.h" |
+#include "googleurl/src/gurl.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebFileInfo.h" |
+#include "third_party/WebKit/WebKit/chromium/public/WebFileSystemCallbacks.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebFileSystemEntry.h" |
+#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" |
+#include "third_party/WebKit/WebKit/chromium/public/WebSecurityOrigin.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebVector.h" |
#include "webkit/fileapi/file_system_callback_dispatcher.h" |
+#include "webkit/fileapi/file_system_path_manager.h" |
+#include "webkit/fileapi/file_system_types.h" |
+#include "webkit/fileapi/sandboxed_file_system_context.h" |
+#include "webkit/fileapi/sandboxed_file_system_operation.h" |
#include "webkit/glue/webkit_glue.h" |
#include "webkit/tools/test_shell/simple_file_writer.h" |
+using base::WeakPtr; |
+ |
using WebKit::WebFileInfo; |
+using WebKit::WebFileSystem; |
using WebKit::WebFileSystemCallbacks; |
using WebKit::WebFileSystemEntry; |
using WebKit::WebFileWriter; |
using WebKit::WebFileWriterClient; |
+using WebKit::WebFrame; |
+using WebKit::WebSecurityOrigin; |
using WebKit::WebString; |
using WebKit::WebVector; |
+using fileapi::FileSystemCallbackDispatcher; |
+using fileapi::SandboxedFileSystemContext; |
+using fileapi::SandboxedFileSystemOperation; |
+ |
namespace { |
-class TestShellFileSystemCallbackDispatcher |
- : public fileapi::FileSystemCallbackDispatcher { |
+class SimpleFileSystemCallbackDispatcher |
+ : public FileSystemCallbackDispatcher { |
public: |
- TestShellFileSystemCallbackDispatcher( |
- SimpleFileSystem* file_system, |
+ SimpleFileSystemCallbackDispatcher( |
+ const WeakPtr<SimpleFileSystem>& file_system, |
WebFileSystemCallbacks* callbacks) |
: file_system_(file_system), |
- callbacks_(callbacks), |
- request_id_(-1) { |
+ callbacks_(callbacks) { |
} |
- void set_request_id(int request_id) { request_id_ = request_id; } |
+ ~SimpleFileSystemCallbackDispatcher() { |
+ DCHECK(!operation_.get()); |
+ } |
+ |
+ void set_operation(SandboxedFileSystemOperation* operation) { |
+ operation_.reset(operation); |
+ } |
virtual void DidSucceed() { |
- callbacks_->didSucceed(); |
- file_system_->RemoveCompletedOperation(request_id_); |
+ if (file_system_) |
+ callbacks_->didSucceed(); |
+ RemoveOperation(); |
} |
virtual void DidReadMetadata(const base::PlatformFileInfo& info) { |
+ DCHECK(file_system_); |
WebFileInfo web_file_info; |
web_file_info.length = info.size; |
web_file_info.modificationTime = info.last_modified.ToDoubleT(); |
web_file_info.type = info.is_directory ? |
WebFileInfo::TypeDirectory : WebFileInfo::TypeFile; |
callbacks_->didReadMetadata(web_file_info); |
- file_system_->RemoveCompletedOperation(request_id_); |
+ RemoveOperation(); |
} |
virtual void DidReadDirectory( |
const std::vector<base::FileUtilProxy::Entry>& entries, |
bool has_more) { |
+ DCHECK(file_system_); |
std::vector<WebFileSystemEntry> web_entries_vector; |
for (std::vector<base::FileUtilProxy::Entry>::const_iterator it = |
- entries.begin(); it != entries.end(); ++it) { |
+ entries.begin(); it != entries.end(); ++it) { |
WebFileSystemEntry entry; |
entry.name = webkit_glue::FilePathStringToWebString(it->name); |
entry.isDirectory = it->is_directory; |
@@ -66,17 +93,25 @@ class TestShellFileSystemCallbackDispatcher |
WebVector<WebKit::WebFileSystemEntry> web_entries = |
web_entries_vector; |
callbacks_->didReadDirectory(web_entries, has_more); |
- file_system_->RemoveCompletedOperation(request_id_); |
+ RemoveOperation(); |
} |
- virtual void DidOpenFileSystem(const std::string&, const FilePath&) { |
- NOTREACHED(); |
+ virtual void DidOpenFileSystem( |
+ const std::string& name, const FilePath& path) { |
+ DCHECK(file_system_); |
+ if (path.empty()) |
+ callbacks_->didFail(WebKit::WebFileErrorSecurity); |
+ else |
+ callbacks_->didOpenFileSystem( |
+ UTF8ToUTF16(name), webkit_glue::FilePathToWebString(path)); |
+ RemoveOperation(); |
} |
virtual void DidFail(base::PlatformFileError error_code) { |
+ DCHECK(file_system_); |
callbacks_->didFail( |
webkit_glue::PlatformFileErrorToWebFileError(error_code)); |
- file_system_->RemoveCompletedOperation(request_id_); |
+ RemoveOperation(); |
} |
virtual void DidWrite(int64, bool) { |
@@ -84,18 +119,61 @@ class TestShellFileSystemCallbackDispatcher |
} |
private: |
- SimpleFileSystem* file_system_; |
+ void RemoveOperation() { |
+ // We need to make sure operation_ is null when we delete the operation |
+ // (which in turn deletes this dispatcher instance). |
+ scoped_ptr<SandboxedFileSystemOperation> operation; |
+ operation.swap(operation_); |
+ operation.reset(); |
+ } |
+ |
+ WeakPtr<SimpleFileSystem> file_system_; |
WebFileSystemCallbacks* callbacks_; |
- int request_id_; |
+ scoped_ptr<SandboxedFileSystemOperation> operation_; |
}; |
-} // namespace |
+} // namespace |
+ |
+SimpleFileSystem::SimpleFileSystem() { |
+ if (file_system_dir_.CreateUniqueTempDir()) { |
+ sandboxed_context_.reset(new SandboxedFileSystemContext( |
+ base::MessageLoopProxy::CreateForCurrentThread(), |
+ file_system_dir_.path(), |
+ false /* incognito */, |
+ true /* allow_file_access */, |
+ false /* unlimited_quota */)); |
+ } else { |
+ LOG(WARNING) << "Failed to create a temp dir for the filesystem." |
+ "FileSystem feature will be disabled."; |
+ } |
+} |
SimpleFileSystem::~SimpleFileSystem() { |
- // Drop all the operations. |
- for (OperationsMap::const_iterator iter(&operations_); |
- !iter.IsAtEnd(); iter.Advance()) |
- operations_.Remove(iter.GetCurrentKey()); |
+} |
+ |
+void SimpleFileSystem::OpenFileSystem( |
+ WebFrame* frame, WebFileSystem::Type web_filesystem_type, |
+ long long, bool create, |
+ WebFileSystemCallbacks* callbacks) { |
+ if (!frame || !sandboxed_context_.get()) { |
+ // The FileSystem temp directory was not initialized successfully. |
+ callbacks->didFail(WebKit::WebFileErrorSecurity); |
+ return; |
+ } |
+ |
+ fileapi::FileSystemType type; |
+ if (web_filesystem_type == WebFileSystem::TypeTemporary) |
+ type = fileapi::kFileSystemTypeTemporary; |
+ else if (web_filesystem_type == WebFileSystem::TypePersistent) |
+ type = fileapi::kFileSystemTypePersistent; |
+ else { |
+ // Unknown type filesystem is requested. |
+ callbacks->didFail(WebKit::WebFileErrorSecurity); |
+ return; |
+ } |
+ |
+ GURL origin_url(frame->securityOrigin().toString()); |
+ GetNewOperation(callbacks)->OpenFileSystem(origin_url, type, create); |
} |
void SimpleFileSystem::move( |
@@ -177,18 +255,13 @@ WebFileWriter* SimpleFileSystem::createFileWriter( |
return new SimpleFileWriter(path, client); |
} |
-fileapi::FileSystemOperation* SimpleFileSystem::GetNewOperation( |
+SandboxedFileSystemOperation* SimpleFileSystem::GetNewOperation( |
WebFileSystemCallbacks* callbacks) { |
- // This pointer will be owned by |operation|. |
- TestShellFileSystemCallbackDispatcher* dispatcher = |
- new TestShellFileSystemCallbackDispatcher(this, callbacks); |
- fileapi::FileSystemOperation* operation = new fileapi::FileSystemOperation( |
- dispatcher, base::MessageLoopProxy::CreateForCurrentThread()); |
- int32 request_id = operations_.Add(operation); |
- dispatcher->set_request_id(request_id); |
+ SimpleFileSystemCallbackDispatcher* dispatcher = |
+ new SimpleFileSystemCallbackDispatcher(AsWeakPtr(), callbacks); |
+ SandboxedFileSystemOperation* operation = new SandboxedFileSystemOperation( |
+ dispatcher, base::MessageLoopProxy::CreateForCurrentThread(), |
+ sandboxed_context_.get()); |
+ dispatcher->set_operation(operation); |
return operation; |
} |
- |
-void SimpleFileSystem::RemoveCompletedOperation(int request_id) { |
- operations_.Remove(request_id); |
-} |