Changeset 72715 in webkit
- Timestamp:
- Nov 24, 2010 6:44:12 PM (13 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 23 edited
- 3 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/CMakeLists.txt
r72591 r72715 1696 1696 fileapi/FileSystemCallbacks.cpp 1697 1697 fileapi/FileWriter.cpp 1698 fileapi/FileWriterBase.cpp 1698 1699 fileapi/FileWriterSync.cpp 1699 1700 fileapi/LocalFileSystem.cpp -
trunk/WebCore/ChangeLog
r72713 r72715 1 2010-11-24 Eric Uhrhane <ericu@chromium.org> 2 3 Reviewed by David Levin. 4 5 Implement FileWriterSync 6 https://bugs.webkit.org/show_bug.cgi?id=49939 7 8 Tests to follow in a separate CL, once the test framework in 47680 goes in. 9 10 Build file changes to add FileWriterBase and FileWriterBaseCallback. 11 * CMakeLists.txt: 12 * GNUmakefile.am: 13 * WebCore.gypi: 14 * WebCore.pro: 15 * WebCore.vcproj/WebCore.vcproj: 16 * WebCore.xcodeproj/project.pbxproj: 17 18 FileWriterSync doesn't turn out to need to be an ActiveDOMObject. 19 * bindings/scripts/CodeGeneratorV8.pm: 20 21 Added new AsyncFileWriter::waitForOperationToComplete to enable 22 synchronous calls. 23 * fileapi/AsyncFileWriter.h: 24 25 Added a way to get a FileSystemSync. 26 * fileapi/DOMFileSystemSync.cpp: 27 * fileapi/FileEntrySync.cpp: 28 * fileapi/FileEntrySync.h: 29 * fileapi/FileEntrySync.idl: 30 31 Added an error code for OK, rather than just having 0 everywhere. 32 * fileapi/FileError.h: 33 34 Turned FileWriterCallback into FileWriterBaseCallback. 35 * fileapi/FileSystemCallbacks.cpp: 36 * fileapi/FileSystemCallbacks.h: 37 38 Refactored out a common base class, FileWriterBase, for FileWriter and 39 FileWriterSync. 40 * fileapi/FileWriter.cpp: 41 * fileapi/FileWriter.h: 42 * fileapi/FileWriterBase.cpp: Added. 43 * fileapi/FileWriterBase.h: Added. 44 * fileapi/FileWriterBaseCallback.h: Added. 45 * fileapi/FileWriterSync.cpp: 46 * fileapi/FileWriterSync.h: 47 48 Small tweaks to deal with the base class refactoring. 49 * fileapi/DOMFileSystem.cpp: 50 * fileapi/DOMFileSystemSync.h: 51 52 Removed "CallWith=ScriptExecutionContext", as FileWriterSync doesn't actually need it. 53 * fileapi/FileWriterSync.idl: 54 1 55 2010-11-24 Martin Robinson <mrobinson@igalia.com> 2 56 -
trunk/WebCore/GNUmakefile.am
r72713 r72715 1467 1467 WebCore/fileapi/FileThread.h \ 1468 1468 WebCore/fileapi/FileThreadTask.h \ 1469 WebCore/fileapi/FileWriterCallback.h \1470 1469 WebCore/fileapi/FileWriter.cpp \ 1471 1470 WebCore/fileapi/FileWriter.h \ 1471 WebCore/fileapi/FileWriterBase.cpp \ 1472 WebCore/fileapi/FileWriterBase.h \ 1473 WebCore/fileapi/FileWriterBaseCallback.h \ 1474 WebCore/fileapi/FileWriterCallback.h \ 1472 1475 WebCore/fileapi/FileWriterSync.cpp \ 1473 1476 WebCore/fileapi/FileWriterSync.h \ -
trunk/WebCore/WebCore.gypi
r72701 r72715 1536 1536 'fileapi/FileWriter.cpp', 1537 1537 'fileapi/FileWriter.h', 1538 'fileapi/FileWriterBase.cpp', 1539 'fileapi/FileWriterBase.h', 1540 'fileapi/FileWriterBaseCallback.h', 1538 1541 'fileapi/FileWriterCallback.h', 1539 1542 'fileapi/FileWriterSync.cpp', -
trunk/WebCore/WebCore.pro
r72591 r72715 3066 3066 fileapi/FileSystemCallbacks.h \ 3067 3067 fileapi/FileWriter.h \ 3068 fileapi/FileWriterBase.h \ 3069 fileapi/FileWriterBaseCallback.h \ 3068 3070 fileapi/FileWriterCallback.h \ 3069 3071 fileapi/FileWriterClient.h \ … … 3098 3100 fileapi/FileSystemCallbacks.cpp \ 3099 3101 fileapi/FileWriter.cpp \ 3102 fileapi/FileWriterBase.cpp \ 3100 3103 fileapi/FileWriterSync.cpp \ 3101 3104 fileapi/LocalFileSystem.cpp \ -
trunk/WebCore/WebCore.vcproj/WebCore.vcproj
r72657 r72715 49148 49148 </File> 49149 49149 <File 49150 RelativePath="..\fileapi\FileWriterBase.cpp" 49151 > 49152 </File> 49153 <File 49154 RelativePath="..\fileapi\FileWriterBase.h" 49155 > 49156 <File 49157 RelativePath="..\fileapi\FileWriterBaseCallback.h" 49158 > 49159 </File> 49160 <File 49150 49161 RelativePath="..\fileapi\FileWriterCallback.h" 49151 49162 > -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r72591 r72715 976 976 46700ED1127B96CB00F5D5D6 /* FileWriterSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 46700ECF127B96CB00F5D5D6 /* FileWriterSync.h */; }; 977 977 4689F1AF1267BAE100E8D380 /* FileMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 4689F1AE1267BAE100E8D380 /* FileMetadata.h */; }; 978 46BC724E129B104C0071C07E /* FileWriterBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46BC724B129B104C0071C07E /* FileWriterBase.cpp */; }; 979 46BC724F129B104C0071C07E /* FileWriterBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 46BC724C129B104C0071C07E /* FileWriterBase.h */; }; 980 46BC7250129B104C0071C07E /* FileWriterBaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 46BC724D129B104C0071C07E /* FileWriterBaseCallback.h */; }; 978 981 46BD16E30B279473001F0839 /* noneCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 46BD16E20B279473001F0839 /* noneCursor.png */; }; 979 982 46D4F2490AF97E810035385A /* cellCursor.png in Resources */ = {isa = PBXBuildFile; fileRef = 46D4F2460AF97E810035385A /* cellCursor.png */; }; … … 7080 7083 46700ECF127B96CB00F5D5D6 /* FileWriterSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileWriterSync.h; path = fileapi/FileWriterSync.h; sourceTree = "<group>"; }; 7081 7084 4689F1AE1267BAE100E8D380 /* FileMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileMetadata.h; path = platform/FileMetadata.h; sourceTree = "<group>"; }; 7085 46BC724B129B104C0071C07E /* FileWriterBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FileWriterBase.cpp; path = fileapi/FileWriterBase.cpp; sourceTree = "<group>"; }; 7086 46BC724C129B104C0071C07E /* FileWriterBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileWriterBase.h; path = fileapi/FileWriterBase.h; sourceTree = "<group>"; }; 7087 46BC724D129B104C0071C07E /* FileWriterBaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileWriterBaseCallback.h; path = fileapi/FileWriterBaseCallback.h; sourceTree = "<group>"; }; 7082 7088 46BD16E20B279473001F0839 /* noneCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = noneCursor.png; sourceTree = "<group>"; }; 7083 7089 46D4F2460AF97E810035385A /* cellCursor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cellCursor.png; sourceTree = "<group>"; }; … … 15157 15163 976D6C71122B8A3D001FD1F7 /* FileWriter.cpp */, 15158 15164 976D6C72122B8A3D001FD1F7 /* FileWriter.h */, 15165 46BC724B129B104C0071C07E /* FileWriterBase.cpp */, 15166 46BC724C129B104C0071C07E /* FileWriterBase.h */, 15167 46BC724D129B104C0071C07E /* FileWriterBaseCallback.h */, 15159 15168 893C47A61238908B002B3D86 /* FileWriterCallback.h */, 15160 15169 46700ECE127B96CB00F5D5D6 /* FileWriterSync.cpp */, … … 21378 21387 97DD4D870FDF4D6E00ECF9A4 /* XSSAuditor.h in Headers */, 21379 21388 BCB92D4F1293550B00C8387F /* FontBaseline.h in Headers */, 21389 46BC724F129B104C0071C07E /* FileWriterBase.h in Headers */, 21390 46BC7250129B104C0071C07E /* FileWriterBaseCallback.h in Headers */, 21380 21391 BCA257151293C010007A263D /* VerticalPositionCache.h in Headers */, 21381 21392 BCAE1FA712939DB7004CB026 /* ScrollAnimatorMac.h in Headers */, … … 23967 23978 75415D57129AB2D2003AD669 /* JSSpeechInputResult.cpp in Sources */, 23968 23979 75415D59129AB2D2003AD669 /* JSSpeechInputResultList.cpp in Sources */, 23980 46BC724E129B104C0071C07E /* FileWriterBase.cpp in Sources */, 23969 23981 ); 23970 23982 runOnlyForDeploymentPostprocessing = 0; -
trunk/WebCore/bindings/scripts/CodeGeneratorV8.pm
r72552 r72715 2559 2559 return 1 if $type eq "FileReader"; 2560 2560 return 1 if $type eq "FileWriter"; 2561 return 1 if $type eq "FileWriterSync";2562 2561 return 0; 2563 2562 } -
trunk/WebCore/fileapi/AsyncFileWriter.h
r68180 r72715 48 48 virtual void truncate(long long length) = 0; 49 49 virtual void abort() = 0; 50 virtual bool waitForOperationToComplete() // Needed for FileWriterSync only. 51 { 52 return false; 53 } 50 54 }; 51 55 -
trunk/WebCore/fileapi/DOMFileSystem.cpp
r69907 r72715 42 42 #include "FileSystemCallbacks.h" 43 43 #include "FileWriter.h" 44 #include "FileWriterBaseCallback.h" 44 45 #include "FileWriterCallback.h" 45 46 #include "MetadataCallback.h" … … 76 77 } 77 78 79 namespace { 80 81 class ConvertToFileWriterCallback : public FileWriterBaseCallback { 82 public: 83 static PassRefPtr<ConvertToFileWriterCallback> create(PassRefPtr<FileWriterCallback> callback) 84 { 85 return adoptRef(new ConvertToFileWriterCallback(callback)); 86 } 87 88 bool handleEvent(FileWriterBase* fileWriterBase) 89 { 90 return m_callback->handleEvent(static_cast<FileWriter*>(fileWriterBase)); 91 } 92 private: 93 ConvertToFileWriterCallback(PassRefPtr<FileWriterCallback> callback) 94 : m_callback(callback) 95 { 96 } 97 RefPtr<FileWriterCallback> m_callback; 98 }; 99 100 } 101 78 102 void DOMFileSystem::createWriter(const FileEntry* fileEntry, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 79 103 { … … 83 107 84 108 RefPtr<FileWriter> fileWriter = FileWriter::create(scriptExecutionContext()); 85 OwnPtr<FileWriterCallbacks> callbacks = FileWriterCallbacks::create(fileWriter, successCallback, errorCallback); 109 RefPtr<FileWriterBaseCallback> conversionCallback = ConvertToFileWriterCallback::create(successCallback); 110 OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, conversionCallback, errorCallback); 86 111 m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release()); 87 112 } -
trunk/WebCore/fileapi/DOMFileSystemSync.cpp
r69907 r72715 36 36 #include "DOMFilePath.h" 37 37 #include "DirectoryEntrySync.h" 38 #include "ErrorCallback.h" 38 39 #include "File.h" 39 40 #include "FileEntrySync.h" 41 #include "FileError.h" 42 #include "FileException.h" 43 #include "FileSystemCallbacks.h" 44 #include "FileWriterBaseCallback.h" 45 #include "FileWriterSync.h" 40 46 41 47 namespace WebCore { 48 49 class FileWriterBase; 42 50 43 51 PassRefPtr<DOMFileSystemSync> DOMFileSystemSync::create(DOMFileSystemBase* fileSystem) … … 67 75 } 68 76 77 namespace { 78 79 class ReceiveFileWriterCallback : public FileWriterBaseCallback { 80 public: 81 static PassRefPtr<ReceiveFileWriterCallback> create() 82 { 83 return adoptRef(new ReceiveFileWriterCallback()); 84 } 85 86 bool handleEvent(FileWriterBase* fileWriterBase) 87 { 88 #ifndef NDEBUG 89 m_fileWriterBase = fileWriterBase; 90 #else 91 ASSERT_UNUSED(fileWriterBase, fileWriterBase); 92 #endif 93 return true; 94 } 95 96 #ifndef NDEBUG 97 FileWriterBase* fileWriterBase() 98 { 99 return m_fileWriterBase; 100 } 101 #endif 102 103 private: 104 ReceiveFileWriterCallback() 105 #ifndef NDEBUG 106 : m_fileWriterBase(0) 107 #endif 108 { 109 } 110 111 #ifndef NDEBUG 112 FileWriterBase* m_fileWriterBase; 113 #endif 114 }; 115 116 class LocalErrorCallback : public ErrorCallback { 117 public: 118 static PassRefPtr<LocalErrorCallback> create() 119 { 120 return adoptRef(new LocalErrorCallback()); 121 } 122 123 bool handleEvent(FileError* error) 124 { 125 m_error = error; 126 return true; 127 } 128 129 FileError* error() 130 { 131 return m_error.get(); 132 } 133 134 private: 135 LocalErrorCallback() 136 { 137 } 138 RefPtr<FileError> m_error; 139 }; 140 141 } 142 143 PassRefPtr<FileWriterSync> DOMFileSystemSync::createWriter(const FileEntrySync* fileEntry, ExceptionCode& ec) 144 { 145 ASSERT(fileEntry); 146 ec = 0; 147 148 String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath()); 149 150 RefPtr<FileWriterSync> fileWriter = FileWriterSync::create(); 151 RefPtr<ReceiveFileWriterCallback> successCallback = ReceiveFileWriterCallback::create(); 152 RefPtr<LocalErrorCallback> errorCallback = LocalErrorCallback::create(); 153 154 OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, successCallback, errorCallback); 155 m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release()); 156 if (!m_asyncFileSystem->waitForOperationToComplete()) { 157 ec = FileException::ABORT_ERR; 158 return 0; 159 } 160 if (errorCallback->error()) { 161 ASSERT(!successCallback->fileWriterBase()); 162 ec = FileException::ErrorCodeToExceptionCode(errorCallback->error()->code()); 163 return 0; 164 } 165 ASSERT(successCallback->fileWriterBase()); 166 ASSERT(static_cast<FileWriterSync*>(successCallback->fileWriterBase()) == fileWriter.get()); 167 return fileWriter; 168 } 169 69 170 } 70 171 -
trunk/WebCore/fileapi/DOMFileSystemSync.h
r69907 r72715 41 41 class File; 42 42 class FileEntrySync; 43 class FileWriterSync; 43 44 44 45 typedef int ExceptionCode; … … 58 59 59 60 PassRefPtr<File> createFile(const FileEntrySync*, ExceptionCode&); 61 PassRefPtr<FileWriterSync> createWriter(const FileEntrySync*, ExceptionCode&); 60 62 61 63 private: -
trunk/WebCore/fileapi/FileEntrySync.cpp
r70741 r72715 35 35 36 36 #include "File.h" 37 #include "FileWriterSync.h" 37 38 38 39 namespace WebCore { … … 48 49 } 49 50 51 PassRefPtr<FileWriterSync> FileEntrySync::createWriter(ExceptionCode& ec) 52 { 53 return filesystem()->createWriter(this, ec); 54 } 55 50 56 } 51 57 -
trunk/WebCore/fileapi/FileEntrySync.h
r70741 r72715 42 42 43 43 class File; 44 class FileWriterSync; 44 45 45 46 class FileEntrySync : public EntrySync { … … 53 54 54 55 PassRefPtr<File> file(ExceptionCode&); 56 PassRefPtr<FileWriterSync> createWriter(ExceptionCode&); 55 57 56 58 private: -
trunk/WebCore/fileapi/FileEntrySync.idl
r69907 r72715 37 37 ] FileEntrySync : EntrySync { 38 38 File file() raises (FileException); 39 FileWriterSync createWriter() raises (FileException); 39 40 }; 40 41 } -
trunk/WebCore/fileapi/FileError.h
r70438 r72715 42 42 public: 43 43 enum ErrorCode { 44 OK = 0, 44 45 NOT_FOUND_ERR = 1, 45 46 SECURITY_ERR = 2, -
trunk/WebCore/fileapi/FileSystemCallbacks.cpp
r70745 r72715 48 48 #include "FileMetadata.h" 49 49 #include "FileSystemCallback.h" 50 #include "FileWriter .h"51 #include "FileWriter Callback.h"50 #include "FileWriterBase.h" 51 #include "FileWriterBaseCallback.h" 52 52 #include "Metadata.h" 53 53 #include "MetadataCallback.h" … … 213 213 } 214 214 215 // FileWriter Callbacks ----------------------------------------------------------216 217 PassOwnPtr<FileWriter Callbacks> FileWriterCallbacks::create(PassRefPtr<FileWriter> fileWriter, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)218 { 219 return adoptPtr(new FileWriter Callbacks(fileWriter, successCallback, errorCallback));220 } 221 222 FileWriter Callbacks::FileWriterCallbacks(PassRefPtr<FileWriter> fileWriter, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)215 // FileWriterBaseCallbacks ---------------------------------------------------------- 216 217 PassOwnPtr<FileWriterBaseCallbacks> FileWriterBaseCallbacks::create(PassRefPtr<FileWriterBase> fileWriter, PassRefPtr<FileWriterBaseCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 218 { 219 return adoptPtr(new FileWriterBaseCallbacks(fileWriter, successCallback, errorCallback)); 220 } 221 222 FileWriterBaseCallbacks::FileWriterBaseCallbacks(PassRefPtr<FileWriterBase> fileWriter, PassRefPtr<FileWriterBaseCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 223 223 : FileSystemCallbacksBase(errorCallback) 224 224 , m_fileWriter(fileWriter) … … 227 227 } 228 228 229 void FileWriter Callbacks::didCreateFileWriter(PassOwnPtr<AsyncFileWriter> asyncFileWriter, long long length)229 void FileWriterBaseCallbacks::didCreateFileWriter(PassOwnPtr<AsyncFileWriter> asyncFileWriter, long long length) 230 230 { 231 231 m_fileWriter->initialize(asyncFileWriter, length); -
trunk/WebCore/fileapi/FileSystemCallbacks.h
r70775 r72715 50 50 struct FileMetadata; 51 51 class FileSystemCallback; 52 class FileWriter ;53 class FileWriter Callback;52 class FileWriterBase; 53 class FileWriterBaseCallback; 54 54 class MetadataCallback; 55 55 class ScriptExecutionContext; … … 134 134 }; 135 135 136 class FileWriter Callbacks : public FileSystemCallbacksBase {136 class FileWriterBaseCallbacks : public FileSystemCallbacksBase { 137 137 public: 138 static PassOwnPtr<FileWriter Callbacks> create(PassRefPtr<FileWriter>, PassRefPtr<FileWriterCallback>, PassRefPtr<ErrorCallback>);138 static PassOwnPtr<FileWriterBaseCallbacks> create(PassRefPtr<FileWriterBase>, PassRefPtr<FileWriterBaseCallback>, PassRefPtr<ErrorCallback>); 139 139 virtual void didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long length); 140 140 141 141 private: 142 FileWriter Callbacks(PassRefPtr<FileWriter>, PassRefPtr<FileWriterCallback>, PassRefPtr<ErrorCallback>);143 RefPtr<FileWriter > m_fileWriter;144 RefPtr<FileWriter Callback> m_successCallback;142 FileWriterBaseCallbacks(PassRefPtr<FileWriterBase>, PassRefPtr<FileWriterBaseCallback>, PassRefPtr<ErrorCallback>); 143 RefPtr<FileWriterBase> m_fileWriter; 144 RefPtr<FileWriterBaseCallback> m_successCallback; 145 145 }; 146 146 -
trunk/WebCore/fileapi/FileWriter.cpp
r70438 r72715 47 47 : ActiveDOMObject(context, this) 48 48 , m_readyState(INIT) 49 , m_position(0)50 49 , m_startedWriting(false) 51 50 , m_bytesWritten(0) … … 55 54 } 56 55 57 void FileWriter::initialize(PassOwnPtr<AsyncFileWriter> writer, long long length)58 {59 ASSERT(!m_writer);60 ASSERT(length >= 0);61 m_writer = writer;62 m_length = length;63 }64 65 56 FileWriter::~FileWriter() 66 57 { … … 82 73 void FileWriter::stop() 83 74 { 84 if ( m_writer&& m_readyState == WRITING)85 m_writer->abort();75 if (writer() && m_readyState == WRITING) 76 writer()->abort(); 86 77 m_blobBeingWritten.clear(); 87 78 m_readyState = DONE; … … 90 81 void FileWriter::write(Blob* data, ExceptionCode& ec) 91 82 { 92 ASSERT( m_writer);83 ASSERT(writer()); 93 84 if (m_readyState == WRITING) { 94 85 setError(FileError::INVALID_STATE_ERR, ec); … … 105 96 m_bytesWritten = 0; 106 97 m_bytesToWrite = data->size(); 107 m_writer->write(m_position, data);98 writer()->write(position(), data); 108 99 } 109 100 110 101 void FileWriter::seek(long long position, ExceptionCode& ec) 111 102 { 112 ASSERT( m_writer);103 ASSERT(writer()); 113 104 if (m_readyState == WRITING) { 114 105 setError(FileError::INVALID_STATE_ERR, ec); … … 118 109 m_bytesWritten = 0; 119 110 m_bytesToWrite = 0; 120 if (position > m_length) 121 position = m_length; 122 else if (position < 0) 123 position = m_length + position; 124 if (position < 0) 125 position = 0; 126 m_position = position; 111 seekInternal(position); 127 112 } 128 113 129 114 void FileWriter::truncate(long long position, ExceptionCode& ec) 130 115 { 131 ASSERT( m_writer);116 ASSERT(writer()); 132 117 if (m_readyState == WRITING || position < 0) { 133 118 setError(FileError::INVALID_STATE_ERR, ec); … … 138 123 m_bytesToWrite = 0; 139 124 m_truncateLength = position; 140 m_writer->truncate(position);125 writer()->truncate(position); 141 126 } 142 127 143 128 void FileWriter::abort(ExceptionCode& ec) 144 129 { 145 ASSERT( m_writer);130 ASSERT(writer()); 146 131 if (m_readyState != WRITING) { 147 132 setError(FileError::INVALID_STATE_ERR, ec); … … 150 135 151 136 m_error = FileError::create(FileError::ABORT_ERR); 152 m_writer->abort();137 writer()->abort(); 153 138 } 154 139 … … 163 148 m_bytesWritten += bytes; 164 149 ASSERT((m_bytesWritten == m_bytesToWrite) || !complete); 165 m_position += bytes;166 if ( m_position > m_length)167 m_length = m_position;150 setPosition(position() + bytes); 151 if (position() > length()) 152 setLength(position()); 168 153 fireEvent(eventNames().progressEvent); 169 154 if (complete) { … … 179 164 ASSERT(m_truncateLength >= 0); 180 165 fireEvent(eventNames().writestartEvent); 181 m_length = m_truncateLength;182 if ( m_position > m_length)183 m_position = m_length;166 setLength(m_truncateLength); 167 if (position() > length()) 168 setPosition(length()); 184 169 m_truncateLength = -1; 185 170 fireEvent(eventNames().writeEvent); -
trunk/WebCore/fileapi/FileWriter.h
r70438 r72715 35 35 36 36 #include "ActiveDOMObject.h" 37 #include "AsyncFileWriterClient.h"38 37 #include "EventTarget.h" 39 #include <wtf/OwnPtr.h> 40 #include <wtf/PassOwnPtr.h> 38 #include "FileWriterBase.h" 41 39 #include <wtf/PassRefPtr.h> 42 #include <wtf/RefCounted.h>43 40 #include <wtf/RefPtr.h> 44 41 45 42 namespace WebCore { 46 43 47 class AsyncFileWriter;48 class Blob;49 class FileError;50 44 class ScriptExecutionContext; 51 45 52 class FileWriter : public RefCounted<FileWriter>, public ActiveDOMObject, public EventTarget, public AsyncFileWriterClient {46 class FileWriter : public FileWriterBase, public ActiveDOMObject, public EventTarget, public AsyncFileWriterClient { 53 47 public: 54 48 static PassRefPtr<FileWriter> create(ScriptExecutionContext* context) … … 56 50 return adoptRef(new FileWriter(context)); 57 51 } 58 59 void initialize(PassOwnPtr<AsyncFileWriter> writer, long long length);60 52 61 53 enum ReadyState { … … 65 57 }; 66 58 67 void write(Blob* data, ExceptionCode& ec); 68 void seek(long long position, ExceptionCode& ec); 69 void truncate(long long length, ExceptionCode& ec); 70 void abort(ExceptionCode& ec); 71 59 void write(Blob*, ExceptionCode&); 60 void seek(long long position, ExceptionCode&); 61 void truncate(long long length, ExceptionCode&); 62 void abort(ExceptionCode&); 72 63 ReadyState readyState() const { return m_readyState; } 73 64 FileError* error() const { return m_error.get(); } 74 long long position() const { return m_position; }75 long long length() const { return m_length; }76 65 77 66 // AsyncFileWriterClient … … 89 78 virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); } 90 79 91 using RefCounted<FileWriter >::ref;92 using RefCounted<FileWriter >::deref;80 using RefCounted<FileWriterBase>::ref; 81 using RefCounted<FileWriterBase>::deref; 93 82 94 83 DEFINE_ATTRIBUTE_EVENT_LISTENER(writestart); … … 104 93 virtual ~FileWriter(); 105 94 106 friend class WTF::RefCounted<FileWriter>;107 108 95 // EventTarget 109 96 virtual void refEventTarget() { ref(); } … … 118 105 RefPtr<FileError> m_error; 119 106 EventTargetData m_eventTargetData; 120 OwnPtr<AsyncFileWriter> m_writer;121 107 ReadyState m_readyState; 122 long long m_position;123 long long m_length;124 108 bool m_startedWriting; 125 109 long long m_bytesWritten; -
trunk/WebCore/fileapi/FileWriterBase.cpp
r72713 r72715 1 1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved.2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 30 30 31 31 #include "config.h" 32 #include "FileEntrySync.h"33 32 34 33 #if ENABLE(FILE_SYSTEM) 35 34 36 #include "File.h" 35 #include "FileWriterBase.h" 36 37 #include "AsyncFileWriter.h" 38 #include "Blob.h" 39 #include "ExceptionCode.h" 40 #include "FileError.h" 41 #include "FileException.h" 42 #include "ProgressEvent.h" 37 43 38 44 namespace WebCore { 39 45 40 FileEntrySync::FileEntrySync(PassRefPtr<DOMFileSystemBase> fileSystem, const String& fullPath) 41 : EntrySync(fileSystem, fullPath) 46 FileWriterBase::~FileWriterBase() 42 47 { 43 48 } 44 49 45 PassRefPtr<File> FileEntrySync::file(ExceptionCode& ec)50 void FileWriterBase::initialize(PassOwnPtr<AsyncFileWriter> writer, long long length) 46 51 { 47 return filesystem()->createFile(this, ec); 52 ASSERT(!m_writer); 53 ASSERT(length >= 0); 54 m_writer = writer; 55 m_length = length; 48 56 } 49 57 58 FileWriterBase::FileWriterBase() 59 : m_position(0) 60 { 50 61 } 51 62 63 void FileWriterBase::seekInternal(long long position) 64 { 65 if (position > m_length) 66 position = m_length; 67 else if (position < 0) 68 position = m_length + position; 69 if (position < 0) 70 position = 0; 71 m_position = position; 72 } 73 74 } // namespace WebCore 75 52 76 #endif // ENABLE(FILE_SYSTEM) -
trunk/WebCore/fileapi/FileWriterBase.h
r72713 r72715 29 29 */ 30 30 31 #ifndef FileWriter Sync_h32 #define FileWriter Sync_h31 #ifndef FileWriterBase_h 32 #define FileWriterBase_h 33 33 34 34 #if ENABLE(FILE_SYSTEM) 35 35 36 #include "ActiveDOMObject.h" 37 #include <wtf/PassRefPtr.h> 36 #include "AsyncFileWriterClient.h" 37 #include <wtf/OwnPtr.h> 38 #include <wtf/PassOwnPtr.h> 38 39 #include <wtf/RefCounted.h> 39 40 40 41 namespace WebCore { 41 42 43 class AsyncFileWriter; 42 44 class Blob; 43 45 44 46 typedef int ExceptionCode; 45 47 46 // FIXME: This is an empty shell waiting for implementation. 47 class FileWriterSync : public RefCounted<FileWriterSync>, public ActiveDOMObject { 48 class FileWriterBase : public RefCounted<FileWriterBase> { 48 49 public: 49 static PassRefPtr<FileWriterSync> create(ScriptExecutionContext* context) 50 virtual ~FileWriterBase(); 51 void initialize(PassOwnPtr<AsyncFileWriter>, long long length); 52 53 long long position() const 50 54 { 51 return adoptRef(new FileWriterSync(context));55 return m_position; 52 56 } 53 virtual ~FileWriterSync(); 57 long long length() const 58 { 59 return m_length; 60 } 54 61 55 void write(Blob* data, ExceptionCode&); 56 void seek(long long position, ExceptionCode&); 57 void truncate(long long length, ExceptionCode&); 62 protected: 63 FileWriterBase(); 58 64 59 long long position() const { return m_position; } 60 long long length() const { return m_length; } 65 AsyncFileWriter* writer() 66 { 67 return m_writer.get(); 68 } 61 69 62 // ActiveDOMObject63 virtual bool canSuspend() const;64 virtual bool hasPendingActivity() const;65 virtual void stop();70 void setPosition(long long position) 71 { 72 m_position = position; 73 } 66 74 67 using RefCounted<FileWriterSync>::ref; 68 using RefCounted<FileWriterSync>::deref; 75 void setLength(long long length) 76 { 77 m_length = length; 78 } 79 80 void seekInternal(long long position); 69 81 70 82 private: 71 FileWriterSync(ScriptExecutionContext*);83 friend class WTF::RefCounted<FileWriterBase>; 72 84 73 friend class RefCounted<FileWriterSync>; 74 85 OwnPtr<AsyncFileWriter> m_writer; 75 86 long long m_position; 76 87 long long m_length; … … 81 92 #endif // ENABLE(FILE_SYSTEM) 82 93 83 #endif // FileWriter _h94 #endif // FileWriterBase_h -
trunk/WebCore/fileapi/FileWriterBaseCallback.h
r72713 r72715 29 29 */ 30 30 31 #ifndef AsyncFileWriter_h32 #define AsyncFileWriter_h31 #ifndef FileWriterBaseCallback_h 32 #define FileWriterBaseCallback_h 33 33 34 34 #if ENABLE(FILE_SYSTEM) 35 35 36 #include "PlatformString.h"37 36 #include <wtf/RefCounted.h> 38 37 39 38 namespace WebCore { 40 39 41 class Blob;40 class FileWriterBase; 42 41 43 class AsyncFileWriter{42 class FileWriterBaseCallback : public RefCounted<FileWriterBaseCallback> { 44 43 public: 45 virtual ~AsyncFileWriter() {} 46 47 virtual void write(long long position, Blob* data) = 0; 48 virtual void truncate(long long length) = 0; 49 virtual void abort() = 0; 44 virtual ~FileWriterBaseCallback() { } 45 virtual bool handleEvent(FileWriterBase*) = 0; 50 46 }; 51 47 … … 54 50 #endif // ENABLE(FILE_SYSTEM) 55 51 56 #endif // AsyncFileWriter_h 57 52 #endif // FileWriterBaseCallback_h -
trunk/WebCore/fileapi/FileWriterSync.cpp
r71711 r72715 35 35 #include "FileWriterSync.h" 36 36 37 #include "AsyncFileWriter.h" 38 #include "Blob.h" 39 #include "FileException.h" 40 37 41 namespace WebCore { 38 42 39 void FileWriterSync::write(Blob* , ExceptionCode&)43 void FileWriterSync::write(Blob* data, ExceptionCode& ec) 40 44 { 41 ASSERT_NOT_REACHED(); // FIXME: Not implemented yet. 45 ASSERT(writer()); 46 ASSERT(m_complete); 47 ec = 0; 48 if (!data) { 49 ec = FileException::TYPE_MISMATCH_ERR; 50 return; 51 } 52 53 prepareForWrite(); 54 writer()->write(position(), data); 55 writer()->waitForOperationToComplete(); 56 ASSERT(m_complete); 57 ec = FileException::ErrorCodeToExceptionCode(m_error); 58 if (ec) 59 return; 60 setPosition(position() + data->size()); 61 if (position() > length()) 62 setLength(position()); 42 63 } 43 64 44 void FileWriterSync::seek(long long , ExceptionCode&)65 void FileWriterSync::seek(long long position, ExceptionCode& ec) 45 66 { 46 ASSERT_NOT_REACHED(); // FIXME: Not implemented yet. 67 ASSERT(writer()); 68 ASSERT(m_complete); 69 ec = 0; 70 seekInternal(position); 47 71 } 48 72 49 void FileWriterSync::truncate(long long , ExceptionCode&)73 void FileWriterSync::truncate(long long offset, ExceptionCode& ec) 50 74 { 51 ASSERT_NOT_REACHED(); // FIXME: Not implemented yet. 75 ASSERT(writer()); 76 ASSERT(m_complete); 77 ec = 0; 78 if (offset < 0) { 79 ec = FileException::INVALID_STATE_ERR; 80 return; 81 } 82 prepareForWrite(); 83 writer()->truncate(offset); 84 writer()->waitForOperationToComplete(); 85 ASSERT(m_complete); 86 ec = FileException::ErrorCodeToExceptionCode(m_error); 87 if (ec) 88 return; 89 if (offset < position()) 90 setPosition(offset); 91 setLength(offset); 52 92 } 53 93 54 bool FileWriterSync::canSuspend() const 94 void FileWriterSync::didWrite(long long bytes, bool complete) 55 95 { 56 // FIXME: It is not currently possible to suspend a FileWriterSync, so pages with FileWriter can not go into page cache. 57 return false; 96 ASSERT(m_error == FileError::OK); 97 ASSERT(!m_complete); 98 #ifndef NDEBUG 99 m_complete = complete; 100 #else 101 ASSERT_UNUSED(complete, complete); 102 #endif 58 103 } 59 104 60 bool FileWriterSync::hasPendingActivity() const 105 void FileWriterSync::didTruncate() 61 106 { 62 return ActiveDOMObject::hasPendingActivity(); 107 ASSERT(m_error == FileError::OK); 108 ASSERT(!m_complete); 109 #ifndef NDEBUG 110 m_complete = true; 111 #endif 63 112 } 64 113 65 void FileWriterSync::stop() 114 void FileWriterSync::didFail(FileError::ErrorCode error) 115 { 116 ASSERT(m_error == FileError::OK); 117 m_error = error; 118 ASSERT(!m_complete); 119 #ifndef NDEBUG 120 m_complete = true; 121 #endif 122 } 123 124 FileWriterSync::FileWriterSync() 125 : m_error(FileError::OK) 126 #ifndef NDEBUG 127 , m_complete(true) 128 #endif 66 129 { 67 130 } 68 131 69 70 FileWriterSync::FileWriterSync(ScriptExecutionContext* context) 71 : ActiveDOMObject(context, this) 72 , m_position(0) 73 , m_length(0) 132 void FileWriterSync::prepareForWrite() 74 133 { 134 ASSERT(m_complete); 135 m_error = FileError::OK; 136 #ifndef NDEBUG 137 m_complete = false; 138 #endif 75 139 } 76 77 140 78 141 FileWriterSync::~FileWriterSync() -
trunk/WebCore/fileapi/FileWriterSync.h
r71715 r72715 35 35 36 36 #include "ActiveDOMObject.h" 37 #include "FileError.h" 38 #include "FileWriterBase.h" 37 39 #include <wtf/PassRefPtr.h> 38 #include <wtf/RefCounted.h>39 40 40 41 namespace WebCore { … … 44 45 typedef int ExceptionCode; 45 46 46 // FIXME: This is an empty shell waiting for implementation. 47 class FileWriterSync : public RefCounted<FileWriterSync>, public ActiveDOMObject { 47 class FileWriterSync : public FileWriterBase, public AsyncFileWriterClient { 48 48 public: 49 static PassRefPtr<FileWriterSync> create( ScriptExecutionContext* context)49 static PassRefPtr<FileWriterSync> create() 50 50 { 51 return adoptRef(new FileWriterSync( context));51 return adoptRef(new FileWriterSync()); 52 52 } 53 53 virtual ~FileWriterSync(); 54 54 55 void write(Blob* data, ExceptionCode&); 55 // FileWriterBase 56 void write(Blob*, ExceptionCode&); 56 57 void seek(long long position, ExceptionCode&); 57 58 void truncate(long long length, ExceptionCode&); 58 59 59 long long position() const { return m_position; } 60 long long length() const { return m_length; } 61 62 // ActiveDOMObject 63 virtual bool canSuspend() const; 64 virtual bool hasPendingActivity() const; 65 virtual void stop(); 66 67 using RefCounted<FileWriterSync>::ref; 68 using RefCounted<FileWriterSync>::deref; 60 // AsyncFileWriterClient, via FileWriterBase 61 void didWrite(long long bytes, bool complete); 62 void didTruncate(); 63 void didFail(FileError::ErrorCode); 69 64 70 65 private: 71 FileWriterSync(ScriptExecutionContext*); 66 FileWriterSync(); 67 void prepareForWrite(); 72 68 73 friend class RefCounted<FileWriterSync>;74 75 long long m_position;76 long long m_length; 69 FileError::ErrorCode m_error; 70 #ifndef NDEBUG 71 bool m_complete; 72 #endif 77 73 }; 78 74 -
trunk/WebCore/fileapi/FileWriterSync.idl
r71711 r72715 32 32 interface [ 33 33 Conditional=FILE_SYSTEM, 34 CallWith=ScriptExecutionContext35 34 ] FileWriterSync { 36 35 // synchronous write/modify methods
Note: See TracChangeset
for help on using the changeset viewer.