| 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_url_request_job.h" | 5 #include "content/browser/service_worker/service_worker_url_request_job.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 base::WeakPtr<ServiceWorkerProviderHost> provider_host, | 36 base::WeakPtr<ServiceWorkerProviderHost> provider_host, |
| 37 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, | 37 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
| 38 FetchRequestMode request_mode, | 38 FetchRequestMode request_mode, |
| 39 scoped_refptr<ResourceRequestBody> body) | 39 scoped_refptr<ResourceRequestBody> body) |
| 40 : net::URLRequestJob(request, network_delegate), | 40 : net::URLRequestJob(request, network_delegate), |
| 41 provider_host_(provider_host), | 41 provider_host_(provider_host), |
| 42 response_type_(NOT_DETERMINED), | 42 response_type_(NOT_DETERMINED), |
| 43 is_started_(false), | 43 is_started_(false), |
| 44 blob_storage_context_(blob_storage_context), | 44 blob_storage_context_(blob_storage_context), |
| 45 request_mode_(request_mode), | 45 request_mode_(request_mode), |
| 46 fall_back_required_(false), |
| 46 body_(body), | 47 body_(body), |
| 47 weak_factory_(this) { | 48 weak_factory_(this) { |
| 48 } | 49 } |
| 49 | 50 |
| 50 void ServiceWorkerURLRequestJob::FallbackToNetwork() { | 51 void ServiceWorkerURLRequestJob::FallbackToNetwork() { |
| 51 DCHECK_EQ(NOT_DETERMINED, response_type_); | 52 DCHECK_EQ(NOT_DETERMINED, response_type_); |
| 52 response_type_ = FALLBACK_TO_NETWORK; | 53 response_type_ = FALLBACK_TO_NETWORK; |
| 53 MaybeStartRequest(); | 54 MaybeStartRequest(); |
| 54 } | 55 } |
| 55 | 56 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 const net::HttpResponseInfo* ServiceWorkerURLRequestJob::http_info() const { | 189 const net::HttpResponseInfo* ServiceWorkerURLRequestJob::http_info() const { |
| 189 if (!http_response_info_) | 190 if (!http_response_info_) |
| 190 return NULL; | 191 return NULL; |
| 191 if (range_response_info_) | 192 if (range_response_info_) |
| 192 return range_response_info_.get(); | 193 return range_response_info_.get(); |
| 193 return http_response_info_.get(); | 194 return http_response_info_.get(); |
| 194 } | 195 } |
| 195 | 196 |
| 196 void ServiceWorkerURLRequestJob::GetExtraResponseInfo( | 197 void ServiceWorkerURLRequestJob::GetExtraResponseInfo( |
| 197 bool* was_fetched_via_service_worker, | 198 bool* was_fetched_via_service_worker, |
| 199 bool* was_fallback_required_by_service_worker, |
| 198 GURL* original_url_via_service_worker, | 200 GURL* original_url_via_service_worker, |
| 199 base::TimeTicks* fetch_start_time, | 201 base::TimeTicks* fetch_start_time, |
| 200 base::TimeTicks* fetch_ready_time, | 202 base::TimeTicks* fetch_ready_time, |
| 201 base::TimeTicks* fetch_end_time) const { | 203 base::TimeTicks* fetch_end_time) const { |
| 202 if (response_type_ != FORWARD_TO_SERVICE_WORKER) { | 204 if (response_type_ != FORWARD_TO_SERVICE_WORKER) { |
| 203 *was_fetched_via_service_worker = false; | 205 *was_fetched_via_service_worker = false; |
| 206 *was_fallback_required_by_service_worker = false; |
| 204 *original_url_via_service_worker = GURL(); | 207 *original_url_via_service_worker = GURL(); |
| 205 return; | 208 return; |
| 206 } | 209 } |
| 207 *was_fetched_via_service_worker = true; | 210 *was_fetched_via_service_worker = true; |
| 211 *was_fallback_required_by_service_worker = fall_back_required_; |
| 208 *original_url_via_service_worker = response_url_; | 212 *original_url_via_service_worker = response_url_; |
| 209 *fetch_start_time = fetch_start_time_; | 213 *fetch_start_time = fetch_start_time_; |
| 210 *fetch_ready_time = fetch_ready_time_; | 214 *fetch_ready_time = fetch_ready_time_; |
| 211 *fetch_end_time = fetch_end_time_; | 215 *fetch_end_time = fetch_end_time_; |
| 212 } | 216 } |
| 213 | 217 |
| 214 | 218 |
| 215 ServiceWorkerURLRequestJob::~ServiceWorkerURLRequestJob() { | 219 ServiceWorkerURLRequestJob::~ServiceWorkerURLRequestJob() { |
| 216 } | 220 } |
| 217 | 221 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 // (Tentative behavior described on github) | 370 // (Tentative behavior described on github) |
| 367 // TODO(kinuko): consider returning error if we've come here because | 371 // TODO(kinuko): consider returning error if we've come here because |
| 368 // unexpected worker termination etc (so that we could fix bugs). | 372 // unexpected worker termination etc (so that we could fix bugs). |
| 369 // TODO(kinuko): Would be nice to log the error case. | 373 // TODO(kinuko): Would be nice to log the error case. |
| 370 response_type_ = FALLBACK_TO_NETWORK; | 374 response_type_ = FALLBACK_TO_NETWORK; |
| 371 NotifyRestartRequired(); | 375 NotifyRestartRequired(); |
| 372 return; | 376 return; |
| 373 } | 377 } |
| 374 | 378 |
| 375 if (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK) { | 379 if (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK) { |
| 380 // When the request_mode is |CORS| or |CORS-with-forced-preflight| we can't |
| 381 // simply fallback to the network in the browser process. It is because the |
| 382 // CORS preflight logic is implemented in the renderer. So we returns a |
| 383 // fall_back_required response to the renderer. |
| 384 if (request_mode_ == FETCH_REQUEST_MODE_CORS || |
| 385 request_mode_ == FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT) { |
| 386 fall_back_required_ = true; |
| 387 CreateResponseHeader( |
| 388 400, "Service Worker Fallback Required", ServiceWorkerHeaderMap()); |
| 389 CommitResponseHeader(); |
| 390 return; |
| 391 } |
| 376 // Change the response type and restart the request to fallback to | 392 // Change the response type and restart the request to fallback to |
| 377 // the network. | 393 // the network. |
| 378 response_type_ = FALLBACK_TO_NETWORK; | 394 response_type_ = FALLBACK_TO_NETWORK; |
| 379 NotifyRestartRequired(); | 395 NotifyRestartRequired(); |
| 380 return; | 396 return; |
| 381 } | 397 } |
| 382 | 398 |
| 383 // We should have a response now. | 399 // We should have a response now. |
| 384 DCHECK_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, fetch_result); | 400 DCHECK_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, fetch_result); |
| 385 | 401 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 | 461 |
| 446 void ServiceWorkerURLRequestJob::DeliverErrorResponse() { | 462 void ServiceWorkerURLRequestJob::DeliverErrorResponse() { |
| 447 // TODO(falken): Print an error to the console of the ServiceWorker and of | 463 // TODO(falken): Print an error to the console of the ServiceWorker and of |
| 448 // the requesting page. | 464 // the requesting page. |
| 449 CreateResponseHeader( | 465 CreateResponseHeader( |
| 450 500, "Service Worker Response Error", ServiceWorkerHeaderMap()); | 466 500, "Service Worker Response Error", ServiceWorkerHeaderMap()); |
| 451 CommitResponseHeader(); | 467 CommitResponseHeader(); |
| 452 } | 468 } |
| 453 | 469 |
| 454 } // namespace content | 470 } // namespace content |
| OLD | NEW |