OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/renderer/service_worker/service_worker_context_client.h" | 5 #include "content/renderer/service_worker/service_worker_context_client.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; | 235 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; |
236 }; | 236 }; |
237 | 237 |
238 class ServiceWorkerContextClient::NavigationPreloadRequest final | 238 class ServiceWorkerContextClient::NavigationPreloadRequest final |
239 : public mojom::URLLoaderClient { | 239 : public mojom::URLLoaderClient { |
240 public: | 240 public: |
241 NavigationPreloadRequest(int fetch_event_id, | 241 NavigationPreloadRequest(int fetch_event_id, |
242 const GURL& url, | 242 const GURL& url, |
243 mojom::FetchEventPreloadHandlePtr preload_handle) | 243 mojom::FetchEventPreloadHandlePtr preload_handle) |
244 : fetch_event_id_(fetch_event_id), | 244 : fetch_event_id_(fetch_event_id), |
| 245 url_(url), |
245 url_loader_(std::move(preload_handle->url_loader)), | 246 url_loader_(std::move(preload_handle->url_loader)), |
246 binding_(this, std::move(preload_handle->url_loader_client_request)), | 247 binding_(this, std::move(preload_handle->url_loader_client_request)) {} |
247 response_(base::MakeUnique<blink::WebServiceWorkerResponse>()) { | |
248 response_->setURL(url); | |
249 } | |
250 | 248 |
251 ~NavigationPreloadRequest() override { | 249 ~NavigationPreloadRequest() override { |
252 if (result_reported_) | 250 if (result_reported_) |
253 return; | 251 return; |
254 ServiceWorkerContextClient* client = | 252 ServiceWorkerContextClient* client = |
255 ServiceWorkerContextClient::ThreadSpecificInstance(); | 253 ServiceWorkerContextClient::ThreadSpecificInstance(); |
256 if (!client) | 254 if (!client) |
257 return; | 255 return; |
258 client->OnNavigationPreloadError( | 256 client->OnNavigationPreloadError( |
259 fetch_event_id_, | 257 fetch_event_id_, |
260 base::MakeUnique<blink::WebServiceWorkerError>( | 258 base::MakeUnique<blink::WebServiceWorkerError>( |
261 blink::WebServiceWorkerError::ErrorTypeAbort, | 259 blink::WebServiceWorkerError::ErrorTypeAbort, |
262 blink::WebString::fromUTF8( | 260 blink::WebString::fromUTF8( |
263 "Service Worker navigation preload aborted. Need to guard with " | 261 "Service Worker navigation preload aborted. Need to guard with " |
264 "respondWith or waitUntil."))); | 262 "respondWith or waitUntil."))); |
265 } | 263 } |
266 | 264 |
267 void OnReceiveResponse(const ResourceResponseHead& response_head) override { | 265 void OnReceiveResponse(const ResourceResponseHead& response_head) override { |
268 DCHECK(response_); | 266 DCHECK(!response_); |
| 267 response_ = base::MakeUnique<blink::WebServiceWorkerResponse>(); |
| 268 response_->setURL(url_); |
269 DCHECK(response_head.headers); | 269 DCHECK(response_head.headers); |
270 response_->setStatus(response_head.headers->response_code()); | 270 response_->setStatus(response_head.headers->response_code()); |
271 response_->setStatusText( | 271 response_->setStatusText( |
272 blink::WebString::fromUTF8(response_head.headers->GetStatusText())); | 272 blink::WebString::fromUTF8(response_head.headers->GetStatusText())); |
273 response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic); | 273 response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic); |
274 size_t iter = 0; | 274 size_t iter = 0; |
275 std::string header_name; | 275 std::string header_name; |
276 std::string header_value; | 276 std::string header_value; |
277 while (response_head.headers->EnumerateHeaderLines(&iter, &header_name, | 277 while (response_head.headers->EnumerateHeaderLines(&iter, &header_name, |
278 &header_value)) { | 278 &header_value)) { |
279 response_->appendHeader(blink::WebString::fromUTF8(header_name), | 279 response_->appendHeader(blink::WebString::fromUTF8(header_name), |
280 blink::WebString::fromUTF8(header_value)); | 280 blink::WebString::fromUTF8(header_value)); |
281 } | 281 } |
282 response_->setResponseTime(response_head.response_time.ToInternalValue()); | 282 response_->setResponseTime(response_head.response_time.ToInternalValue()); |
| 283 MaybeReportToClient(); |
283 } | 284 } |
284 | 285 |
285 void OnStartLoadingResponseBody( | 286 void OnStartLoadingResponseBody( |
286 mojo::ScopedDataPipeConsumerHandle body) override { | 287 mojo::ScopedDataPipeConsumerHandle body) override { |
287 DCHECK(!result_reported_); | 288 DCHECK(!body_.is_valid()); |
288 ServiceWorkerContextClient* client = | 289 body_ = std::move(body); |
289 ServiceWorkerContextClient::ThreadSpecificInstance(); | 290 MaybeReportToClient(); |
290 if (!client) | |
291 return; | |
292 client->OnNavigationPreloadResponse( | |
293 fetch_event_id_, std::move(response_), | |
294 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body))); | |
295 result_reported_ = true; | |
296 } | 291 } |
297 | 292 |
298 void OnComplete(const ResourceRequestCompletionStatus& status) override { | 293 void OnComplete(const ResourceRequestCompletionStatus& status) override { |
299 // We don't report to |client| if OnStartLoadingResponseBody() has already | 294 // We don't report to |client| if OnStartLoadingResponseBody() has already |
300 // called OnNavigationPreloadResponse(). | 295 // called OnNavigationPreloadResponse(). |
301 if (result_reported_) | 296 if (result_reported_) |
302 return; | 297 return; |
303 DCHECK_NE(0, status.error_code); | 298 DCHECK_NE(0, status.error_code); |
304 ServiceWorkerContextClient* client = | 299 ServiceWorkerContextClient* client = |
305 ServiceWorkerContextClient::ThreadSpecificInstance(); | 300 ServiceWorkerContextClient::ThreadSpecificInstance(); |
306 if (!client) | 301 if (!client) |
307 return; | 302 return; |
308 client->OnNavigationPreloadError( | 303 client->OnNavigationPreloadError( |
309 fetch_event_id_, | 304 fetch_event_id_, |
310 base::MakeUnique<blink::WebServiceWorkerError>( | 305 base::MakeUnique<blink::WebServiceWorkerError>( |
311 blink::WebServiceWorkerError::ErrorTypeNetwork, | 306 blink::WebServiceWorkerError::ErrorTypeNetwork, |
312 blink::WebString::fromUTF8( | 307 blink::WebString::fromUTF8( |
313 "Service Worker navigation preload network error."))); | 308 "Service Worker navigation preload network error."))); |
314 result_reported_ = true; | 309 result_reported_ = true; |
315 } | 310 } |
316 | 311 |
317 private: | 312 private: |
| 313 void MaybeReportToClient() { |
| 314 DCHECK(!result_reported_); |
| 315 if (!response_ || !body_.is_valid()) |
| 316 return; |
| 317 ServiceWorkerContextClient* client = |
| 318 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 319 if (!client) |
| 320 return; |
| 321 |
| 322 client->OnNavigationPreloadResponse( |
| 323 fetch_event_id_, std::move(response_), |
| 324 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); |
| 325 result_reported_ = true; |
| 326 } |
| 327 |
318 const int fetch_event_id_; | 328 const int fetch_event_id_; |
| 329 const GURL url_; |
319 mojom::URLLoaderPtr url_loader_; | 330 mojom::URLLoaderPtr url_loader_; |
320 mojo::Binding<mojom::URLLoaderClient> binding_; | 331 mojo::Binding<mojom::URLLoaderClient> binding_; |
| 332 |
321 std::unique_ptr<blink::WebServiceWorkerResponse> response_; | 333 std::unique_ptr<blink::WebServiceWorkerResponse> response_; |
| 334 mojo::ScopedDataPipeConsumerHandle body_; |
322 bool result_reported_ = false; | 335 bool result_reported_ = false; |
323 }; | 336 }; |
324 | 337 |
325 class ServiceWorkerContextClient::FetchEventDispatcherImpl | 338 class ServiceWorkerContextClient::FetchEventDispatcherImpl |
326 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { | 339 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { |
327 public: | 340 public: |
328 static void Create(mojom::FetchEventDispatcherRequest request) { | 341 static void Create(mojom::FetchEventDispatcherRequest request) { |
329 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), | 342 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), |
330 std::move(request)); | 343 std::move(request)); |
331 } | 344 } |
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 } | 1291 } |
1279 | 1292 |
1280 base::WeakPtr<ServiceWorkerContextClient> | 1293 base::WeakPtr<ServiceWorkerContextClient> |
1281 ServiceWorkerContextClient::GetWeakPtr() { | 1294 ServiceWorkerContextClient::GetWeakPtr() { |
1282 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1295 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
1283 DCHECK(context_); | 1296 DCHECK(context_); |
1284 return context_->weak_factory.GetWeakPtr(); | 1297 return context_->weak_factory.GetWeakPtr(); |
1285 } | 1298 } |
1286 | 1299 |
1287 } // namespace content | 1300 } // namespace content |
OLD | NEW |