| 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 "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "content/browser/service_worker/service_worker_context_core.h" | 8 #include "content/browser/service_worker/service_worker_context_core.h" |
| 9 #include "content/browser/service_worker/service_worker_metrics.h" | 9 #include "content/browser/service_worker/service_worker_metrics.h" |
| 10 #include "content/browser/service_worker/service_worker_provider_host.h" | 10 #include "content/browser/service_worker/service_worker_provider_host.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 ServiceWorkerControlleeRequestHandler:: | 38 ServiceWorkerControlleeRequestHandler:: |
| 39 ~ServiceWorkerControlleeRequestHandler() { | 39 ~ServiceWorkerControlleeRequestHandler() { |
| 40 // Navigation triggers an update to occur shortly after the page and | 40 // Navigation triggers an update to occur shortly after the page and |
| 41 // its initial subresources load. | 41 // its initial subresources load. |
| 42 if (provider_host_ && provider_host_->active_version()) { | 42 if (provider_host_ && provider_host_->active_version()) { |
| 43 if (is_main_resource_load_) | 43 if (is_main_resource_load_) |
| 44 provider_host_->active_version()->ScheduleUpdate(); | 44 provider_host_->active_version()->ScheduleUpdate(); |
| 45 else | 45 else |
| 46 provider_host_->active_version()->DeferScheduledUpdate(); | 46 provider_host_->active_version()->DeferScheduledUpdate(); |
| 47 } | 47 } |
| 48 |
| 49 if (is_main_resource_load_ && provider_host_) |
| 50 provider_host_->SetAllowAssociation(true); |
| 48 } | 51 } |
| 49 | 52 |
| 50 net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( | 53 net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( |
| 51 net::URLRequest* request, | 54 net::URLRequest* request, |
| 52 net::NetworkDelegate* network_delegate) { | 55 net::NetworkDelegate* network_delegate) { |
| 53 if (!context_ || !provider_host_) { | 56 if (!context_ || !provider_host_) { |
| 54 // We can't do anything other than to fall back to network. | 57 // We can't do anything other than to fall back to network. |
| 55 job_ = NULL; | 58 job_ = NULL; |
| 56 return NULL; | 59 return NULL; |
| 57 } | 60 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 DCHECK(context_); | 112 DCHECK(context_); |
| 110 TRACE_EVENT_ASYNC_BEGIN1( | 113 TRACE_EVENT_ASYNC_BEGIN1( |
| 111 "ServiceWorker", | 114 "ServiceWorker", |
| 112 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", | 115 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 113 job_.get(), | 116 job_.get(), |
| 114 "URL", url.spec()); | 117 "URL", url.spec()); |
| 115 // The corresponding provider_host may already have associated a registration | 118 // The corresponding provider_host may already have associated a registration |
| 116 // in redirect case, unassociate it now. | 119 // in redirect case, unassociate it now. |
| 117 provider_host_->DisassociateRegistration(); | 120 provider_host_->DisassociateRegistration(); |
| 118 | 121 |
| 122 // Also prevent a registrater job for establishing an association to a new |
| 123 // registration while we're finding an existing registration. |
| 124 provider_host_->SetAllowAssociation(false); |
| 125 |
| 119 GURL stripped_url = net::SimplifyUrlForRequest(url); | 126 GURL stripped_url = net::SimplifyUrlForRequest(url); |
| 120 provider_host_->SetDocumentUrl(stripped_url); | 127 provider_host_->SetDocumentUrl(stripped_url); |
| 121 context_->storage()->FindRegistrationForDocument( | 128 context_->storage()->FindRegistrationForDocument( |
| 122 stripped_url, | 129 stripped_url, |
| 123 base::Bind(&self::DidLookupRegistrationForMainResource, | 130 base::Bind(&self::DidLookupRegistrationForMainResource, |
| 124 weak_factory_.GetWeakPtr())); | 131 weak_factory_.GetWeakPtr())); |
| 125 } | 132 } |
| 126 | 133 |
| 127 void | 134 void |
| 128 ServiceWorkerControlleeRequestHandler::DidLookupRegistrationForMainResource( | 135 ServiceWorkerControlleeRequestHandler::DidLookupRegistrationForMainResource( |
| 129 ServiceWorkerStatusCode status, | 136 ServiceWorkerStatusCode status, |
| 130 const scoped_refptr<ServiceWorkerRegistration>& registration) { | 137 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| 131 DCHECK(job_.get()); | 138 DCHECK(job_.get()); |
| 139 provider_host_->SetAllowAssociation(true); |
| 132 if (status != SERVICE_WORKER_OK) { | 140 if (status != SERVICE_WORKER_OK) { |
| 133 job_->FallbackToNetwork(); | 141 job_->FallbackToNetwork(); |
| 134 TRACE_EVENT_ASYNC_END1( | 142 TRACE_EVENT_ASYNC_END1( |
| 135 "ServiceWorker", | 143 "ServiceWorker", |
| 136 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", | 144 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 137 job_.get(), | 145 job_.get(), |
| 138 "Status", status); | 146 "Status", status); |
| 139 return; | 147 return; |
| 140 } | 148 } |
| 141 DCHECK(registration.get()); | 149 DCHECK(registration.get()); |
| 142 | 150 |
| 143 ServiceWorkerMetrics::CountControlledPageLoad(); | 151 ServiceWorkerMetrics::CountControlledPageLoad(); |
| 144 | 152 |
| 145 // Initiate activation of a waiting version. | 153 // Initiate activation of a waiting version. |
| 146 // Usually a register job initiates activation but that | 154 // Usually a register job initiates activation but that |
| 147 // doesn't happen if the browser exits prior to activation | 155 // doesn't happen if the browser exits prior to activation |
| 148 // having occurred. This check handles that case. | 156 // having occurred. This check handles that case. |
| 149 if (registration->waiting_version()) | 157 if (registration->waiting_version()) |
| 150 registration->ActivateWaitingVersionWhenReady(); | 158 registration->ActivateWaitingVersionWhenReady(); |
| 151 | 159 |
| 152 scoped_refptr<ServiceWorkerVersion> active_version = | 160 scoped_refptr<ServiceWorkerVersion> active_version = |
| 153 registration->active_version(); | 161 registration->active_version(); |
| 154 | 162 |
| 155 // Wait until it's activated before firing fetch events. | 163 // Wait until it's activated before firing fetch events. |
| 156 if (active_version.get() && | 164 if (active_version.get() && |
| 157 active_version->status() == ServiceWorkerVersion::ACTIVATING) { | 165 active_version->status() == ServiceWorkerVersion::ACTIVATING) { |
| 166 provider_host_->SetAllowAssociation(false); |
| 158 registration->active_version()->RegisterStatusChangeCallback( | 167 registration->active_version()->RegisterStatusChangeCallback( |
| 159 base::Bind(&self::OnVersionStatusChanged, | 168 base::Bind(&self::OnVersionStatusChanged, |
| 160 weak_factory_.GetWeakPtr(), | 169 weak_factory_.GetWeakPtr(), |
| 161 registration, | 170 registration, |
| 162 active_version)); | 171 active_version)); |
| 163 TRACE_EVENT_ASYNC_END2( | 172 TRACE_EVENT_ASYNC_END2( |
| 164 "ServiceWorker", | 173 "ServiceWorker", |
| 165 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", | 174 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 166 job_.get(), | 175 job_.get(), |
| 167 "Status", status, | 176 "Status", status, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 189 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", | 198 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 190 job_.get(), | 199 job_.get(), |
| 191 "Status", status, | 200 "Status", status, |
| 192 "Info", | 201 "Info", |
| 193 "Forwarded to the ServiceWorker"); | 202 "Forwarded to the ServiceWorker"); |
| 194 } | 203 } |
| 195 | 204 |
| 196 void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( | 205 void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( |
| 197 ServiceWorkerRegistration* registration, | 206 ServiceWorkerRegistration* registration, |
| 198 ServiceWorkerVersion* version) { | 207 ServiceWorkerVersion* version) { |
| 208 provider_host_->SetAllowAssociation(true); |
| 199 if (version != registration->active_version() || | 209 if (version != registration->active_version() || |
| 200 version->status() != ServiceWorkerVersion::ACTIVATED) { | 210 version->status() != ServiceWorkerVersion::ACTIVATED) { |
| 201 job_->FallbackToNetwork(); | 211 job_->FallbackToNetwork(); |
| 202 return; | 212 return; |
| 203 } | 213 } |
| 204 | |
| 205 provider_host_->AssociateRegistration(registration); | 214 provider_host_->AssociateRegistration(registration); |
| 206 job_->ForwardToServiceWorker(); | 215 job_->ForwardToServiceWorker(); |
| 207 } | 216 } |
| 208 | 217 |
| 209 void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { | 218 void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { |
| 210 DCHECK(job_.get()); | 219 DCHECK(job_.get()); |
| 211 DCHECK(context_); | 220 DCHECK(context_); |
| 212 DCHECK(provider_host_->active_version()); | 221 DCHECK(provider_host_->active_version()); |
| 213 job_->ForwardToServiceWorker(); | 222 job_->ForwardToServiceWorker(); |
| 214 } | 223 } |
| 215 | 224 |
| 216 } // namespace content | 225 } // namespace content |
| OLD | NEW |