| 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_controllee_request_handl
er.h" | 5 #include "content/browser/service_worker/service_worker_controllee_request_handl
er.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| 11 #include "content/browser/service_worker/service_worker_context_core.h" | 11 #include "content/browser/service_worker/service_worker_context_core.h" |
| 12 #include "content/browser/service_worker/service_worker_metrics.h" | 12 #include "content/browser/service_worker/service_worker_metrics.h" |
| 13 #include "content/browser/service_worker/service_worker_provider_host.h" | 13 #include "content/browser/service_worker/service_worker_provider_host.h" |
| 14 #include "content/browser/service_worker/service_worker_registration.h" | 14 #include "content/browser/service_worker/service_worker_registration.h" |
| 15 #include "content/browser/service_worker/service_worker_response_info.h" |
| 15 #include "content/browser/service_worker/service_worker_url_request_job.h" | 16 #include "content/browser/service_worker/service_worker_url_request_job.h" |
| 16 #include "content/common/resource_request_body.h" | 17 #include "content/common/resource_request_body.h" |
| 17 #include "content/common/service_worker/service_worker_types.h" | 18 #include "content/common/service_worker/service_worker_types.h" |
| 18 #include "content/common/service_worker/service_worker_utils.h" | 19 #include "content/common/service_worker/service_worker_utils.h" |
| 19 #include "content/public/browser/content_browser_client.h" | 20 #include "content/public/browser/content_browser_client.h" |
| 20 #include "content/public/common/content_client.h" | 21 #include "content/public/common/content_client.h" |
| 21 #include "content/public/common/resource_response_info.h" | 22 #include "content/public/common/resource_response_info.h" |
| 22 #include "net/base/load_flags.h" | 23 #include "net/base/load_flags.h" |
| 23 #include "net/base/url_util.h" | 24 #include "net/base/url_util.h" |
| 24 #include "net/url_request/url_request.h" | 25 #include "net/url_request/url_request.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 43 is_main_resource_load_( | 44 is_main_resource_load_( |
| 44 ServiceWorkerUtils::IsMainResourceType(resource_type)), | 45 ServiceWorkerUtils::IsMainResourceType(resource_type)), |
| 45 request_mode_(request_mode), | 46 request_mode_(request_mode), |
| 46 credentials_mode_(credentials_mode), | 47 credentials_mode_(credentials_mode), |
| 47 redirect_mode_(redirect_mode), | 48 redirect_mode_(redirect_mode), |
| 48 request_context_type_(request_context_type), | 49 request_context_type_(request_context_type), |
| 49 frame_type_(frame_type), | 50 frame_type_(frame_type), |
| 50 body_(body), | 51 body_(body), |
| 51 force_update_started_(false), | 52 force_update_started_(false), |
| 52 use_network_(false), | 53 use_network_(false), |
| 53 was_fetched_via_service_worker_(false), | |
| 54 was_fallback_required_(false), | |
| 55 response_type_via_service_worker_( | |
| 56 blink::WebServiceWorkerResponseTypeDefault), | |
| 57 weak_factory_(this) {} | 54 weak_factory_(this) {} |
| 58 | 55 |
| 59 ServiceWorkerControlleeRequestHandler:: | 56 ServiceWorkerControlleeRequestHandler:: |
| 60 ~ServiceWorkerControlleeRequestHandler() { | 57 ~ServiceWorkerControlleeRequestHandler() { |
| 61 // Navigation triggers an update to occur shortly after the page and | 58 // Navigation triggers an update to occur shortly after the page and |
| 62 // its initial subresources load. | 59 // its initial subresources load. |
| 63 if (provider_host_ && provider_host_->active_version()) { | 60 if (provider_host_ && provider_host_->active_version()) { |
| 64 if (is_main_resource_load_ && !force_update_started_) | 61 if (is_main_resource_load_ && !force_update_started_) |
| 65 provider_host_->active_version()->ScheduleUpdate(); | 62 provider_host_->active_version()->ScheduleUpdate(); |
| 66 else | 63 else |
| 67 provider_host_->active_version()->DeferScheduledUpdate(); | 64 provider_host_->active_version()->DeferScheduledUpdate(); |
| 68 } | 65 } |
| 69 | 66 |
| 70 if (is_main_resource_load_ && provider_host_) | 67 if (is_main_resource_load_ && provider_host_) |
| 71 provider_host_->SetAllowAssociation(true); | 68 provider_host_->SetAllowAssociation(true); |
| 72 } | 69 } |
| 73 | 70 |
| 74 net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( | 71 net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( |
| 75 net::URLRequest* request, | 72 net::URLRequest* request, |
| 76 net::NetworkDelegate* network_delegate, | 73 net::NetworkDelegate* network_delegate, |
| 77 ResourceContext* resource_context) { | 74 ResourceContext* resource_context) { |
| 78 ClearJob(); | 75 ClearJob(); |
| 76 ServiceWorkerResponseInfo::ResetDataForRequest(request); |
| 79 | 77 |
| 80 if (!context_ || !provider_host_) { | 78 if (!context_ || !provider_host_) { |
| 81 // We can't do anything other than to fall back to network. | 79 // We can't do anything other than to fall back to network. |
| 82 return NULL; | 80 return NULL; |
| 83 } | 81 } |
| 84 | 82 |
| 85 // This may get called multiple times for original and redirect requests: | 83 // This may get called multiple times for original and redirect requests: |
| 86 // A. original request case: use_network_ is false, no previous location info. | 84 // A. original request case: use_network_ is false, no previous location info. |
| 87 // B. redirect or restarted request case: | 85 // B. redirect or restarted request case: |
| 88 // a) use_network_ is false if the previous location was forwarded to SW. | 86 // a) use_network_ is false if the previous location was forwarded to SW. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 if (!is_main_resource_load_) | 124 if (!is_main_resource_load_) |
| 127 use_network_ = true; | 125 use_network_ = true; |
| 128 | 126 |
| 129 job.reset(); | 127 job.reset(); |
| 130 ClearJob(); | 128 ClearJob(); |
| 131 } | 129 } |
| 132 | 130 |
| 133 return job.release(); | 131 return job.release(); |
| 134 } | 132 } |
| 135 | 133 |
| 136 void ServiceWorkerControlleeRequestHandler::GetExtraResponseInfo( | |
| 137 ResourceResponseInfo* response_info) const { | |
| 138 response_info->was_fetched_via_service_worker = | |
| 139 was_fetched_via_service_worker_; | |
| 140 response_info->was_fallback_required_by_service_worker = | |
| 141 was_fallback_required_; | |
| 142 response_info->original_url_via_service_worker = | |
| 143 original_url_via_service_worker_; | |
| 144 response_info->response_type_via_service_worker = | |
| 145 response_type_via_service_worker_; | |
| 146 response_info->service_worker_start_time = service_worker_start_time_; | |
| 147 response_info->service_worker_ready_time = service_worker_ready_time_; | |
| 148 response_info->is_in_cache_storage = response_is_in_cache_storage_; | |
| 149 response_info->cache_storage_cache_name = response_cache_storage_cache_name_; | |
| 150 } | |
| 151 | |
| 152 void ServiceWorkerControlleeRequestHandler::PrepareForMainResource( | 134 void ServiceWorkerControlleeRequestHandler::PrepareForMainResource( |
| 153 const net::URLRequest* request) { | 135 const net::URLRequest* request) { |
| 154 DCHECK(job_.get()); | 136 DCHECK(job_.get()); |
| 155 DCHECK(context_); | 137 DCHECK(context_); |
| 156 DCHECK(provider_host_); | 138 DCHECK(provider_host_); |
| 157 TRACE_EVENT_ASYNC_BEGIN1( | 139 TRACE_EVENT_ASYNC_BEGIN1( |
| 158 "ServiceWorker", | 140 "ServiceWorker", |
| 159 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", | 141 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 160 job_.get(), | 142 job_.get(), |
| 161 "URL", request->url().spec()); | 143 "URL", request->url().spec()); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 weak_factory_.GetWeakPtr(), registration, version)); | 348 weak_factory_.GetWeakPtr(), registration, version)); |
| 367 } | 349 } |
| 368 | 350 |
| 369 void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { | 351 void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { |
| 370 DCHECK(job_.get()); | 352 DCHECK(job_.get()); |
| 371 DCHECK(context_); | 353 DCHECK(context_); |
| 372 DCHECK(provider_host_->active_version()); | 354 DCHECK(provider_host_->active_version()); |
| 373 job_->ForwardToServiceWorker(); | 355 job_->ForwardToServiceWorker(); |
| 374 } | 356 } |
| 375 | 357 |
| 376 void ServiceWorkerControlleeRequestHandler::OnPrepareToRestart( | 358 void ServiceWorkerControlleeRequestHandler::OnPrepareToRestart() { |
| 377 base::TimeTicks service_worker_start_time, | |
| 378 base::TimeTicks service_worker_ready_time) { | |
| 379 use_network_ = true; | 359 use_network_ = true; |
| 380 ClearJob(); | 360 ClearJob(); |
| 381 // Update times, if not already set by a previous Job. | |
| 382 if (service_worker_start_time_.is_null()) { | |
| 383 service_worker_start_time_ = service_worker_start_time; | |
| 384 service_worker_ready_time_ = service_worker_ready_time; | |
| 385 } | |
| 386 } | |
| 387 | |
| 388 void ServiceWorkerControlleeRequestHandler::OnStartCompleted( | |
| 389 bool was_fetched_via_service_worker, | |
| 390 bool was_fallback_required, | |
| 391 const GURL& original_url_via_service_worker, | |
| 392 blink::WebServiceWorkerResponseType response_type_via_service_worker, | |
| 393 base::TimeTicks service_worker_start_time, | |
| 394 base::TimeTicks service_worker_ready_time, | |
| 395 bool response_is_in_cache_storage, | |
| 396 const std::string& response_cache_storage_cache_name) { | |
| 397 was_fetched_via_service_worker_ = was_fetched_via_service_worker; | |
| 398 was_fallback_required_ = was_fallback_required; | |
| 399 original_url_via_service_worker_ = original_url_via_service_worker; | |
| 400 response_type_via_service_worker_ = response_type_via_service_worker; | |
| 401 response_is_in_cache_storage_ = response_is_in_cache_storage; | |
| 402 response_cache_storage_cache_name_ = response_cache_storage_cache_name; | |
| 403 | |
| 404 // Update times, if not already set by a previous Job. | |
| 405 if (service_worker_start_time_.is_null()) { | |
| 406 service_worker_start_time_ = service_worker_start_time; | |
| 407 service_worker_ready_time_ = service_worker_ready_time; | |
| 408 } | |
| 409 } | 361 } |
| 410 | 362 |
| 411 ServiceWorkerVersion* | 363 ServiceWorkerVersion* |
| 412 ServiceWorkerControlleeRequestHandler::GetServiceWorkerVersion( | 364 ServiceWorkerControlleeRequestHandler::GetServiceWorkerVersion( |
| 413 ServiceWorkerMetrics::URLRequestJobResult* result) { | 365 ServiceWorkerMetrics::URLRequestJobResult* result) { |
| 414 if (!provider_host_) { | 366 if (!provider_host_) { |
| 415 *result = ServiceWorkerMetrics::REQUEST_JOB_ERROR_NO_PROVIDER_HOST; | 367 *result = ServiceWorkerMetrics::REQUEST_JOB_ERROR_NO_PROVIDER_HOST; |
| 416 return nullptr; | 368 return nullptr; |
| 417 } | 369 } |
| 418 if (!provider_host_->active_version()) { | 370 if (!provider_host_->active_version()) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 434 } | 386 } |
| 435 | 387 |
| 436 void ServiceWorkerControlleeRequestHandler::MainResourceLoadFailed() { | 388 void ServiceWorkerControlleeRequestHandler::MainResourceLoadFailed() { |
| 437 DCHECK(provider_host_); | 389 DCHECK(provider_host_); |
| 438 // Detach the controller so subresource requests also skip the worker. | 390 // Detach the controller so subresource requests also skip the worker. |
| 439 provider_host_->NotifyControllerLost(); | 391 provider_host_->NotifyControllerLost(); |
| 440 } | 392 } |
| 441 | 393 |
| 442 void ServiceWorkerControlleeRequestHandler::ClearJob() { | 394 void ServiceWorkerControlleeRequestHandler::ClearJob() { |
| 443 job_.reset(); | 395 job_.reset(); |
| 444 was_fetched_via_service_worker_ = false; | |
| 445 was_fallback_required_ = false; | |
| 446 original_url_via_service_worker_ = GURL(); | |
| 447 response_type_via_service_worker_ = | |
| 448 blink::WebServiceWorkerResponseTypeDefault; | |
| 449 response_is_in_cache_storage_ = false; | |
| 450 response_cache_storage_cache_name_ = std::string(); | |
| 451 } | 396 } |
| 452 | 397 |
| 453 } // namespace content | 398 } // namespace content |
| OLD | NEW |