Index: ios/web/webui/url_data_manager_ios_backend.cc |
diff --git a/ios/web/webui/url_data_manager_ios_backend.cc b/ios/web/webui/url_data_manager_ios_backend.cc |
index d5117c27f13c2f907c272aa2f06a31efa2c1ffe6..cc3e3e9af8886bfdab7f8a0ee3822425feeab4a3 100644 |
--- a/ios/web/webui/url_data_manager_ios_backend.cc |
+++ b/ios/web/webui/url_data_manager_ios_backend.cc |
@@ -96,7 +96,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; |
@@ -142,7 +142,7 @@ class URLRequestChromeJob : public net::URLRequestJob { |
// Do the actual copy from data_ (the data we're serving) into |buf|. |
// Separate from ReadRawData so we can handle async I/O. |
- int CompleteRead(net::IOBuffer* buf, int buf_size); |
+ 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_; |
@@ -291,46 +291,58 @@ 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 rv = CompleteRead(pending_buf_.get(), pending_buf_size_); |
+ CompleteRead(pending_buf_.get(), pending_buf_size_, &bytes_read); |
pending_buf_ = NULL; |
- ReadRawDataComplete(rv); |
+ NotifyReadComplete(bytes_read); |
} |
} else { |
- ReadRawDataComplete(net::ERR_FAILED); |
+ // The request failed. |
+ NotifyDone( |
+ net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); |
} |
} |
-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; // Tell the caller we're still waiting for |
- // data. |
+ 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) { |
+void URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, |
+ int buf_size, |
+ int* bytes_read) { |
// http://crbug.com/373841 |
char url_buf[128]; |
base::strlcpy(url_buf, request_->url().spec().c_str(), arraysize(url_buf)); |
base::debug::Alias(url_buf); |
- int remaining = data_->size() - data_offset_; |
+ int remaining = static_cast<int>(data_->size()) - data_offset_; |
if (buf_size > remaining) |
buf_size = remaining; |
if (buf_size > 0) { |
memcpy(buf->data(), data_->front() + data_offset_, buf_size); |
data_offset_ += buf_size; |
} |
- return buf_size; |
+ *bytes_read = buf_size; |
} |
namespace { |