Index: content/browser/service_worker/service_worker_read_from_cache_job.cc |
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job.cc b/content/browser/service_worker/service_worker_read_from_cache_job.cc |
index aecf390039264b9f70208f4304446309c2b4bd49..47b0b2b6b990e2200bc2d58e619761ac68023b82 100644 |
--- a/content/browser/service_worker/service_worker_read_from_cache_job.cc |
+++ b/content/browser/service_worker/service_worker_read_from_cache_job.cc |
@@ -41,11 +41,18 @@ ServiceWorkerReadFromCacheJob::~ServiceWorkerReadFromCacheJob() { |
} |
void ServiceWorkerReadFromCacheJob::Start() { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&ServiceWorkerReadFromCacheJob::StartAsync, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
+void ServiceWorkerReadFromCacheJob::StartAsync() { |
mmenke
2015/10/30 20:06:43
Should be in declaration order.
xunjieli
2015/10/30 20:33:28
Done. The order in this file doesn't strictly adhe
|
TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", |
"ServiceWorkerReadFromCacheJob::ReadInfo", |
this, |
"URL", request_->url().spec()); |
if (!context_) { |
+ // NotifyStartError is not safe to call synchronously in Start. |
NotifyStartError(net::URLRequestStatus( |
net::URLRequestStatus::FAILED, net::ERR_FAILED)); |
return; |
@@ -123,22 +130,18 @@ void ServiceWorkerReadFromCacheJob::SetExtraRequestHeaders( |
range_requested_ = ranges[0]; |
} |
-bool ServiceWorkerReadFromCacheJob::ReadRawData( |
- net::IOBuffer* buf, |
- int buf_size, |
- int *bytes_read) { |
+int ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf, |
+ int buf_size) { |
DCHECK_NE(buf_size, 0); |
- DCHECK(bytes_read); |
DCHECK(!reader_->IsReadPending()); |
TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", |
"ServiceWorkerReadFromCacheJob::ReadRawData", |
this, |
"URL", request_->url().spec()); |
- reader_->ReadData( |
- buf, buf_size, base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete, |
- weak_factory_.GetWeakPtr())); |
- SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); |
- return false; |
+ reader_->ReadData(buf, buf_size, |
+ base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete, |
+ weak_factory_.GetWeakPtr())); |
+ return net::ERR_IO_PENDING; |
} |
const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const { |
@@ -156,6 +159,8 @@ void ServiceWorkerReadFromCacheJob::OnReadInfoComplete(int result) { |
ServiceWorkerMetrics::CountReadResponseResult( |
ServiceWorkerMetrics::READ_HEADERS_ERROR); |
Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
+ NotifyStartError( |
+ net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
return; |
} |
DCHECK_GE(result, 0); |
@@ -209,23 +214,22 @@ void ServiceWorkerReadFromCacheJob::Done(const net::URLRequestStatus& status) { |
} |
if (is_main_script()) |
version_->embedded_worker()->OnScriptReadFinished(); |
- NotifyDone(status); |
} |
void ServiceWorkerReadFromCacheJob::OnReadComplete(int result) { |
ServiceWorkerMetrics::ReadResponseResult check_result; |
- if (result == 0) { |
+ |
+ if (result >= 0) { |
check_result = ServiceWorkerMetrics::READ_OK; |
- Done(net::URLRequestStatus()); |
- } else if (result < 0) { |
+ if (result == 0) |
+ Done(net::URLRequestStatus()); |
+ } else { |
check_result = ServiceWorkerMetrics::READ_DATA_ERROR; |
Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
- } else { |
- check_result = ServiceWorkerMetrics::READ_OK; |
- SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status |
} |
+ |
ServiceWorkerMetrics::CountReadResponseResult(check_result); |
- NotifyReadComplete(result); |
+ ReadRawDataComplete(result); |
TRACE_EVENT_ASYNC_END1("ServiceWorker", |
"ServiceWorkerReadFromCacheJob::ReadRawData", |
this, |