summaryrefslogtreecommitdiffstats
path: root/webkit/fileapi/local_file_stream_writer.cc
diff options
context:
space:
mode:
authorkinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-01 05:54:26 +0000
committerkinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-01 05:54:26 +0000
commita95ce07699b8ce79df8b59e36fe53b345a5921b2 (patch)
treec4b54622b37e7aa21e004e3570b6fb6299b00973 /webkit/fileapi/local_file_stream_writer.cc
parent2f729cd95a5452af56269f594ffbe4f539303182 (diff)
downloadchromium_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.cc35
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_);