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 base::ThreadTaskRunnerHandle::Get()->PostTask( | 44 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", |
45 FROM_HERE, base::Bind(&ServiceWorkerReadFromCacheJob::StartAsync, | 45 "ServiceWorkerReadFromCacheJob::ReadInfo", this, |
46 weak_factory_.GetWeakPtr())); | 46 "URL", request_->url().spec()); |
| 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)); |
47 } | 64 } |
48 | 65 |
49 void ServiceWorkerReadFromCacheJob::Kill() { | 66 void ServiceWorkerReadFromCacheJob::Kill() { |
50 if (has_been_killed_) | 67 if (has_been_killed_) |
51 return; | 68 return; |
52 weak_factory_.InvalidateWeakPtrs(); | 69 weak_factory_.InvalidateWeakPtrs(); |
53 has_been_killed_ = true; | 70 has_been_killed_ = true; |
54 reader_.reset(); | 71 reader_.reset(); |
55 context_.reset(); | 72 context_.reset(); |
56 http_info_io_buffer_ = NULL; | 73 http_info_io_buffer_ = NULL; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 !net::HttpUtil::ParseRangeHeader(value, &ranges)) { | 115 !net::HttpUtil::ParseRangeHeader(value, &ranges)) { |
99 return; | 116 return; |
100 } | 117 } |
101 | 118 |
102 // If multiple ranges are requested, we play dumb and | 119 // If multiple ranges are requested, we play dumb and |
103 // return the entire response with 200 OK. | 120 // return the entire response with 200 OK. |
104 if (ranges.size() == 1U) | 121 if (ranges.size() == 1U) |
105 range_requested_ = ranges[0]; | 122 range_requested_ = ranges[0]; |
106 } | 123 } |
107 | 124 |
108 int ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf, | 125 bool ServiceWorkerReadFromCacheJob::ReadRawData(net::IOBuffer* buf, |
109 int buf_size) { | 126 int buf_size, |
| 127 int* bytes_read) { |
110 DCHECK_NE(buf_size, 0); | 128 DCHECK_NE(buf_size, 0); |
| 129 DCHECK(bytes_read); |
111 DCHECK(!reader_->IsReadPending()); | 130 DCHECK(!reader_->IsReadPending()); |
112 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", | 131 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", |
113 "ServiceWorkerReadFromCacheJob::ReadRawData", | 132 "ServiceWorkerReadFromCacheJob::ReadRawData", |
114 this, | 133 this, |
115 "URL", request_->url().spec()); | 134 "URL", request_->url().spec()); |
116 reader_->ReadData(buf, buf_size, | 135 reader_->ReadData(buf, buf_size, |
117 base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete, | 136 base::Bind(&ServiceWorkerReadFromCacheJob::OnReadComplete, |
118 weak_factory_.GetWeakPtr())); | 137 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())); | |
143 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); | 138 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); |
| 139 return false; |
144 } | 140 } |
145 | 141 |
146 const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const { | 142 const net::HttpResponseInfo* ServiceWorkerReadFromCacheJob::http_info() const { |
147 if (!http_info_) | 143 if (!http_info_) |
148 return NULL; | 144 return NULL; |
149 if (range_response_info_) | 145 if (range_response_info_) |
150 return range_response_info_.get(); | 146 return range_response_info_.get(); |
151 return http_info_.get(); | 147 return http_info_.get(); |
152 } | 148 } |
153 | 149 |
154 void ServiceWorkerReadFromCacheJob::OnReadInfoComplete(int result) { | 150 void ServiceWorkerReadFromCacheJob::OnReadInfoComplete(int result) { |
155 scoped_refptr<ServiceWorkerReadFromCacheJob> protect(this); | 151 scoped_refptr<ServiceWorkerReadFromCacheJob> protect(this); |
156 if (!http_info_io_buffer_->http_info) { | 152 if (!http_info_io_buffer_->http_info) { |
157 DCHECK_LT(result, 0); | 153 DCHECK_LT(result, 0); |
158 ServiceWorkerMetrics::CountReadResponseResult( | 154 ServiceWorkerMetrics::CountReadResponseResult( |
159 ServiceWorkerMetrics::READ_HEADERS_ERROR); | 155 ServiceWorkerMetrics::READ_HEADERS_ERROR); |
160 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); | 156 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
161 NotifyStartError( | |
162 net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); | |
163 return; | 157 return; |
164 } | 158 } |
165 DCHECK_GE(result, 0); | 159 DCHECK_GE(result, 0); |
166 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status | 160 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status |
167 http_info_.reset(http_info_io_buffer_->http_info.release()); | 161 http_info_.reset(http_info_io_buffer_->http_info.release()); |
168 if (is_range_request()) | 162 if (is_range_request()) |
169 SetupRangeResponse(http_info_io_buffer_->response_data_size); | 163 SetupRangeResponse(http_info_io_buffer_->response_data_size); |
170 http_info_io_buffer_ = NULL; | 164 http_info_io_buffer_ = NULL; |
171 if (request_->url() == version_->script_url()) | 165 if (request_->url() == version_->script_url()) |
172 version_->SetMainScriptHttpResponseInfo(*http_info_); | 166 version_->SetMainScriptHttpResponseInfo(*http_info_); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 version_->SetStartWorkerStatusCode(SERVICE_WORKER_ERROR_DISK_CACHE); | 200 version_->SetStartWorkerStatusCode(SERVICE_WORKER_ERROR_DISK_CACHE); |
207 // TODO(falken): Retry before evicting. | 201 // TODO(falken): Retry before evicting. |
208 if (context_) { | 202 if (context_) { |
209 ServiceWorkerRegistration* registration = | 203 ServiceWorkerRegistration* registration = |
210 context_->GetLiveRegistration(version_->registration_id()); | 204 context_->GetLiveRegistration(version_->registration_id()); |
211 registration->DeleteVersion(version_); | 205 registration->DeleteVersion(version_); |
212 } | 206 } |
213 } | 207 } |
214 if (is_main_script()) | 208 if (is_main_script()) |
215 version_->embedded_worker()->OnScriptReadFinished(); | 209 version_->embedded_worker()->OnScriptReadFinished(); |
| 210 NotifyDone(status); |
216 } | 211 } |
217 | 212 |
218 void ServiceWorkerReadFromCacheJob::OnReadComplete(int result) { | 213 void ServiceWorkerReadFromCacheJob::OnReadComplete(int result) { |
219 ServiceWorkerMetrics::ReadResponseResult check_result; | 214 ServiceWorkerMetrics::ReadResponseResult check_result; |
220 | 215 if (result == 0) { |
221 if (result >= 0) { | |
222 check_result = ServiceWorkerMetrics::READ_OK; | 216 check_result = ServiceWorkerMetrics::READ_OK; |
223 if (result == 0) | 217 Done(net::URLRequestStatus()); |
224 Done(net::URLRequestStatus()); | 218 } else if (result < 0) { |
225 } else { | |
226 check_result = ServiceWorkerMetrics::READ_DATA_ERROR; | 219 check_result = ServiceWorkerMetrics::READ_DATA_ERROR; |
227 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); | 220 Done(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
| 221 } else { |
| 222 check_result = ServiceWorkerMetrics::READ_OK; |
| 223 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status |
228 } | 224 } |
229 | |
230 ServiceWorkerMetrics::CountReadResponseResult(check_result); | 225 ServiceWorkerMetrics::CountReadResponseResult(check_result); |
231 ReadRawDataComplete(result); | 226 NotifyReadComplete(result); |
232 TRACE_EVENT_ASYNC_END1("ServiceWorker", | 227 TRACE_EVENT_ASYNC_END1("ServiceWorker", |
233 "ServiceWorkerReadFromCacheJob::ReadRawData", | 228 "ServiceWorkerReadFromCacheJob::ReadRawData", |
234 this, | 229 this, |
235 "Result", result); | 230 "Result", result); |
236 } | 231 } |
237 | 232 |
238 } // namespace content | 233 } // namespace content |
OLD | NEW |