| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/service_worker/service_worker_read_from_cache_job.h" | 5 #include "content/browser/service_worker/service_worker_read_from_cache_job.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 context_(context), | 34 context_(context), |
| 35 version_(version), | 35 version_(version), |
| 36 resource_id_(resource_id), | 36 resource_id_(resource_id), |
| 37 has_been_killed_(false), | 37 has_been_killed_(false), |
| 38 weak_factory_(this) {} | 38 weak_factory_(this) {} |
| 39 | 39 |
| 40 ServiceWorkerReadFromCacheJob::~ServiceWorkerReadFromCacheJob() { | 40 ServiceWorkerReadFromCacheJob::~ServiceWorkerReadFromCacheJob() { |
| 41 } | 41 } |
| 42 | 42 |
| 43 void ServiceWorkerReadFromCacheJob::Start() { | 43 void ServiceWorkerReadFromCacheJob::Start() { |
| 44 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", | 44 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 45 "ServiceWorkerReadFromCacheJob::ReadInfo", this, | 45 FROM_HERE, base::Bind(&ServiceWorkerReadFromCacheJob::StartAsync, |
| 46 "URL", request_->url().spec()); | 46 weak_factory_.GetWeakPtr())); |
| 47 if (!context_) { | |
| 48 NotifyStartError( | |
| 49 net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); | |
| 50 return; | |
| 51 } | |
| 52 | |
| 53 // Create a response reader and start reading the headers, | |
| 54 // we'll continue when thats done. | |
| 55 if (is_main_script()) | |
| 56 version_->embedded_worker()->OnScriptReadStarted(); | |
| 57 reader_ = context_->storage()->CreateResponseReader(resource_id_); | |
| 58 http_info_io_buffer_ = new HttpResponseInfoIOBuffer; | |
| 59 reader_->ReadInfo( | |
| 60 http_info_io_buffer_.get(), | |
| 61 base::Bind(&ServiceWorkerReadFromCacheJob::OnReadInfoComplete, | |
| 62 weak_factory_.GetWeakPtr())); | |
| 63 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); | |
| 64 } | 47 } |
| 65 | 48 |
| 66 void ServiceWorkerReadFromCacheJob::Kill() { | 49 void ServiceWorkerReadFromCacheJob::Kill() { |
| 67 if (has_been_killed_) | 50 if (has_been_killed_) |
| 68 return; | 51 return; |
| 69 weak_factory_.InvalidateWeakPtrs(); | 52 weak_factory_.InvalidateWeakPtrs(); |
| 70 has_been_killed_ = true; | 53 has_been_killed_ = true; |
| 71 reader_.reset(); | 54 reader_.reset(); |
| 72 context_.reset(); | 55 context_.reset(); |
| 73 http_info_io_buffer_ = NULL; | 56 http_info_io_buffer_ = NULL; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 !net::HttpUtil::ParseRangeHeader(value, &ranges)) { | 98 !net::HttpUtil::ParseRangeHeader(value, &ranges)) { |
| 116 return; | 99 return; |
| 117 } | 100 } |
| 118 | 101 |
| 119 // If multiple ranges are requested, we play dumb and | 102 // If multiple ranges are requested, we play dumb and |
| 120 // return the entire response with 200 OK. | 103 // return the entire response with 200 OK. |
| 121 if (ranges.size() == 1U) | 104 if (ranges.size() == 1U) |
| 122 range_requested_ = ranges[0]; | 105 range_requested_ = ranges[0]; |
| 123 } | 106 } |
| 124 | 107 |
| 125 bool ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf, | 108 int ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf, |
| 126 int buf_size, | 109 int buf_size) { |
| 127 int* bytes_read) { | |
| 128 DCHECK_NE(buf_size, 0); | 110 DCHECK_NE(buf_size, 0); |
| 129 DCHECK(bytes_read); | |
| 130 DCHECK(!reader_->IsReadPending()); | 111 DCHECK(!reader_->IsReadPending()); |
| 131 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", | 112 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", |
| 132 "ServiceWorkerReadFromCacheJob::ReadRawData", | 113 "ServiceWorkerReadFromCacheJob::ReadRawData", |
| 133 this, | 114 this, |
| 134 "URL", request_->url().spec()); | 115 "URL", request_->url().spec()); |
| 135 reader_->ReadData(buf, buf_size, | 116 reader_->ReadData(buf, buf_size, |
| 136 base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete, | 117 base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete, |
| 137 weak_factory_.GetWeakPtr())); | 118 weak_factory_.GetWeakPtr())); |
| 119 return net::ERR_IO_PENDING; |
| 120 } |
| 121 |
| 122 void ServiceWorkerReadFromCacheJob::StartAsync() { |
| 123 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", |
| 124 "ServiceWorkerReadFromCacheJob::ReadInfo", this, |
| 125 "URL", request_->url().spec()); |
| 126 if (!context_) { |
| 127 // NotifyStartError is not safe to call synchronously in Start. |
| 128 NotifyStartError( |
| 129 net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); |
| 130 return; |
| 131 } |
| 132 |
| 133 // Create a response reader and start reading the headers, |
| 134 // we'll continue when thats done. |
| 135 if (is_main_script()) |
| 136 version_->embedded_worker()->OnScriptReadStarted(); |
| 137 reader_ = context_->storage()->CreateResponseReader(resource_id_); |
| 138 http_info_io_buffer_ = new HttpResponseInfoIOBuffer; |
| 139 reader_->ReadInfo( |
| 140 http_info_io_buffer_.get(), |
| 141 base::Bind(&ServiceWorkerReadFromCacheJob::OnReadInfoComplete, |
| 142 weak_factory_.GetWeakPtr())); |
| 138 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); | 143 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); |
| 139 return false; | |
| 140 } | 144 } |
| 141 | 145 |
| 142 const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const { | 146 const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const { |
| 143 if (!http_info_) | 147 if (!http_info_) |
| 144 return NULL; | 148 return NULL; |
| 145 if (range_response_info_) | 149 if (range_response_info_) |
| 146 return range_response_info_.get(); | 150 return range_response_info_.get(); |
| 147 return http_info_.get(); | 151 return http_info_.get(); |
| 148 } | 152 } |
| 149 | 153 |
| 150 void ServiceWorkerReadFromCacheJob::OnReadInfoComplete(int result) { | 154 void ServiceWorkerReadFromCacheJob::OnReadInfoComplete(int result) { |
| 151 scoped_refptr<ServiceWorkerReadFromCacheJob> protect(this); | 155 scoped_refptr<ServiceWorkerReadFromCacheJob> protect(this); |
| 152 if (!http_info_io_buffer_->http_info) { | 156 if (!http_info_io_buffer_->http_info) { |
| 153 DCHECK_LT(result, 0); | 157 DCHECK_LT(result, 0); |
| 154 ServiceWorkerMetrics::CountReadResponseResult( | 158 ServiceWorkerMetrics::CountReadResponseResult( |
| 155 ServiceWorkerMetrics::READ_HEADERS_ERROR); | 159 ServiceWorkerMetrics::READ_HEADERS_ERROR); |
| 156 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); | 160 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
| 161 NotifyStartError( |
| 162 net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
| 157 return; | 163 return; |
| 158 } | 164 } |
| 159 DCHECK_GE(result, 0); | 165 DCHECK_GE(result, 0); |
| 160 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status | 166 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status |
| 161 http_info_.reset(http_info_io_buffer_->http_info.release()); | 167 http_info_.reset(http_info_io_buffer_->http_info.release()); |
| 162 if (is_range_request()) | 168 if (is_range_request()) |
| 163 SetupRangeResponse(http_info_io_buffer_->response_data_size); | 169 SetupRangeResponse(http_info_io_buffer_->response_data_size); |
| 164 http_info_io_buffer_ = NULL; | 170 http_info_io_buffer_ = NULL; |
| 165 if (request_->url() == version_->script_url()) | 171 if (request_->url() == version_->script_url()) |
| 166 version_->SetMainScriptHttpResponseInfo(*http_info_); | 172 version_->SetMainScriptHttpResponseInfo(*http_info_); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 version_->SetStartWorkerStatusCode(SERVICE_WORKER_ERROR_DISK_CACHE); | 206 version_->SetStartWorkerStatusCode(SERVICE_WORKER_ERROR_DISK_CACHE); |
| 201 // TODO(falken): Retry before evicting. | 207 // TODO(falken): Retry before evicting. |
| 202 if (context_) { | 208 if (context_) { |
| 203 ServiceWorkerRegistration* registration = | 209 ServiceWorkerRegistration* registration = |
| 204 context_->GetLiveRegistration(version_->registration_id()); | 210 context_->GetLiveRegistration(version_->registration_id()); |
| 205 registration->DeleteVersion(version_); | 211 registration->DeleteVersion(version_); |
| 206 } | 212 } |
| 207 } | 213 } |
| 208 if (is_main_script()) | 214 if (is_main_script()) |
| 209 version_->embedded_worker()->OnScriptReadFinished(); | 215 version_->embedded_worker()->OnScriptReadFinished(); |
| 210 NotifyDone(status); | |
| 211 } | 216 } |
| 212 | 217 |
| 213 void ServiceWorkerReadFromCacheJob::OnReadComplete(int result) { | 218 void ServiceWorkerReadFromCacheJob::OnReadComplete(int result) { |
| 214 ServiceWorkerMetrics::ReadResponseResult check_result; | 219 ServiceWorkerMetrics::ReadResponseResult check_result; |
| 215 if (result == 0) { | 220 |
| 221 if (result >= 0) { |
| 216 check_result = ServiceWorkerMetrics::READ_OK; | 222 check_result = ServiceWorkerMetrics::READ_OK; |
| 217 Done(net::URLRequestStatus()); | 223 if (result == 0) |
| 218 } else if (result < 0) { | 224 Done(net::URLRequestStatus()); |
| 225 } else { |
| 219 check_result = ServiceWorkerMetrics::READ_DATA_ERROR; | 226 check_result = ServiceWorkerMetrics::READ_DATA_ERROR; |
| 220 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); | 227 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
| 221 } else { | |
| 222 check_result = ServiceWorkerMetrics::READ_OK; | |
| 223 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status | |
| 224 } | 228 } |
| 229 |
| 225 ServiceWorkerMetrics::CountReadResponseResult(check_result); | 230 ServiceWorkerMetrics::CountReadResponseResult(check_result); |
| 226 NotifyReadComplete(result); | 231 ReadRawDataComplete(result); |
| 227 TRACE_EVENT_ASYNC_END1("ServiceWorker", | 232 TRACE_EVENT_ASYNC_END1("ServiceWorker", |
| 228 "ServiceWorkerReadFromCacheJob::ReadRawData", | 233 "ServiceWorkerReadFromCacheJob::ReadRawData", |
| 229 this, | 234 this, |
| 230 "Result", result); | 235 "Result", result); |
| 231 } | 236 } |
| 232 | 237 |
| 233 } // namespace content | 238 } // namespace content |
| OLD | NEW |