Index: third_party/WebKit/Source/modules/filesystem/FileSystemCallbacks.cpp |
diff --git a/third_party/WebKit/Source/modules/filesystem/FileSystemCallbacks.cpp b/third_party/WebKit/Source/modules/filesystem/FileSystemCallbacks.cpp |
index d4c1a0434f7f7dd0471d7be5127a6547f45dbbbe..133ec39fd7933d845947a41e334fb1098e4a8ad1 100644 |
--- a/third_party/WebKit/Source/modules/filesystem/FileSystemCallbacks.cpp |
+++ b/third_party/WebKit/Source/modules/filesystem/FileSystemCallbacks.cpp |
@@ -56,7 +56,7 @@ |
namespace blink { |
-FileSystemCallbacksBase::FileSystemCallbacksBase(ErrorCallback* errorCallback, DOMFileSystemBase* fileSystem, ExecutionContext* context) |
+FileSystemCallbacksBase::FileSystemCallbacksBase(ErrorCallbackBase* errorCallback, DOMFileSystemBase* fileSystem, ExecutionContext* context) |
: m_errorCallback(errorCallback) |
, m_fileSystem(fileSystem) |
, m_executionContext(context) |
@@ -74,7 +74,7 @@ FileSystemCallbacksBase::~FileSystemCallbacksBase() |
void FileSystemCallbacksBase::didFail(int code) |
{ |
if (m_errorCallback) |
- handleEventOrScheduleCallback(m_errorCallback.release(), FileError::create(static_cast<FileError::ErrorCode>(code))); |
+ invokeOrScheduleCallback(m_errorCallback.release(), static_cast<FileError::ErrorCode>(code)); |
} |
bool FileSystemCallbacksBase::shouldScheduleCallback() const |
@@ -83,9 +83,22 @@ bool FileSystemCallbacksBase::shouldScheduleCallback() const |
} |
template <typename CB, typename CBArg> |
+void FileSystemCallbacksBase::invokeOrScheduleCallback(CB* callback, CBArg arg) |
+{ |
+ DCHECK(callback); |
+ if (callback) { |
+ if (shouldScheduleCallback()) |
+ DOMFileSystem::scheduleCallback(m_executionContext.get(), createSameThreadTask(&CB::invoke, wrapPersistent(callback), arg)); |
+ else |
+ callback->invoke(arg); |
+ } |
+ m_executionContext.clear(); |
+} |
+ |
+template <typename CB, typename CBArg> |
void FileSystemCallbacksBase::handleEventOrScheduleCallback(CB* callback, CBArg* arg) |
{ |
- ASSERT(callback); |
+ DCHECK(callback); |
if (callback) { |
if (shouldScheduleCallback()) |
DOMFileSystem::scheduleCallback(m_executionContext.get(), createSameThreadTask(&CB::handleEvent, wrapPersistent(callback), wrapPersistent(arg))); |
@@ -98,7 +111,7 @@ void FileSystemCallbacksBase::handleEventOrScheduleCallback(CB* callback, CBArg* |
template <typename CB> |
void FileSystemCallbacksBase::handleEventOrScheduleCallback(CB* callback) |
{ |
- ASSERT(callback); |
+ DCHECK(callback); |
if (callback) { |
if (shouldScheduleCallback()) |
DOMFileSystem::scheduleCallback(m_executionContext.get(), createSameThreadTask(&CB::handleEvent, wrapPersistent(callback))); |
@@ -108,14 +121,43 @@ void FileSystemCallbacksBase::handleEventOrScheduleCallback(CB* callback) |
m_executionContext.clear(); |
} |
+// ScriptErrorCallback -------------------------------------------------------- |
+ |
+// static |
+ScriptErrorCallback* ScriptErrorCallback::wrap(ErrorCallback* callback) |
+{ |
+ // DOMFileSystem operations take an optional (nullable) callback. If a |
+ // script callback was not passed, don't bother creating a dummy wrapper |
+ // and checking during invoke(). |
+ if (!callback) |
+ return nullptr; |
+ return new ScriptErrorCallback(callback); |
+} |
+ |
+DEFINE_TRACE(ScriptErrorCallback) |
+{ |
+ ErrorCallbackBase::trace(visitor); |
+ visitor->trace(m_callback); |
+} |
+ |
+void ScriptErrorCallback::invoke(FileError::ErrorCode error) |
+{ |
+ m_callback->handleEvent(FileError::createDOMException(error)); |
+}; |
+ |
+ScriptErrorCallback::ScriptErrorCallback(ErrorCallback* callback) |
+ : m_callback(callback) |
+{ |
+} |
+ |
// EntryCallbacks ------------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> EntryCallbacks::create(EntryCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem, const String& expectedPath, bool isDirectory) |
+std::unique_ptr<AsyncFileSystemCallbacks> EntryCallbacks::create(EntryCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem, const String& expectedPath, bool isDirectory) |
{ |
return wrapUnique(new EntryCallbacks(successCallback, errorCallback, context, fileSystem, expectedPath, isDirectory)); |
} |
-EntryCallbacks::EntryCallbacks(EntryCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem, const String& expectedPath, bool isDirectory) |
+EntryCallbacks::EntryCallbacks(EntryCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem, const String& expectedPath, bool isDirectory) |
: FileSystemCallbacksBase(errorCallback, fileSystem, context) |
, m_successCallback(successCallback) |
, m_expectedPath(expectedPath) |
@@ -135,12 +177,12 @@ void EntryCallbacks::didSucceed() |
// EntriesCallbacks ----------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> EntriesCallbacks::create(EntriesCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DirectoryReaderBase* directoryReader, const String& basePath) |
+std::unique_ptr<AsyncFileSystemCallbacks> EntriesCallbacks::create(EntriesCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DirectoryReaderBase* directoryReader, const String& basePath) |
{ |
return wrapUnique(new EntriesCallbacks(successCallback, errorCallback, context, directoryReader, basePath)); |
} |
-EntriesCallbacks::EntriesCallbacks(EntriesCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DirectoryReaderBase* directoryReader, const String& basePath) |
+EntriesCallbacks::EntriesCallbacks(EntriesCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DirectoryReaderBase* directoryReader, const String& basePath) |
: FileSystemCallbacksBase(errorCallback, directoryReader->filesystem(), context) |
, m_successCallback(successCallback) |
, m_directoryReader(directoryReader) |
@@ -169,12 +211,12 @@ void EntriesCallbacks::didReadDirectoryEntries(bool hasMore) |
// FileSystemCallbacks -------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> FileSystemCallbacks::create(FileSystemCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, FileSystemType type) |
+std::unique_ptr<AsyncFileSystemCallbacks> FileSystemCallbacks::create(FileSystemCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, FileSystemType type) |
{ |
return wrapUnique(new FileSystemCallbacks(successCallback, errorCallback, context, type)); |
} |
-FileSystemCallbacks::FileSystemCallbacks(FileSystemCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, FileSystemType type) |
+FileSystemCallbacks::FileSystemCallbacks(FileSystemCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, FileSystemType type) |
: FileSystemCallbacksBase(errorCallback, nullptr, context) |
, m_successCallback(successCallback) |
, m_type(type) |
@@ -189,12 +231,12 @@ void FileSystemCallbacks::didOpenFileSystem(const String& name, const KURL& root |
// ResolveURICallbacks -------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> ResolveURICallbacks::create(EntryCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context) |
+std::unique_ptr<AsyncFileSystemCallbacks> ResolveURICallbacks::create(EntryCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context) |
{ |
return wrapUnique(new ResolveURICallbacks(successCallback, errorCallback, context)); |
} |
-ResolveURICallbacks::ResolveURICallbacks(EntryCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context) |
+ResolveURICallbacks::ResolveURICallbacks(EntryCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context) |
: FileSystemCallbacksBase(errorCallback, nullptr, context) |
, m_successCallback(successCallback) |
{ |
@@ -207,7 +249,7 @@ void ResolveURICallbacks::didResolveURL(const String& name, const KURL& rootURL, |
String absolutePath; |
if (!DOMFileSystemBase::pathToAbsolutePath(type, root, filePath, absolutePath)) { |
- handleEventOrScheduleCallback(m_errorCallback.release(), FileError::create(FileError::INVALID_MODIFICATION_ERR)); |
+ invokeOrScheduleCallback(m_errorCallback.release(), FileError::INVALID_MODIFICATION_ERR); |
return; |
} |
@@ -219,12 +261,12 @@ void ResolveURICallbacks::didResolveURL(const String& name, const KURL& rootURL, |
// MetadataCallbacks ---------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> MetadataCallbacks::create(MetadataCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
+std::unique_ptr<AsyncFileSystemCallbacks> MetadataCallbacks::create(MetadataCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
{ |
return wrapUnique(new MetadataCallbacks(successCallback, errorCallback, context, fileSystem)); |
} |
-MetadataCallbacks::MetadataCallbacks(MetadataCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
+MetadataCallbacks::MetadataCallbacks(MetadataCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
: FileSystemCallbacksBase(errorCallback, fileSystem, context) |
, m_successCallback(successCallback) |
{ |
@@ -238,12 +280,12 @@ void MetadataCallbacks::didReadMetadata(const FileMetadata& metadata) |
// FileWriterBaseCallbacks ---------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> FileWriterBaseCallbacks::create(FileWriterBase* fileWriter, FileWriterBaseCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context) |
+std::unique_ptr<AsyncFileSystemCallbacks> FileWriterBaseCallbacks::create(FileWriterBase* fileWriter, FileWriterBaseCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context) |
{ |
return wrapUnique(new FileWriterBaseCallbacks(fileWriter, successCallback, errorCallback, context)); |
} |
-FileWriterBaseCallbacks::FileWriterBaseCallbacks(FileWriterBase* fileWriter, FileWriterBaseCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context) |
+FileWriterBaseCallbacks::FileWriterBaseCallbacks(FileWriterBase* fileWriter, FileWriterBaseCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context) |
: FileSystemCallbacksBase(errorCallback, nullptr, context) |
, m_fileWriter(fileWriter) |
, m_successCallback(successCallback) |
@@ -259,12 +301,12 @@ void FileWriterBaseCallbacks::didCreateFileWriter(std::unique_ptr<WebFileWriter> |
// SnapshotFileCallback ------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> SnapshotFileCallback::create(DOMFileSystemBase* filesystem, const String& name, const KURL& url, BlobCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context) |
+std::unique_ptr<AsyncFileSystemCallbacks> SnapshotFileCallback::create(DOMFileSystemBase* filesystem, const String& name, const KURL& url, BlobCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context) |
{ |
return wrapUnique(new SnapshotFileCallback(filesystem, name, url, successCallback, errorCallback, context)); |
} |
-SnapshotFileCallback::SnapshotFileCallback(DOMFileSystemBase* filesystem, const String& name, const KURL& url, BlobCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context) |
+SnapshotFileCallback::SnapshotFileCallback(DOMFileSystemBase* filesystem, const String& name, const KURL& url, BlobCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context) |
: FileSystemCallbacksBase(errorCallback, filesystem, context) |
, m_name(name) |
, m_url(url) |
@@ -287,12 +329,12 @@ void SnapshotFileCallback::didCreateSnapshotFile(const FileMetadata& metadata, P |
// VoidCallbacks -------------------------------------------------------------- |
-std::unique_ptr<AsyncFileSystemCallbacks> VoidCallbacks::create(VoidCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
+std::unique_ptr<AsyncFileSystemCallbacks> VoidCallbacks::create(VoidCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
{ |
return wrapUnique(new VoidCallbacks(successCallback, errorCallback, context, fileSystem)); |
} |
-VoidCallbacks::VoidCallbacks(VoidCallback* successCallback, ErrorCallback* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
+VoidCallbacks::VoidCallbacks(VoidCallback* successCallback, ErrorCallbackBase* errorCallback, ExecutionContext* context, DOMFileSystemBase* fileSystem) |
: FileSystemCallbacksBase(errorCallback, fileSystem, context) |
, m_successCallback(successCallback) |
{ |