[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
commit-queue at webkit.org
commit-queue at webkit.org
Wed Dec 22 16:31:42 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 61c3288fa839f36b6c43762c6742888ad4be48b0
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Nov 25 02:44:12 2010 +0000
2010-11-24 Eric Uhrhane <ericu at chromium.org>
Reviewed by David Levin.
Implement FileWriterSync
https://bugs.webkit.org/show_bug.cgi?id=49939
Tests to follow in a separate CL, once the test framework in 47680 goes in.
Build file changes to add FileWriterBase and FileWriterBaseCallback.
* CMakeLists.txt:
* GNUmakefile.am:
* WebCore.gypi:
* WebCore.pro:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
FileWriterSync doesn't turn out to need to be an ActiveDOMObject.
* bindings/scripts/CodeGeneratorV8.pm:
Added new AsyncFileWriter::waitForOperationToComplete to enable
synchronous calls.
* fileapi/AsyncFileWriter.h:
Added a way to get a FileSystemSync.
* fileapi/DOMFileSystemSync.cpp:
* fileapi/FileEntrySync.cpp:
* fileapi/FileEntrySync.h:
* fileapi/FileEntrySync.idl:
Added an error code for OK, rather than just having 0 everywhere.
* fileapi/FileError.h:
Turned FileWriterCallback into FileWriterBaseCallback.
* fileapi/FileSystemCallbacks.cpp:
* fileapi/FileSystemCallbacks.h:
Refactored out a common base class, FileWriterBase, for FileWriter and
FileWriterSync.
* fileapi/FileWriter.cpp:
* fileapi/FileWriter.h:
* fileapi/FileWriterBase.cpp: Added.
* fileapi/FileWriterBase.h: Added.
* fileapi/FileWriterBaseCallback.h: Added.
* fileapi/FileWriterSync.cpp:
* fileapi/FileWriterSync.h:
Small tweaks to deal with the base class refactoring.
* fileapi/DOMFileSystem.cpp:
* fileapi/DOMFileSystemSync.h:
Removed "CallWith=ScriptExecutionContext", as FileWriterSync doesn't actually need it.
* fileapi/FileWriterSync.idl:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72715 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/CMakeLists.txt b/WebCore/CMakeLists.txt
index 58d8066..35ac8d1 100644
--- a/WebCore/CMakeLists.txt
+++ b/WebCore/CMakeLists.txt
@@ -1695,6 +1695,7 @@ if (ENABLE_FILE_SYSTEM)
fileapi/FileEntrySync.cpp
fileapi/FileSystemCallbacks.cpp
fileapi/FileWriter.cpp
+ fileapi/FileWriterBase.cpp
fileapi/FileWriterSync.cpp
fileapi/LocalFileSystem.cpp
platform/AsyncFileSystem.cpp
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index cbea8de..7afdb69 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,57 @@
+2010-11-24 Eric Uhrhane <ericu at chromium.org>
+
+ Reviewed by David Levin.
+
+ Implement FileWriterSync
+ https://bugs.webkit.org/show_bug.cgi?id=49939
+
+ Tests to follow in a separate CL, once the test framework in 47680 goes in.
+
+ Build file changes to add FileWriterBase and FileWriterBaseCallback.
+ * CMakeLists.txt:
+ * GNUmakefile.am:
+ * WebCore.gypi:
+ * WebCore.pro:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+
+ FileWriterSync doesn't turn out to need to be an ActiveDOMObject.
+ * bindings/scripts/CodeGeneratorV8.pm:
+
+ Added new AsyncFileWriter::waitForOperationToComplete to enable
+ synchronous calls.
+ * fileapi/AsyncFileWriter.h:
+
+ Added a way to get a FileSystemSync.
+ * fileapi/DOMFileSystemSync.cpp:
+ * fileapi/FileEntrySync.cpp:
+ * fileapi/FileEntrySync.h:
+ * fileapi/FileEntrySync.idl:
+
+ Added an error code for OK, rather than just having 0 everywhere.
+ * fileapi/FileError.h:
+
+ Turned FileWriterCallback into FileWriterBaseCallback.
+ * fileapi/FileSystemCallbacks.cpp:
+ * fileapi/FileSystemCallbacks.h:
+
+ Refactored out a common base class, FileWriterBase, for FileWriter and
+ FileWriterSync.
+ * fileapi/FileWriter.cpp:
+ * fileapi/FileWriter.h:
+ * fileapi/FileWriterBase.cpp: Added.
+ * fileapi/FileWriterBase.h: Added.
+ * fileapi/FileWriterBaseCallback.h: Added.
+ * fileapi/FileWriterSync.cpp:
+ * fileapi/FileWriterSync.h:
+
+ Small tweaks to deal with the base class refactoring.
+ * fileapi/DOMFileSystem.cpp:
+ * fileapi/DOMFileSystemSync.h:
+
+ Removed "CallWith=ScriptExecutionContext", as FileWriterSync doesn't actually need it.
+ * fileapi/FileWriterSync.idl:
+
2010-11-24 Martin Robinson <mrobinson at igalia.com>
Reviewed by Xan Lopez.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index 70bcd92..33b2094 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -1466,9 +1466,12 @@ webcore_sources += \
WebCore/fileapi/FileThread.cpp \
WebCore/fileapi/FileThread.h \
WebCore/fileapi/FileThreadTask.h \
- WebCore/fileapi/FileWriterCallback.h \
WebCore/fileapi/FileWriter.cpp \
WebCore/fileapi/FileWriter.h \
+ WebCore/fileapi/FileWriterBase.cpp \
+ WebCore/fileapi/FileWriterBase.h \
+ WebCore/fileapi/FileWriterBaseCallback.h \
+ WebCore/fileapi/FileWriterCallback.h \
WebCore/fileapi/FileWriterSync.cpp \
WebCore/fileapi/FileWriterSync.h \
WebCore/fileapi/Flags.h \
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index cc553be..561fe1c 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -1535,6 +1535,9 @@
'fileapi/FileThreadTask.h',
'fileapi/FileWriter.cpp',
'fileapi/FileWriter.h',
+ 'fileapi/FileWriterBase.cpp',
+ 'fileapi/FileWriterBase.h',
+ 'fileapi/FileWriterBaseCallback.h',
'fileapi/FileWriterCallback.h',
'fileapi/FileWriterSync.cpp',
'fileapi/FileWriterSync.h',
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index 1067ce2..75b9710 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -3065,6 +3065,8 @@ contains(DEFINES, ENABLE_FILE_SYSTEM=1) {
fileapi/FileSystemCallback.h \
fileapi/FileSystemCallbacks.h \
fileapi/FileWriter.h \
+ fileapi/FileWriterBase.h \
+ fileapi/FileWriterBaseCallback.h \
fileapi/FileWriterCallback.h \
fileapi/FileWriterClient.h \
fileapi/FileWriterSync.h \
@@ -3097,6 +3099,7 @@ contains(DEFINES, ENABLE_FILE_SYSTEM=1) {
fileapi/FileEntrySync.cpp \
fileapi/FileSystemCallbacks.cpp \
fileapi/FileWriter.cpp \
+ fileapi/FileWriterBase.cpp \
fileapi/FileWriterSync.cpp \
fileapi/LocalFileSystem.cpp \
platform/AsyncFileSystem.cpp
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index 23fd4e0..19aaf5c 100755
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -49147,6 +49147,17 @@
>
</File>
<File
+ RelativePath="..\fileapi\FileWriterBase.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\fileapi\FileWriterBase.h"
+ >
+ <File
+ RelativePath="..\fileapi\FileWriterBaseCallback.h"
+ >
+ </File>
+ <File
RelativePath="..\fileapi\FileWriterCallback.h"
>
</File>
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 2316cef..e5439d2 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -975,6 +975,9 @@
46700ED0127B96CB00F5D5D6 /* FileWriterSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46700ECE127B96CB00F5D5D6 /* FileWriterSync.cpp */; };
46700ED1127B96CB00F5D5D6 /* FileWriterSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 46700ECF127B96CB00F5D5D6 /* FileWriterSync.h */; };
4689F1AF1267BAE100E8D380 /* FileMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 4689F1AE1267BAE100E8D380 /* FileMetadata.h */; };
+ 46BC724E129B104C0071C07E /* FileWriterBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46BC724B129B104C0071C07E /* FileWriterBase.cpp */; };
+ 46BC724F129B104C0071C07E /* FileWriterBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 46BC724C129B104C0071C07E /* FileWriterBase.h */; };
+ 46BC7250129B104C0071C07E /* FileWriterBaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 46BC724D129B104C0071C07E /* FileWriterBaseCallback.h */; };
46BD16E30B279473001F0839 /* noneCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 46BD16E20B279473001F0839 /* noneCursor.png */; };
46D4F2490AF97E810035385A /* cellCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 46D4F2460AF97E810035385A /* cellCursor.png */; };
46D4F24A0AF97E810035385A /* contextMenuCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 46D4F2470AF97E810035385A /* contextMenuCursor.png */; };
@@ -7079,6 +7082,9 @@
46700ECE127B96CB00F5D5D6 /* FileWriterSync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FileWriterSync.cpp; path = fileapi/FileWriterSync.cpp; sourceTree = "<group>"; };
46700ECF127B96CB00F5D5D6 /* FileWriterSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileWriterSync.h; path = fileapi/FileWriterSync.h; sourceTree = "<group>"; };
4689F1AE1267BAE100E8D380 /* FileMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileMetadata.h; path = platform/FileMetadata.h; sourceTree = "<group>"; };
+ 46BC724B129B104C0071C07E /* FileWriterBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FileWriterBase.cpp; path = fileapi/FileWriterBase.cpp; sourceTree = "<group>"; };
+ 46BC724C129B104C0071C07E /* FileWriterBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileWriterBase.h; path = fileapi/FileWriterBase.h; sourceTree = "<group>"; };
+ 46BC724D129B104C0071C07E /* FileWriterBaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileWriterBaseCallback.h; path = fileapi/FileWriterBaseCallback.h; sourceTree = "<group>"; };
46BD16E20B279473001F0839 /* noneCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noneCursor.png; sourceTree = "<group>"; };
46D4F2460AF97E810035385A /* cellCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cellCursor.png; sourceTree = "<group>"; };
46D4F2470AF97E810035385A /* contextMenuCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contextMenuCursor.png; sourceTree = "<group>"; };
@@ -15156,6 +15162,9 @@
976D6C70122B8A3D001FD1F7 /* FileThreadTask.h */,
976D6C71122B8A3D001FD1F7 /* FileWriter.cpp */,
976D6C72122B8A3D001FD1F7 /* FileWriter.h */,
+ 46BC724B129B104C0071C07E /* FileWriterBase.cpp */,
+ 46BC724C129B104C0071C07E /* FileWriterBase.h */,
+ 46BC724D129B104C0071C07E /* FileWriterBaseCallback.h */,
893C47A61238908B002B3D86 /* FileWriterCallback.h */,
46700ECE127B96CB00F5D5D6 /* FileWriterSync.cpp */,
46700ECF127B96CB00F5D5D6 /* FileWriterSync.h */,
@@ -21377,6 +21386,8 @@
E1BE512E0CF6C512002EA959 /* XSLTUnicodeSort.h in Headers */,
97DD4D870FDF4D6E00ECF9A4 /* XSSAuditor.h in Headers */,
BCB92D4F1293550B00C8387F /* FontBaseline.h in Headers */,
+ 46BC724F129B104C0071C07E /* FileWriterBase.h in Headers */,
+ 46BC7250129B104C0071C07E /* FileWriterBaseCallback.h in Headers */,
BCA257151293C010007A263D /* VerticalPositionCache.h in Headers */,
BCAE1FA712939DB7004CB026 /* ScrollAnimatorMac.h in Headers */,
E1AD141E1295EA4F00ACA989 /* JSHTMLAppletElementCustom.h in Headers */,
@@ -23966,6 +23977,7 @@
75415D55129AB2D2003AD669 /* JSSpeechInputEvent.cpp in Sources */,
75415D57129AB2D2003AD669 /* JSSpeechInputResult.cpp in Sources */,
75415D59129AB2D2003AD669 /* JSSpeechInputResultList.cpp in Sources */,
+ 46BC724E129B104C0071C07E /* FileWriterBase.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/WebCore/bindings/scripts/CodeGeneratorV8.pm b/WebCore/bindings/scripts/CodeGeneratorV8.pm
index 7ea4c63..dc04e45 100644
--- a/WebCore/bindings/scripts/CodeGeneratorV8.pm
+++ b/WebCore/bindings/scripts/CodeGeneratorV8.pm
@@ -2558,7 +2558,6 @@ sub IsActiveDomType
return 1 if $type eq "IDBRequest";
return 1 if $type eq "FileReader";
return 1 if $type eq "FileWriter";
- return 1 if $type eq "FileWriterSync";
return 0;
}
diff --git a/WebCore/fileapi/AsyncFileWriter.h b/WebCore/fileapi/AsyncFileWriter.h
index fef1643..d6a28d5 100644
--- a/WebCore/fileapi/AsyncFileWriter.h
+++ b/WebCore/fileapi/AsyncFileWriter.h
@@ -47,6 +47,10 @@ public:
virtual void write(long long position, Blob* data) = 0;
virtual void truncate(long long length) = 0;
virtual void abort() = 0;
+ virtual bool waitForOperationToComplete() // Needed for FileWriterSync only.
+ {
+ return false;
+ }
};
} // namespace
diff --git a/WebCore/fileapi/DOMFileSystem.cpp b/WebCore/fileapi/DOMFileSystem.cpp
index f38acaa..f4ebe7c 100644
--- a/WebCore/fileapi/DOMFileSystem.cpp
+++ b/WebCore/fileapi/DOMFileSystem.cpp
@@ -41,6 +41,7 @@
#include "FileEntry.h"
#include "FileSystemCallbacks.h"
#include "FileWriter.h"
+#include "FileWriterBaseCallback.h"
#include "FileWriterCallback.h"
#include "MetadataCallback.h"
#include "ScriptExecutionContext.h"
@@ -75,6 +76,29 @@ void DOMFileSystem::contextDestroyed()
ActiveDOMObject::contextDestroyed();
}
+namespace {
+
+class ConvertToFileWriterCallback : public FileWriterBaseCallback {
+public:
+ static PassRefPtr<ConvertToFileWriterCallback> create(PassRefPtr<FileWriterCallback> callback)
+ {
+ return adoptRef(new ConvertToFileWriterCallback(callback));
+ }
+
+ bool handleEvent(FileWriterBase* fileWriterBase)
+ {
+ return m_callback->handleEvent(static_cast<FileWriter*>(fileWriterBase));
+ }
+private:
+ ConvertToFileWriterCallback(PassRefPtr<FileWriterCallback> callback)
+ : m_callback(callback)
+ {
+ }
+ RefPtr<FileWriterCallback> m_callback;
+};
+
+}
+
void DOMFileSystem::createWriter(const FileEntry* fileEntry, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
{
ASSERT(fileEntry);
@@ -82,7 +106,8 @@ void DOMFileSystem::createWriter(const FileEntry* fileEntry, PassRefPtr<FileWrit
String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath());
RefPtr<FileWriter> fileWriter = FileWriter::create(scriptExecutionContext());
- OwnPtr<FileWriterCallbacks> callbacks = FileWriterCallbacks::create(fileWriter, successCallback, errorCallback);
+ RefPtr<FileWriterBaseCallback> conversionCallback = ConvertToFileWriterCallback::create(successCallback);
+ OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, conversionCallback, errorCallback);
m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release());
}
diff --git a/WebCore/fileapi/DOMFileSystemSync.cpp b/WebCore/fileapi/DOMFileSystemSync.cpp
index 3de64a7..dcbc9c7 100644
--- a/WebCore/fileapi/DOMFileSystemSync.cpp
+++ b/WebCore/fileapi/DOMFileSystemSync.cpp
@@ -35,11 +35,19 @@
#include "DOMFilePath.h"
#include "DirectoryEntrySync.h"
+#include "ErrorCallback.h"
#include "File.h"
#include "FileEntrySync.h"
+#include "FileError.h"
+#include "FileException.h"
+#include "FileSystemCallbacks.h"
+#include "FileWriterBaseCallback.h"
+#include "FileWriterSync.h"
namespace WebCore {
+class FileWriterBase;
+
PassRefPtr<DOMFileSystemSync> DOMFileSystemSync::create(DOMFileSystemBase* fileSystem)
{
return adoptRef(new DOMFileSystemSync(fileSystem->m_name, fileSystem->m_asyncFileSystem.release()));
@@ -66,6 +74,99 @@ PassRefPtr<File> DOMFileSystemSync::createFile(const FileEntrySync* fileEntry, E
return File::create(platformPath);
}
+namespace {
+
+class ReceiveFileWriterCallback : public FileWriterBaseCallback {
+public:
+ static PassRefPtr<ReceiveFileWriterCallback> create()
+ {
+ return adoptRef(new ReceiveFileWriterCallback());
+ }
+
+ bool handleEvent(FileWriterBase* fileWriterBase)
+ {
+#ifndef NDEBUG
+ m_fileWriterBase = fileWriterBase;
+#else
+ ASSERT_UNUSED(fileWriterBase, fileWriterBase);
+#endif
+ return true;
+ }
+
+#ifndef NDEBUG
+ FileWriterBase* fileWriterBase()
+ {
+ return m_fileWriterBase;
+ }
+#endif
+
+private:
+ ReceiveFileWriterCallback()
+#ifndef NDEBUG
+ : m_fileWriterBase(0)
+#endif
+ {
+ }
+
+#ifndef NDEBUG
+ FileWriterBase* m_fileWriterBase;
+#endif
+};
+
+class LocalErrorCallback : public ErrorCallback {
+public:
+ static PassRefPtr<LocalErrorCallback> create()
+ {
+ return adoptRef(new LocalErrorCallback());
+ }
+
+ bool handleEvent(FileError* error)
+ {
+ m_error = error;
+ return true;
+ }
+
+ FileError* error()
+ {
+ return m_error.get();
+ }
+
+private:
+ LocalErrorCallback()
+ {
+ }
+ RefPtr<FileError> m_error;
+};
+
+}
+
+PassRefPtr<FileWriterSync> DOMFileSystemSync::createWriter(const FileEntrySync* fileEntry, ExceptionCode& ec)
+{
+ ASSERT(fileEntry);
+ ec = 0;
+
+ String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath());
+
+ RefPtr<FileWriterSync> fileWriter = FileWriterSync::create();
+ RefPtr<ReceiveFileWriterCallback> successCallback = ReceiveFileWriterCallback::create();
+ RefPtr<LocalErrorCallback> errorCallback = LocalErrorCallback::create();
+
+ OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, successCallback, errorCallback);
+ m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release());
+ if (!m_asyncFileSystem->waitForOperationToComplete()) {
+ ec = FileException::ABORT_ERR;
+ return 0;
+ }
+ if (errorCallback->error()) {
+ ASSERT(!successCallback->fileWriterBase());
+ ec = FileException::ErrorCodeToExceptionCode(errorCallback->error()->code());
+ return 0;
+ }
+ ASSERT(successCallback->fileWriterBase());
+ ASSERT(static_cast<FileWriterSync*>(successCallback->fileWriterBase()) == fileWriter.get());
+ return fileWriter;
+}
+
}
#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebCore/fileapi/DOMFileSystemSync.h b/WebCore/fileapi/DOMFileSystemSync.h
index 1856747..ce07c85 100644
--- a/WebCore/fileapi/DOMFileSystemSync.h
+++ b/WebCore/fileapi/DOMFileSystemSync.h
@@ -40,6 +40,7 @@ namespace WebCore {
class DirectoryEntrySync;
class File;
class FileEntrySync;
+class FileWriterSync;
typedef int ExceptionCode;
@@ -57,6 +58,7 @@ public:
PassRefPtr<DirectoryEntrySync> root();
PassRefPtr<File> createFile(const FileEntrySync*, ExceptionCode&);
+ PassRefPtr<FileWriterSync> createWriter(const FileEntrySync*, ExceptionCode&);
private:
DOMFileSystemSync(const String& name, PassOwnPtr<AsyncFileSystem>);
diff --git a/WebCore/fileapi/FileEntrySync.cpp b/WebCore/fileapi/FileEntrySync.cpp
index 36ec735..d899de7 100644
--- a/WebCore/fileapi/FileEntrySync.cpp
+++ b/WebCore/fileapi/FileEntrySync.cpp
@@ -34,6 +34,7 @@
#if ENABLE(FILE_SYSTEM)
#include "File.h"
+#include "FileWriterSync.h"
namespace WebCore {
@@ -47,6 +48,11 @@ PassRefPtr<File> FileEntrySync::file(ExceptionCode& ec)
return filesystem()->createFile(this, ec);
}
+PassRefPtr<FileWriterSync> FileEntrySync::createWriter(ExceptionCode& ec)
+{
+ return filesystem()->createWriter(this, ec);
+}
+
}
#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebCore/fileapi/FileEntrySync.h b/WebCore/fileapi/FileEntrySync.h
index be12e21..615a604 100644
--- a/WebCore/fileapi/FileEntrySync.h
+++ b/WebCore/fileapi/FileEntrySync.h
@@ -41,6 +41,7 @@
namespace WebCore {
class File;
+class FileWriterSync;
class FileEntrySync : public EntrySync {
public:
@@ -52,6 +53,7 @@ public:
virtual bool isFile() const { return true; }
PassRefPtr<File> file(ExceptionCode&);
+ PassRefPtr<FileWriterSync> createWriter(ExceptionCode&);
private:
friend class EntrySync;
diff --git a/WebCore/fileapi/FileEntrySync.idl b/WebCore/fileapi/FileEntrySync.idl
index e2d2871..c569839 100644
--- a/WebCore/fileapi/FileEntrySync.idl
+++ b/WebCore/fileapi/FileEntrySync.idl
@@ -36,5 +36,6 @@ module storage {
NoStaticTables
] FileEntrySync : EntrySync {
File file() raises (FileException);
+ FileWriterSync createWriter() raises (FileException);
};
}
diff --git a/WebCore/fileapi/FileError.h b/WebCore/fileapi/FileError.h
index 27ad397..0597633 100644
--- a/WebCore/fileapi/FileError.h
+++ b/WebCore/fileapi/FileError.h
@@ -41,6 +41,7 @@ namespace WebCore {
class FileError : public RefCounted<FileError> {
public:
enum ErrorCode {
+ OK = 0,
NOT_FOUND_ERR = 1,
SECURITY_ERR = 2,
ABORT_ERR = 3,
diff --git a/WebCore/fileapi/FileSystemCallbacks.cpp b/WebCore/fileapi/FileSystemCallbacks.cpp
index 6644589..966337b 100644
--- a/WebCore/fileapi/FileSystemCallbacks.cpp
+++ b/WebCore/fileapi/FileSystemCallbacks.cpp
@@ -47,8 +47,8 @@
#include "FileError.h"
#include "FileMetadata.h"
#include "FileSystemCallback.h"
-#include "FileWriter.h"
-#include "FileWriterCallback.h"
+#include "FileWriterBase.h"
+#include "FileWriterBaseCallback.h"
#include "Metadata.h"
#include "MetadataCallback.h"
#include "ScriptExecutionContext.h"
@@ -212,21 +212,21 @@ void MetadataCallbacks::didReadMetadata(const FileMetadata& metadata)
m_successCallback.clear();
}
-// FileWriterCallbacks ----------------------------------------------------------
+// FileWriterBaseCallbacks ----------------------------------------------------------
-PassOwnPtr<FileWriterCallbacks> FileWriterCallbacks::create(PassRefPtr<FileWriter> fileWriter, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
+PassOwnPtr<FileWriterBaseCallbacks> FileWriterBaseCallbacks::create(PassRefPtr<FileWriterBase> fileWriter, PassRefPtr<FileWriterBaseCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
{
- return adoptPtr(new FileWriterCallbacks(fileWriter, successCallback, errorCallback));
+ return adoptPtr(new FileWriterBaseCallbacks(fileWriter, successCallback, errorCallback));
}
-FileWriterCallbacks::FileWriterCallbacks(PassRefPtr<FileWriter> fileWriter, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
+FileWriterBaseCallbacks::FileWriterBaseCallbacks(PassRefPtr<FileWriterBase> fileWriter, PassRefPtr<FileWriterBaseCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
: FileSystemCallbacksBase(errorCallback)
, m_fileWriter(fileWriter)
, m_successCallback(successCallback)
{
}
-void FileWriterCallbacks::didCreateFileWriter(PassOwnPtr<AsyncFileWriter> asyncFileWriter, long long length)
+void FileWriterBaseCallbacks::didCreateFileWriter(PassOwnPtr<AsyncFileWriter> asyncFileWriter, long long length)
{
m_fileWriter->initialize(asyncFileWriter, length);
if (m_successCallback)
diff --git a/WebCore/fileapi/FileSystemCallbacks.h b/WebCore/fileapi/FileSystemCallbacks.h
index 100fd0c..83000c2 100644
--- a/WebCore/fileapi/FileSystemCallbacks.h
+++ b/WebCore/fileapi/FileSystemCallbacks.h
@@ -49,8 +49,8 @@ class EntryArray;
class EntryCallback;
struct FileMetadata;
class FileSystemCallback;
-class FileWriter;
-class FileWriterCallback;
+class FileWriterBase;
+class FileWriterBaseCallback;
class MetadataCallback;
class ScriptExecutionContext;
class VoidCallback;
@@ -133,15 +133,15 @@ private:
RefPtr<MetadataCallback> m_successCallback;
};
-class FileWriterCallbacks : public FileSystemCallbacksBase {
+class FileWriterBaseCallbacks : public FileSystemCallbacksBase {
public:
- static PassOwnPtr<FileWriterCallbacks> create(PassRefPtr<FileWriter>, PassRefPtr<FileWriterCallback>, PassRefPtr<ErrorCallback>);
+ static PassOwnPtr<FileWriterBaseCallbacks> create(PassRefPtr<FileWriterBase>, PassRefPtr<FileWriterBaseCallback>, PassRefPtr<ErrorCallback>);
virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long length);
private:
- FileWriterCallbacks(PassRefPtr<FileWriter>, PassRefPtr<FileWriterCallback>, PassRefPtr<ErrorCallback>);
- RefPtr<FileWriter> m_fileWriter;
- RefPtr<FileWriterCallback> m_successCallback;
+ FileWriterBaseCallbacks(PassRefPtr<FileWriterBase>, PassRefPtr<FileWriterBaseCallback>, PassRefPtr<ErrorCallback>);
+ RefPtr<FileWriterBase> m_fileWriter;
+ RefPtr<FileWriterBaseCallback> m_successCallback;
};
class VoidCallbacks : public FileSystemCallbacksBase {
diff --git a/WebCore/fileapi/FileWriter.cpp b/WebCore/fileapi/FileWriter.cpp
index 7775709..bd8a76d 100644
--- a/WebCore/fileapi/FileWriter.cpp
+++ b/WebCore/fileapi/FileWriter.cpp
@@ -46,7 +46,6 @@ namespace WebCore {
FileWriter::FileWriter(ScriptExecutionContext* context)
: ActiveDOMObject(context, this)
, m_readyState(INIT)
- , m_position(0)
, m_startedWriting(false)
, m_bytesWritten(0)
, m_bytesToWrite(0)
@@ -54,14 +53,6 @@ FileWriter::FileWriter(ScriptExecutionContext* context)
{
}
-void FileWriter::initialize(PassOwnPtr<AsyncFileWriter> writer, long long length)
-{
- ASSERT(!m_writer);
- ASSERT(length >= 0);
- m_writer = writer;
- m_length = length;
-}
-
FileWriter::~FileWriter()
{
if (m_readyState == WRITING)
@@ -81,15 +72,15 @@ bool FileWriter::canSuspend() const
void FileWriter::stop()
{
- if (m_writer && m_readyState == WRITING)
- m_writer->abort();
+ if (writer() && m_readyState == WRITING)
+ writer()->abort();
m_blobBeingWritten.clear();
m_readyState = DONE;
}
void FileWriter::write(Blob* data, ExceptionCode& ec)
{
- ASSERT(m_writer);
+ ASSERT(writer());
if (m_readyState == WRITING) {
setError(FileError::INVALID_STATE_ERR, ec);
return;
@@ -104,12 +95,12 @@ void FileWriter::write(Blob* data, ExceptionCode& ec)
m_startedWriting = false;
m_bytesWritten = 0;
m_bytesToWrite = data->size();
- m_writer->write(m_position, data);
+ writer()->write(position(), data);
}
void FileWriter::seek(long long position, ExceptionCode& ec)
{
- ASSERT(m_writer);
+ ASSERT(writer());
if (m_readyState == WRITING) {
setError(FileError::INVALID_STATE_ERR, ec);
return;
@@ -117,18 +108,12 @@ void FileWriter::seek(long long position, ExceptionCode& ec)
m_bytesWritten = 0;
m_bytesToWrite = 0;
- if (position > m_length)
- position = m_length;
- else if (position < 0)
- position = m_length + position;
- if (position < 0)
- position = 0;
- m_position = position;
+ seekInternal(position);
}
void FileWriter::truncate(long long position, ExceptionCode& ec)
{
- ASSERT(m_writer);
+ ASSERT(writer());
if (m_readyState == WRITING || position < 0) {
setError(FileError::INVALID_STATE_ERR, ec);
return;
@@ -137,19 +122,19 @@ void FileWriter::truncate(long long position, ExceptionCode& ec)
m_bytesWritten = 0;
m_bytesToWrite = 0;
m_truncateLength = position;
- m_writer->truncate(position);
+ writer()->truncate(position);
}
void FileWriter::abort(ExceptionCode& ec)
{
- ASSERT(m_writer);
+ ASSERT(writer());
if (m_readyState != WRITING) {
setError(FileError::INVALID_STATE_ERR, ec);
return;
}
m_error = FileError::create(FileError::ABORT_ERR);
- m_writer->abort();
+ writer()->abort();
}
void FileWriter::didWrite(long long bytes, bool complete)
@@ -162,9 +147,9 @@ void FileWriter::didWrite(long long bytes, bool complete)
}
m_bytesWritten += bytes;
ASSERT((m_bytesWritten == m_bytesToWrite) || !complete);
- m_position += bytes;
- if (m_position > m_length)
- m_length = m_position;
+ setPosition(position() + bytes);
+ if (position() > length())
+ setLength(position());
fireEvent(eventNames().progressEvent);
if (complete) {
m_blobBeingWritten.clear();
@@ -178,9 +163,9 @@ void FileWriter::didTruncate()
{
ASSERT(m_truncateLength >= 0);
fireEvent(eventNames().writestartEvent);
- m_length = m_truncateLength;
- if (m_position > m_length)
- m_position = m_length;
+ setLength(m_truncateLength);
+ if (position() > length())
+ setPosition(length());
m_truncateLength = -1;
fireEvent(eventNames().writeEvent);
m_readyState = DONE;
diff --git a/WebCore/fileapi/FileWriter.h b/WebCore/fileapi/FileWriter.h
index 0e884ea..89289a9 100644
--- a/WebCore/fileapi/FileWriter.h
+++ b/WebCore/fileapi/FileWriter.h
@@ -34,45 +34,34 @@
#if ENABLE(FILE_SYSTEM)
#include "ActiveDOMObject.h"
-#include "AsyncFileWriterClient.h"
#include "EventTarget.h"
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
+#include "FileWriterBase.h"
#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
namespace WebCore {
-class AsyncFileWriter;
-class Blob;
-class FileError;
class ScriptExecutionContext;
-class FileWriter : public RefCounted<FileWriter>, public ActiveDOMObject, public EventTarget, public AsyncFileWriterClient {
+class FileWriter : public FileWriterBase, public ActiveDOMObject, public EventTarget, public AsyncFileWriterClient {
public:
static PassRefPtr<FileWriter> create(ScriptExecutionContext* context)
{
return adoptRef(new FileWriter(context));
}
- void initialize(PassOwnPtr<AsyncFileWriter> writer, long long length);
-
enum ReadyState {
INIT = 0,
WRITING = 1,
DONE = 2
};
- void write(Blob* data, ExceptionCode& ec);
- void seek(long long position, ExceptionCode& ec);
- void truncate(long long length, ExceptionCode& ec);
- void abort(ExceptionCode& ec);
-
+ void write(Blob*, ExceptionCode&);
+ void seek(long long position, ExceptionCode&);
+ void truncate(long long length, ExceptionCode&);
+ void abort(ExceptionCode&);
ReadyState readyState() const { return m_readyState; }
FileError* error() const { return m_error.get(); }
- long long position() const { return m_position; }
- long long length() const { return m_length; }
// AsyncFileWriterClient
void didWrite(long long bytes, bool complete);
@@ -88,8 +77,8 @@ public:
virtual FileWriter* toFileWriter() { return this; }
virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); }
- using RefCounted<FileWriter>::ref;
- using RefCounted<FileWriter>::deref;
+ using RefCounted<FileWriterBase>::ref;
+ using RefCounted<FileWriterBase>::deref;
DEFINE_ATTRIBUTE_EVENT_LISTENER(writestart);
DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
@@ -103,8 +92,6 @@ private:
virtual ~FileWriter();
- friend class WTF::RefCounted<FileWriter>;
-
// EventTarget
virtual void refEventTarget() { ref(); }
virtual void derefEventTarget() { deref(); }
@@ -117,10 +104,7 @@ private:
RefPtr<FileError> m_error;
EventTargetData m_eventTargetData;
- OwnPtr<AsyncFileWriter> m_writer;
ReadyState m_readyState;
- long long m_position;
- long long m_length;
bool m_startedWriting;
long long m_bytesWritten;
long long m_bytesToWrite;
diff --git a/WebCore/fileapi/FileWriterBase.cpp b/WebCore/fileapi/FileWriterBase.cpp
new file mode 100644
index 0000000..dc55bb8
--- /dev/null
+++ b/WebCore/fileapi/FileWriterBase.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "FileWriterBase.h"
+
+#include "AsyncFileWriter.h"
+#include "Blob.h"
+#include "ExceptionCode.h"
+#include "FileError.h"
+#include "FileException.h"
+#include "ProgressEvent.h"
+
+namespace WebCore {
+
+FileWriterBase::~FileWriterBase()
+{
+}
+
+void FileWriterBase::initialize(PassOwnPtr<AsyncFileWriter> writer, long long length)
+{
+ ASSERT(!m_writer);
+ ASSERT(length >= 0);
+ m_writer = writer;
+ m_length = length;
+}
+
+FileWriterBase::FileWriterBase()
+ : m_position(0)
+{
+}
+
+void FileWriterBase::seekInternal(long long position)
+{
+ if (position > m_length)
+ position = m_length;
+ else if (position < 0)
+ position = m_length + position;
+ if (position < 0)
+ position = 0;
+ m_position = position;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(FILE_SYSTEM)
diff --git a/WebCore/fileapi/FileWriterBase.h b/WebCore/fileapi/FileWriterBase.h
new file mode 100644
index 0000000..2eecfff
--- /dev/null
+++ b/WebCore/fileapi/FileWriterBase.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FileWriterBase_h
+#define FileWriterBase_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include "AsyncFileWriterClient.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class AsyncFileWriter;
+class Blob;
+
+typedef int ExceptionCode;
+
+class FileWriterBase : public RefCounted<FileWriterBase> {
+public:
+ virtual ~FileWriterBase();
+ void initialize(PassOwnPtr<AsyncFileWriter>, long long length);
+
+ long long position() const
+ {
+ return m_position;
+ }
+ long long length() const
+ {
+ return m_length;
+ }
+
+protected:
+ FileWriterBase();
+
+ AsyncFileWriter* writer()
+ {
+ return m_writer.get();
+ }
+
+ void setPosition(long long position)
+ {
+ m_position = position;
+ }
+
+ void setLength(long long length)
+ {
+ m_length = length;
+ }
+
+ void seekInternal(long long position);
+
+private:
+ friend class WTF::RefCounted<FileWriterBase>;
+
+ OwnPtr<AsyncFileWriter> m_writer;
+ long long m_position;
+ long long m_length;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(FILE_SYSTEM)
+
+#endif // FileWriterBase_h
diff --git a/WebCore/fileapi/FileWriterBaseCallback.h b/WebCore/fileapi/FileWriterBaseCallback.h
new file mode 100644
index 0000000..51e8ab7
--- /dev/null
+++ b/WebCore/fileapi/FileWriterBaseCallback.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FileWriterBaseCallback_h
+#define FileWriterBaseCallback_h
+
+#if ENABLE(FILE_SYSTEM)
+
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class FileWriterBase;
+
+class FileWriterBaseCallback : public RefCounted<FileWriterBaseCallback> {
+public:
+ virtual ~FileWriterBaseCallback() { }
+ virtual bool handleEvent(FileWriterBase*) = 0;
+};
+
+} // namespace
+
+#endif // ENABLE(FILE_SYSTEM)
+
+#endif // FileWriterBaseCallback_h
diff --git a/WebCore/fileapi/FileWriterSync.cpp b/WebCore/fileapi/FileWriterSync.cpp
index 5fa5137..28a68f8 100644
--- a/WebCore/fileapi/FileWriterSync.cpp
+++ b/WebCore/fileapi/FileWriterSync.cpp
@@ -34,46 +34,109 @@
#include "FileWriterSync.h"
+#include "AsyncFileWriter.h"
+#include "Blob.h"
+#include "FileException.h"
+
namespace WebCore {
-void FileWriterSync::write(Blob*, ExceptionCode&)
+void FileWriterSync::write(Blob* data, ExceptionCode& ec)
{
- ASSERT_NOT_REACHED(); // FIXME: Not implemented yet.
+ ASSERT(writer());
+ ASSERT(m_complete);
+ ec = 0;
+ if (!data) {
+ ec = FileException::TYPE_MISMATCH_ERR;
+ return;
+ }
+
+ prepareForWrite();
+ writer()->write(position(), data);
+ writer()->waitForOperationToComplete();
+ ASSERT(m_complete);
+ ec = FileException::ErrorCodeToExceptionCode(m_error);
+ if (ec)
+ return;
+ setPosition(position() + data->size());
+ if (position() > length())
+ setLength(position());
}
-void FileWriterSync::seek(long long, ExceptionCode&)
+void FileWriterSync::seek(long long position, ExceptionCode& ec)
{
- ASSERT_NOT_REACHED(); // FIXME: Not implemented yet.
+ ASSERT(writer());
+ ASSERT(m_complete);
+ ec = 0;
+ seekInternal(position);
}
-void FileWriterSync::truncate(long long, ExceptionCode&)
+void FileWriterSync::truncate(long long offset, ExceptionCode& ec)
{
- ASSERT_NOT_REACHED(); // FIXME: Not implemented yet.
+ ASSERT(writer());
+ ASSERT(m_complete);
+ ec = 0;
+ if (offset < 0) {
+ ec = FileException::INVALID_STATE_ERR;
+ return;
+ }
+ prepareForWrite();
+ writer()->truncate(offset);
+ writer()->waitForOperationToComplete();
+ ASSERT(m_complete);
+ ec = FileException::ErrorCodeToExceptionCode(m_error);
+ if (ec)
+ return;
+ if (offset < position())
+ setPosition(offset);
+ setLength(offset);
}
-bool FileWriterSync::canSuspend() const
+void FileWriterSync::didWrite(long long bytes, bool complete)
{
- // FIXME: It is not currently possible to suspend a FileWriterSync, so pages with FileWriter can not go into page cache.
- return false;
+ ASSERT(m_error == FileError::OK);
+ ASSERT(!m_complete);
+#ifndef NDEBUG
+ m_complete = complete;
+#else
+ ASSERT_UNUSED(complete, complete);
+#endif
}
-bool FileWriterSync::hasPendingActivity() const
+void FileWriterSync::didTruncate()
{
- return ActiveDOMObject::hasPendingActivity();
+ ASSERT(m_error == FileError::OK);
+ ASSERT(!m_complete);
+#ifndef NDEBUG
+ m_complete = true;
+#endif
}
-void FileWriterSync::stop()
+void FileWriterSync::didFail(FileError::ErrorCode error)
{
+ ASSERT(m_error == FileError::OK);
+ m_error = error;
+ ASSERT(!m_complete);
+#ifndef NDEBUG
+ m_complete = true;
+#endif
}
-
-FileWriterSync::FileWriterSync(ScriptExecutionContext* context)
- : ActiveDOMObject(context, this)
- , m_position(0)
- , m_length(0)
+FileWriterSync::FileWriterSync()
+ : m_error(FileError::OK)
+#ifndef NDEBUG
+ , m_complete(true)
+#endif
{
}
+void FileWriterSync::prepareForWrite()
+{
+ ASSERT(m_complete);
+ m_error = FileError::OK;
+#ifndef NDEBUG
+ m_complete = false;
+#endif
+}
FileWriterSync::~FileWriterSync()
{
diff --git a/WebCore/fileapi/FileWriterSync.h b/WebCore/fileapi/FileWriterSync.h
index 0051870..3917f2e 100644
--- a/WebCore/fileapi/FileWriterSync.h
+++ b/WebCore/fileapi/FileWriterSync.h
@@ -34,8 +34,9 @@
#if ENABLE(FILE_SYSTEM)
#include "ActiveDOMObject.h"
+#include "FileError.h"
+#include "FileWriterBase.h"
#include <wtf/PassRefPtr.h>
-#include <wtf/RefCounted.h>
namespace WebCore {
@@ -43,37 +44,32 @@ class Blob;
typedef int ExceptionCode;
-// FIXME: This is an empty shell waiting for implementation.
-class FileWriterSync : public RefCounted<FileWriterSync>, public ActiveDOMObject {
+class FileWriterSync : public FileWriterBase, public AsyncFileWriterClient {
public:
- static PassRefPtr<FileWriterSync> create(ScriptExecutionContext* context)
+ static PassRefPtr<FileWriterSync> create()
{
- return adoptRef(new FileWriterSync(context));
+ return adoptRef(new FileWriterSync());
}
virtual ~FileWriterSync();
- void write(Blob* data, ExceptionCode&);
+ // FileWriterBase
+ void write(Blob*, ExceptionCode&);
void seek(long long position, ExceptionCode&);
void truncate(long long length, ExceptionCode&);
- long long position() const { return m_position; }
- long long length() const { return m_length; }
-
- // ActiveDOMObject
- virtual bool canSuspend() const;
- virtual bool hasPendingActivity() const;
- virtual void stop();
-
- using RefCounted<FileWriterSync>::ref;
- using RefCounted<FileWriterSync>::deref;
+ // AsyncFileWriterClient, via FileWriterBase
+ void didWrite(long long bytes, bool complete);
+ void didTruncate();
+ void didFail(FileError::ErrorCode);
private:
- FileWriterSync(ScriptExecutionContext*);
-
- friend class RefCounted<FileWriterSync>;
+ FileWriterSync();
+ void prepareForWrite();
- long long m_position;
- long long m_length;
+ FileError::ErrorCode m_error;
+#ifndef NDEBUG
+ bool m_complete;
+#endif
};
} // namespace WebCore
diff --git a/WebCore/fileapi/FileWriterSync.idl b/WebCore/fileapi/FileWriterSync.idl
index 214c509..c561bb4 100644
--- a/WebCore/fileapi/FileWriterSync.idl
+++ b/WebCore/fileapi/FileWriterSync.idl
@@ -31,7 +31,6 @@
module html {
interface [
Conditional=FILE_SYSTEM,
- CallWith=ScriptExecutionContext
] FileWriterSync {
// synchronous write/modify methods
void write(in Blob data) raises (FileException);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list