[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