diff options
author | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-01 05:54:26 +0000 |
---|---|---|
committer | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-01 05:54:26 +0000 |
commit | a95ce07699b8ce79df8b59e36fe53b345a5921b2 (patch) | |
tree | c4b54622b37e7aa21e004e3570b6fb6299b00973 /webkit/fileapi/local_file_stream_writer.cc | |
parent | 2f729cd95a5452af56269f594ffbe4f539303182 (diff) | |
download | chromium_src-a95ce07699b8ce79df8b59e36fe53b345a5921b2.zip chromium_src-a95ce07699b8ce79df8b59e36fe53b345a5921b2.tar.gz chromium_src-a95ce07699b8ce79df8b59e36fe53b345a5921b2.tar.bz2 |
Flush at the end of local file writing in FileWriter API.
This CL ensures the written content is flushed physically before
fileWriter.write() invokes the "onwriteend" event, for native local files.
Remote files (Google Drive files in Chrome OS) nor FileSystem API
files (in PERSISTENT or TEMPORARY storage) aren't affected.
The summary of the changes:
* Call Flush() before the final callback.
(webkit/fileapi/file_writer_delegate.cc)
* Delegate Flush() to net::FileStream::Flush
(webkit/fileapi/local_file_stream_writer.cc)
* No-op implementation for Flush().
(webkit/fileapi/sanbox_file_stream_writer.cc)
(webkit/chromeos/fileapi/remote_file_stream_writer.cc)
* Implementation of asynchronous Flush.
(net/base/file_stream_{posix,win}.cc)
* Other files are just for reflecting the rename Flush -> FlushSync.
BUG=144790
R=willchan@chromium.org,kinuko@chromium.org,benjhayden@chromium.org
TBR=marja@chromium.org
TEST=out/Debug/browser_tests --gtest_filter='*FileSystemApi*'
TEST=./webkit/tools/layout_tests/run_webkit_tests.sh fast/filesystem
TEST=Manual steps reported in the issue.
Review URL: https://codereview.chromium.org/10986045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159454 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi/local_file_stream_writer.cc')
-rw-r--r-- | webkit/fileapi/local_file_stream_writer.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/webkit/fileapi/local_file_stream_writer.cc b/webkit/fileapi/local_file_stream_writer.cc index 95a2a7e..f3679f9 100644 --- a/webkit/fileapi/local_file_stream_writer.cc +++ b/webkit/fileapi/local_file_stream_writer.cc @@ -64,6 +64,21 @@ int LocalFileStreamWriter::Cancel(const net::CompletionCallback& callback) { return net::ERR_IO_PENDING; } +int LocalFileStreamWriter::Flush(const net::CompletionCallback& callback) { + DCHECK(!has_pending_operation_); + DCHECK(cancel_callback_.is_null()); + + // Write() is not called yet, so there's nothing to flush. + if (!stream_impl_.get()) + return net::OK; + + has_pending_operation_ = true; + int result = InitiateFlush(callback); + if (result != net::ERR_IO_PENDING) + has_pending_operation_ = false; + return result; +} + int LocalFileStreamWriter::InitiateOpen( const net::CompletionCallback& error_callback, const base::Closure& main_operation) { @@ -179,6 +194,26 @@ void LocalFileStreamWriter::DidWrite(const net::CompletionCallback& callback, callback.Run(result); } +int LocalFileStreamWriter::InitiateFlush( + const net::CompletionCallback& callback) { + DCHECK(has_pending_operation_); + DCHECK(stream_impl_.get()); + + return stream_impl_->Flush(base::Bind(&LocalFileStreamWriter::DidFlush, + weak_factory_.GetWeakPtr(), + callback)); +} + +void LocalFileStreamWriter::DidFlush(const net::CompletionCallback& callback, + int result) { + DCHECK(has_pending_operation_); + + if (CancelIfRequested()) + return; + has_pending_operation_ = false; + callback.Run(result); +} + bool LocalFileStreamWriter::CancelIfRequested() { DCHECK(has_pending_operation_); |