summaryrefslogtreecommitdiffstats
path: root/webkit/fileapi
diff options
context:
space:
mode:
authorglider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-13 09:16:49 +0000
committerglider@chromium.org <glider@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-13 09:16:49 +0000
commitdf0211a7dd85ada61c4bfa60228e100d6535e37b (patch)
treeaa6eee29bbedf5e6424a93c3c4a2ff34a9aa6919 /webkit/fileapi
parent58584d39d22e22d7e102523e7fc19aa5602ab097 (diff)
downloadchromium_src-df0211a7dd85ada61c4bfa60228e100d6535e37b.zip
chromium_src-df0211a7dd85ada61c4bfa60228e100d6535e37b.tar.gz
chromium_src-df0211a7dd85ada61c4bfa60228e100d6535e37b.tar.bz2
Revert 132134 - Use LocalFileReader in FileSystemURLRequestJob
Reason: multiple leak reports on the Memory FYI waterfall (Valgrind, Heapcheck). - to avoid file access on IO thread - to remove duplicated code - for further FileSystem stream related refactoring BUG=113300,114999,123302 TEST=FileSystemURLRequestJobTest.* Review URL: https://chromiumcodereview.appspot.com/10065011 TBR=kinuko@chromium.org Review URL: https://chromiumcodereview.appspot.com/10066043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132162 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi')
-rw-r--r--webkit/fileapi/file_system_url_request_job.cc80
-rw-r--r--webkit/fileapi/file_system_url_request_job.h7
2 files changed, 69 insertions, 18 deletions
diff --git a/webkit/fileapi/file_system_url_request_job.cc b/webkit/fileapi/file_system_url_request_job.cc
index 3a9af90..1815117 100644
--- a/webkit/fileapi/file_system_url_request_job.cc
+++ b/webkit/fileapi/file_system_url_request_job.cc
@@ -4,6 +4,8 @@
#include "webkit/fileapi/file_system_url_request_job.h"
+#include <vector>
+
#include "base/bind.h"
#include "base/compiler_specific.h"
#include "base/file_path.h"
@@ -11,7 +13,6 @@
#include "base/message_loop.h"
#include "base/platform_file.h"
#include "base/threading/thread_restrictions.h"
-#include "base/time.h"
#include "build/build_config.h"
#include "googleurl/src/gurl.h"
#include "net/base/file_stream.h"
@@ -23,7 +24,6 @@
#include "net/http/http_response_info.h"
#include "net/http/http_util.h"
#include "net/url_request/url_request.h"
-#include "webkit/blob/local_file_reader.h"
#include "webkit/blob/shareable_file_reference.h"
#include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/file_system_operation.h"
@@ -32,10 +32,13 @@
using net::URLRequest;
using net::URLRequestJob;
using net::URLRequestStatus;
-using webkit_blob::LocalFileReader;
namespace fileapi {
+static const int kFileFlags = base::PLATFORM_FILE_OPEN |
+ base::PLATFORM_FILE_READ |
+ base::PLATFORM_FILE_ASYNC;
+
static net::HttpResponseHeaders* CreateHttpResponseHeaders() {
// HttpResponseHeaders expects its input string to be terminated by two NULs.
static const char kStatus[] = "HTTP/1.1 200 OK\0";
@@ -59,11 +62,20 @@ FileSystemURLRequestJob::FileSystemURLRequestJob(
file_system_context_(file_system_context),
file_thread_proxy_(file_thread_proxy),
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)),
+ stream_(NULL),
is_directory_(false),
remaining_bytes_(0) {
}
-FileSystemURLRequestJob::~FileSystemURLRequestJob() {}
+FileSystemURLRequestJob::~FileSystemURLRequestJob() {
+ // Since we use the two-arg constructor of FileStream, we need to call Close()
+ // manually: ~FileStream won't call it for us.
+ if (stream_ != NULL) {
+ // Close() performs file IO: crbug.com/113300.
+ base::ThreadRestrictions::ScopedAllowIO allow_io;
+ stream_->CloseSync();
+ }
+}
void FileSystemURLRequestJob::Start() {
MessageLoop::current()->PostTask(
@@ -73,8 +85,12 @@ void FileSystemURLRequestJob::Start() {
}
void FileSystemURLRequestJob::Kill() {
- if (reader_.get() != NULL)
- reader_.reset();
+ if (stream_ != NULL) {
+ // Close() performs file IO: crbug.com/113300.
+ base::ThreadRestrictions::ScopedAllowIO allow_io;
+ stream_->CloseSync();
+ stream_.reset(NULL);
+ }
URLRequestJob::Kill();
weak_factory_.InvalidateWeakPtrs();
}
@@ -85,7 +101,7 @@ bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size,
DCHECK(bytes_read);
DCHECK_GE(remaining_bytes_, 0);
- if (reader_.get() == NULL)
+ if (stream_ == NULL)
return false;
if (remaining_bytes_ < dest_size)
@@ -96,9 +112,18 @@ bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size,
return true;
}
- const int rv = reader_->Read(dest, dest_size,
- base::Bind(&FileSystemURLRequestJob::DidRead,
- base::Unretained(this)));
+ int rv = stream_->Read(dest, dest_size,
+ base::Bind(&FileSystemURLRequestJob::DidRead,
+ base::Unretained(this)));
+ if (rv >= 0) {
+ // Data is immediately available.
+ *bytes_read = rv;
+ remaining_bytes_ -= rv;
+ DCHECK_GE(remaining_bytes_, 0);
+ return true;
+ }
+
+ // Otherwise, a read error occured. We may just need to wait...
if (rv == net::ERR_IO_PENDING)
SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
else
@@ -189,24 +214,47 @@ void FileSystemURLRequestJob::DidCreateSnapshot(
return;
}
- if (is_directory_) {
+ if (!is_directory_) {
+ base::FileUtilProxy::CreateOrOpen(
+ file_thread_proxy_, platform_path, kFileFlags,
+ base::Bind(&FileSystemURLRequestJob::DidOpen,
+ weak_factory_.GetWeakPtr()));
+ } else {
NotifyHeadersComplete();
+ }
+}
+
+void FileSystemURLRequestJob::DidOpen(base::PlatformFileError error_code,
+ base::PassPlatformFile file,
+ bool created) {
+ if (error_code != base::PLATFORM_FILE_OK) {
+ NotifyFailed(error_code);
return;
}
+ stream_.reset(new net::FileStream(file.ReleaseValue(), kFileFlags, NULL));
+
remaining_bytes_ = byte_range_.last_byte_position() -
byte_range_.first_byte_position() + 1;
DCHECK_GE(remaining_bytes_, 0);
- DCHECK(!reader_.get());
- reader_.reset(new LocalFileReader(
- file_thread_proxy_, platform_path,
- byte_range_.first_byte_position(),
- base::Time()));
+ // TODO(adamk): Please remove this ScopedAllowIO once we support async seek
+ // on FileStream. crbug.com/113300
+ base::ThreadRestrictions::ScopedAllowIO allow_io;
+ // Do the seek at the beginning of the request.
+ if (remaining_bytes_ > 0 &&
+ byte_range_.first_byte_position() != 0 &&
+ byte_range_.first_byte_position() !=
+ stream_->SeekSync(net::FROM_BEGIN,
+ byte_range_.first_byte_position())) {
+ NotifyFailed(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE);
+ return;
+ }
set_expected_content_size(remaining_bytes_);
response_info_.reset(new net::HttpResponseInfo());
response_info_->headers = CreateHttpResponseHeaders();
+
NotifyHeadersComplete();
}
diff --git a/webkit/fileapi/file_system_url_request_job.h b/webkit/fileapi/file_system_url_request_job.h
index f0f9a18..4f968e3 100644
--- a/webkit/fileapi/file_system_url_request_job.h
+++ b/webkit/fileapi/file_system_url_request_job.h
@@ -19,8 +19,11 @@
class GURL;
class FilePath;
+namespace net {
+class FileStream;
+}
+
namespace webkit_blob {
-class LocalFileReader;
class ShareableFileReference;
}
@@ -70,7 +73,7 @@ class FileSystemURLRequestJob : public net::URLRequestJob {
FileSystemContext* file_system_context_;
scoped_refptr<base::MessageLoopProxy> file_thread_proxy_;
base::WeakPtrFactory<FileSystemURLRequestJob> weak_factory_;
- scoped_ptr<webkit_blob::LocalFileReader> reader_;
+ scoped_ptr<net::FileStream> stream_;
scoped_refptr<webkit_blob::ShareableFileReference> snapshot_ref_;
bool is_directory_;
scoped_ptr<net::HttpResponseInfo> response_info_;