Index: content/browser/webui/url_data_manager_backend.cc |
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc |
index 485aff6ee42ee138e1296a990fcf6a81a17d10ce..44302df1c16174363cda722b4e76f64ce6256f5c 100644 |
--- a/content/browser/webui/url_data_manager_backend.cc |
+++ b/content/browser/webui/url_data_manager_backend.cc |
@@ -119,7 +119,7 @@ class URLRequestChromeJob : public net::URLRequestJob { |
// net::URLRequestJob implementation. |
void Start() override; |
void Kill() override; |
- int ReadRawData(net::IOBuffer* buf, int buf_size) override; |
+ bool ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) override; |
bool GetMimeType(std::string* mime_type) const override; |
int GetResponseCode() const override; |
void GetResponseInfo(net::HttpResponseInfo* info) override; |
@@ -190,9 +190,8 @@ class URLRequestChromeJob : public net::URLRequestJob { |
bool RequiresUnsafeEval() const; |
// Do the actual copy from data_ (the data we're serving) into |buf|. |
- // Separate from ReadRawData so we can handle async I/O. Returns the number of |
- // bytes read. |
- int CompleteRead(net::IOBuffer* buf, int buf_size); |
+ // Separate from ReadRawData so we can handle async I/O. |
+ void CompleteRead(net::IOBuffer* buf, int buf_size, int* bytes_read); |
// The actual data we're serving. NULL until it's been fetched. |
scoped_refptr<base::RefCountedMemory> data_; |
@@ -337,16 +336,22 @@ void URLRequestChromeJob::MimeTypeAvailable(const std::string& mime_type) { |
void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) { |
TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this); |
if (bytes) { |
+ // The request completed, and we have all the data. |
+ // Clear any IO pending status. |
+ SetStatus(net::URLRequestStatus()); |
+ |
data_ = bytes; |
+ int bytes_read; |
if (pending_buf_.get()) { |
CHECK(pending_buf_->data()); |
- int result = CompleteRead(pending_buf_.get(), pending_buf_size_); |
+ CompleteRead(pending_buf_.get(), pending_buf_size_, &bytes_read); |
pending_buf_ = NULL; |
- ReadRawDataComplete(result); |
+ NotifyReadComplete(bytes_read); |
} |
} else { |
// The request failed. |
- ReadRawDataComplete(net::ERR_FAILED); |
+ NotifyDone( |
+ net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); |
} |
} |
@@ -354,21 +359,27 @@ base::WeakPtr<URLRequestChromeJob> URLRequestChromeJob::AsWeakPtr() { |
return weak_factory_.GetWeakPtr(); |
} |
-int URLRequestChromeJob::ReadRawData(net::IOBuffer* buf, int buf_size) { |
+bool URLRequestChromeJob::ReadRawData(net::IOBuffer* buf, |
+ int buf_size, |
+ int* bytes_read) { |
if (!data_.get()) { |
+ SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); |
DCHECK(!pending_buf_.get()); |
CHECK(buf->data()); |
pending_buf_ = buf; |
pending_buf_size_ = buf_size; |
- return net::ERR_IO_PENDING; |
+ return false; // Tell the caller we're still waiting for data. |
} |
// Otherwise, the data is available. |
- return CompleteRead(buf, buf_size); |
+ CompleteRead(buf, buf_size, bytes_read); |
+ return true; |
} |
-int URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size) { |
- int remaining = data_->size() - data_offset_; |
+void URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, |
+ int buf_size, |
+ int* bytes_read) { |
+ int remaining = static_cast<int>(data_->size()) - data_offset_; |
if (buf_size > remaining) |
buf_size = remaining; |
if (buf_size > 0) { |
@@ -380,7 +391,7 @@ int URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size) { |
memcpy(buf->data(), data_->front() + data_offset_, buf_size); |
data_offset_ += buf_size; |
} |
- return buf_size; |
+ *bytes_read = buf_size; |
} |
void URLRequestChromeJob::CheckStoragePartitionMatches( |