diff options
Diffstat (limited to 'WebCore/fileapi/FileWriter.cpp')
-rw-r--r-- | WebCore/fileapi/FileWriter.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/WebCore/fileapi/FileWriter.cpp b/WebCore/fileapi/FileWriter.cpp index 8367bf9..bc76984 100644 --- a/WebCore/fileapi/FileWriter.cpp +++ b/WebCore/fileapi/FileWriter.cpp @@ -46,6 +46,7 @@ FileWriter::FileWriter(ScriptExecutionContext* context) : ActiveDOMObject(context, this) , m_readyState(INIT) , m_position(0) + , m_startedWriting(false) , m_bytesWritten(0) , m_bytesToWrite(0) , m_truncateLength(-1) @@ -81,6 +82,7 @@ void FileWriter::stop() { if (m_writer && m_readyState == WRITING) m_writer->abort(); + m_blobBeingWritten.clear(); m_readyState = DONE; } @@ -92,8 +94,15 @@ void FileWriter::write(Blob* data, ExceptionCode& ec) m_error = FileError::create(ec); return; } + if (!data) { + ec = TYPE_MISMATCH_ERR; + m_error = FileError::create(ec); + return; + } + m_blobBeingWritten = data; m_readyState = WRITING; + m_startedWriting = false; m_bytesWritten = 0; m_bytesToWrite = data->size(); m_writer->write(m_position, data); @@ -149,18 +158,21 @@ void FileWriter::abort(ExceptionCode& ec) void FileWriter::didWrite(long long bytes, bool complete) { - ASSERT(bytes > 0); ASSERT(bytes + m_bytesWritten > 0); ASSERT(bytes + m_bytesWritten <= m_bytesToWrite); - if (!m_bytesWritten) + if (!m_startedWriting) { fireEvent(eventNames().writestartEvent); + m_startedWriting = true; + } m_bytesWritten += bytes; - ASSERT((m_bytesWritten == m_bytesToWrite) == complete); + ASSERT((m_bytesWritten == m_bytesToWrite) || !complete); m_position += bytes; if (m_position > m_length) m_length = m_position; - fireEvent(eventNames().writeEvent); + fireEvent(eventNames().progressEvent); if (complete) { + m_blobBeingWritten.clear(); + fireEvent(eventNames().writeEvent); m_readyState = DONE; fireEvent(eventNames().writeendEvent); } @@ -186,6 +198,7 @@ void FileWriter::didFail(ExceptionCode ec) if (ABORT_ERR == ec) fireEvent(eventNames().abortEvent); fireEvent(eventNames().errorEvent); + m_blobBeingWritten.clear(); m_readyState = DONE; fireEvent(eventNames().writeendEvent); } |