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 |