Index: Source/modules/filesystem/LocalFileSystem.cpp |
diff --git a/Source/modules/filesystem/LocalFileSystem.cpp b/Source/modules/filesystem/LocalFileSystem.cpp |
index 98d046d5beecfa556938bcf35821c9b5f255a86a..cdf4609a485df539e45586cdde694f7bc209f453 100644 |
--- a/Source/modules/filesystem/LocalFileSystem.cpp |
+++ b/Source/modules/filesystem/LocalFileSystem.cpp |
@@ -41,8 +41,10 @@ |
#include "modules/filesystem/FileSystemClient.h" |
#include "modules/filesystem/InspectorFileSystemAgent.h" |
#include "platform/AsyncFileSystemCallbacks.h" |
+#include "platform/PermissionCallbacks.h" |
#include "public/platform/Platform.h" |
#include "public/platform/WebFileSystem.h" |
+#include "wtf/Functional.h" |
namespace WebCore { |
@@ -64,34 +66,86 @@ LocalFileSystem::~LocalFileSystem() |
{ |
} |
-void LocalFileSystem::resolveURL(ExecutionContext* context, const KURL& fileSystemURL, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) |
+void LocalFileSystem::resolveURL(PassRefPtr<ExecutionContext> context, const KURL& fileSystemURL, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) |
{ |
- if (!client() || !client()->allowFileSystem(context)) { |
- context->postTask(createCallbackTask(&fileSystemNotAllowed, callbacks)); |
+ RefPtr<ExecutionContext> contextPtr = context; |
+ if (!client()) { |
+ fileSystemNotAllowedInternal(contextPtr, callbacks); |
return; |
} |
- blink::Platform::current()->fileSystem()->resolveURL(fileSystemURL, callbacks); |
+ ASSERT(contextPtr); |
+ if (!contextPtr->isDocument()) { |
+ if (!client()->requestFileSystemAccessSync(contextPtr.get())) { |
+ fileSystemNotAllowedInternal(contextPtr, callbacks); |
+ return; |
+ } |
+ resolveURLInternal(fileSystemURL, callbacks); |
+ return; |
+ } |
+ client()->requestFileSystemAccessAsync(contextPtr.get(), PermissionCallbacks::create( |
+ bind(&LocalFileSystem::resolveURLInternal, this, fileSystemURL, callbacks), |
+ bind(&LocalFileSystem::fileSystemNotAllowedInternal, this, contextPtr, callbacks))); |
kinuko
2014/05/19 09:02:46
I think these patterns can be probably implemented
Xi Han
2014/05/20 16:13:32
Done.
|
} |
-void LocalFileSystem::requestFileSystem(ExecutionContext* context, FileSystemType type, long long size, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) |
+void LocalFileSystem::requestFileSystem(PassRefPtr<ExecutionContext> context, FileSystemType type, long long size, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) |
{ |
- if (!client() || !client()->allowFileSystem(context)) { |
- context->postTask(createCallbackTask(&fileSystemNotAllowed, callbacks)); |
+ RefPtr<ExecutionContext> contextPtr = context; |
+ if (!client()) { |
+ fileSystemNotAllowedInternal(contextPtr, callbacks); |
return; |
} |
- KURL storagePartition = KURL(KURL(), context->securityOrigin()->toString()); |
- blink::Platform::current()->fileSystem()->openFileSystem(storagePartition, static_cast<blink::WebFileSystemType>(type), callbacks); |
+ ASSERT(contextPtr); |
+ if (!contextPtr->isDocument()) { |
+ if (!client()->requestFileSystemAccessSync(contextPtr.get())) { |
+ fileSystemNotAllowedInternal(contextPtr, callbacks); |
+ return; |
+ } |
+ fileSystemAllowedInternal(contextPtr, type, callbacks); |
+ return; |
+ } |
+ client()->requestFileSystemAccessAsync(contextPtr.get(), PermissionCallbacks::create( |
+ bind(&LocalFileSystem::fileSystemAllowedInternal, this, contextPtr, type, callbacks), |
+ bind(&LocalFileSystem::fileSystemNotAllowedInternal, this, contextPtr, callbacks))); |
} |
-void LocalFileSystem::deleteFileSystem(ExecutionContext* context, FileSystemType type, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) |
+void LocalFileSystem::deleteFileSystem(PassRefPtr<ExecutionContext> context, FileSystemType type, PassOwnPtr<AsyncFileSystemCallbacks> callbacks) |
{ |
- ASSERT(context); |
- ASSERT_WITH_SECURITY_IMPLICATION(context->isDocument()); |
- |
- if (!client() || !client()->allowFileSystem(context)) { |
- context->postTask(createCallbackTask(&fileSystemNotAllowed, callbacks)); |
+ RefPtr<ExecutionContext> contextPtr = context; |
+ ASSERT(contextPtr); |
+ ASSERT_WITH_SECURITY_IMPLICATION(contextPtr->isDocument()); |
+ if (!client()) { |
+ fileSystemNotAllowedInternal(contextPtr, callbacks); |
return; |
} |
+ client()->requestFileSystemAccessAsync(contextPtr.get(), PermissionCallbacks::create( |
+ bind(&LocalFileSystem::deleteFileSystemInternal, this, contextPtr, type, callbacks), |
+ bind(&LocalFileSystem::fileSystemNotAllowedInternal, this, contextPtr, callbacks))); |
+} |
+ |
+void LocalFileSystem::fileSystemNotAllowedInternal( |
+ PassRefPtr<ExecutionContext> context, |
+ PassOwnPtr<AsyncFileSystemCallbacks> callbacks) { |
+ context->postTask(createCallbackTask(&fileSystemNotAllowed, callbacks)); |
+} |
+ |
+void LocalFileSystem::fileSystemAllowedInternal( |
+ PassRefPtr<ExecutionContext> context, |
+ FileSystemType type, |
+ PassOwnPtr<AsyncFileSystemCallbacks> callbacks) { |
+ KURL storagePartition = KURL(KURL(), context->securityOrigin()->toString()); |
+ blink::Platform::current()->fileSystem()->openFileSystem(storagePartition, static_cast<blink::WebFileSystemType>(type), callbacks); |
+} |
+ |
+void LocalFileSystem::resolveURLInternal( |
+ const KURL& fileSystemURL, |
+ PassOwnPtr<AsyncFileSystemCallbacks> callbacks) { |
+ blink::Platform::current()->fileSystem()->resolveURL(fileSystemURL, callbacks); |
+} |
+ |
+void LocalFileSystem::deleteFileSystemInternal( |
+ PassRefPtr<ExecutionContext> context, |
+ FileSystemType type, |
+ PassOwnPtr<AsyncFileSystemCallbacks> callbacks) { |
KURL storagePartition = KURL(KURL(), context->securityOrigin()->toString()); |
blink::Platform::current()->fileSystem()->deleteFileSystem(storagePartition, static_cast<blink::WebFileSystemType>(type), callbacks); |
} |