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 "content/browser/service_worker/service_worker_context_core.h" | 8 #include "content/browser/service_worker/service_worker_context_core.h" |
8 #include "content/browser/service_worker/service_worker_metrics.h" | 9 #include "content/browser/service_worker/service_worker_metrics.h" |
9 #include "content/browser/service_worker/service_worker_provider_host.h" | 10 #include "content/browser/service_worker/service_worker_provider_host.h" |
10 #include "content/browser/service_worker/service_worker_registration.h" | 11 #include "content/browser/service_worker/service_worker_registration.h" |
11 #include "content/browser/service_worker/service_worker_url_request_job.h" | 12 #include "content/browser/service_worker/service_worker_url_request_job.h" |
12 #include "content/browser/service_worker/service_worker_utils.h" | 13 #include "content/browser/service_worker/service_worker_utils.h" |
13 #include "content/common/resource_request_body.h" | 14 #include "content/common/resource_request_body.h" |
14 #include "content/common/service_worker/service_worker_types.h" | 15 #include "content/common/service_worker/service_worker_types.h" |
15 #include "net/base/load_flags.h" | 16 #include "net/base/load_flags.h" |
16 #include "net/base/net_util.h" | 17 #include "net/base/net_util.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 return; | 100 return; |
100 } | 101 } |
101 job_->GetExtraResponseInfo(was_fetched_via_service_worker, | 102 job_->GetExtraResponseInfo(was_fetched_via_service_worker, |
102 original_url_via_service_worker); | 103 original_url_via_service_worker); |
103 } | 104 } |
104 | 105 |
105 void ServiceWorkerControlleeRequestHandler::PrepareForMainResource( | 106 void ServiceWorkerControlleeRequestHandler::PrepareForMainResource( |
106 const GURL& url) { | 107 const GURL& url) { |
107 DCHECK(job_.get()); | 108 DCHECK(job_.get()); |
108 DCHECK(context_); | 109 DCHECK(context_); |
| 110 TRACE_EVENT_ASYNC_BEGIN1( |
| 111 "ServiceWorker", |
| 112 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 113 job_.get(), |
| 114 "URL", url.spec()); |
109 // The corresponding provider_host may already have associated a registration | 115 // The corresponding provider_host may already have associated a registration |
110 // in redirect case, unassociate it now. | 116 // in redirect case, unassociate it now. |
111 provider_host_->UnassociateRegistration(); | 117 provider_host_->UnassociateRegistration(); |
112 | 118 |
113 GURL stripped_url = net::SimplifyUrlForRequest(url); | 119 GURL stripped_url = net::SimplifyUrlForRequest(url); |
114 provider_host_->SetDocumentUrl(stripped_url); | 120 provider_host_->SetDocumentUrl(stripped_url); |
115 context_->storage()->FindRegistrationForDocument( | 121 context_->storage()->FindRegistrationForDocument( |
116 stripped_url, | 122 stripped_url, |
117 base::Bind(&self::DidLookupRegistrationForMainResource, | 123 base::Bind(&self::DidLookupRegistrationForMainResource, |
118 weak_factory_.GetWeakPtr())); | 124 weak_factory_.GetWeakPtr())); |
119 } | 125 } |
120 | 126 |
121 void | 127 void |
122 ServiceWorkerControlleeRequestHandler::DidLookupRegistrationForMainResource( | 128 ServiceWorkerControlleeRequestHandler::DidLookupRegistrationForMainResource( |
123 ServiceWorkerStatusCode status, | 129 ServiceWorkerStatusCode status, |
124 const scoped_refptr<ServiceWorkerRegistration>& registration) { | 130 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
125 DCHECK(job_.get()); | 131 DCHECK(job_.get()); |
126 if (status != SERVICE_WORKER_OK) { | 132 if (status != SERVICE_WORKER_OK) { |
127 job_->FallbackToNetwork(); | 133 job_->FallbackToNetwork(); |
| 134 TRACE_EVENT_ASYNC_END1( |
| 135 "ServiceWorker", |
| 136 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 137 job_.get(), |
| 138 "Status", status); |
128 return; | 139 return; |
129 } | 140 } |
130 DCHECK(registration.get()); | 141 DCHECK(registration.get()); |
131 | 142 |
132 ServiceWorkerMetrics::CountControlledPageLoad(); | 143 ServiceWorkerMetrics::CountControlledPageLoad(); |
133 | 144 |
134 // Initiate activation of a waiting version. | 145 // Initiate activation of a waiting version. |
135 // Usually a register job initiates activation but that | 146 // Usually a register job initiates activation but that |
136 // doesn't happen if the browser exits prior to activation | 147 // doesn't happen if the browser exits prior to activation |
137 // having occurred. This check handles that case. | 148 // having occurred. This check handles that case. |
138 if (registration->waiting_version()) | 149 if (registration->waiting_version()) |
139 registration->ActivateWaitingVersionWhenReady(); | 150 registration->ActivateWaitingVersionWhenReady(); |
140 | 151 |
141 scoped_refptr<ServiceWorkerVersion> active_version = | 152 scoped_refptr<ServiceWorkerVersion> active_version = |
142 registration->active_version(); | 153 registration->active_version(); |
143 | 154 |
144 // Wait until it's activated before firing fetch events. | 155 // Wait until it's activated before firing fetch events. |
145 if (active_version.get() && | 156 if (active_version.get() && |
146 active_version->status() == ServiceWorkerVersion::ACTIVATING) { | 157 active_version->status() == ServiceWorkerVersion::ACTIVATING) { |
147 registration->active_version()->RegisterStatusChangeCallback( | 158 registration->active_version()->RegisterStatusChangeCallback( |
148 base::Bind(&self::OnVersionStatusChanged, | 159 base::Bind(&self::OnVersionStatusChanged, |
149 weak_factory_.GetWeakPtr(), | 160 weak_factory_.GetWeakPtr(), |
150 registration, | 161 registration, |
151 active_version)); | 162 active_version)); |
| 163 TRACE_EVENT_ASYNC_END2( |
| 164 "ServiceWorker", |
| 165 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 166 job_.get(), |
| 167 "Status", status, |
| 168 "Info", "Wait until finished SW activation"); |
152 return; | 169 return; |
153 } | 170 } |
154 | 171 |
155 if (!active_version.get() || | 172 if (!active_version.get() || |
156 active_version->status() != ServiceWorkerVersion::ACTIVATED) { | 173 active_version->status() != ServiceWorkerVersion::ACTIVATED) { |
157 job_->FallbackToNetwork(); | 174 job_->FallbackToNetwork(); |
| 175 TRACE_EVENT_ASYNC_END2( |
| 176 "ServiceWorker", |
| 177 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 178 job_.get(), |
| 179 "Status", status, |
| 180 "Info", |
| 181 "ServiceWorkerVersion is not available, so falling back to network"); |
158 return; | 182 return; |
159 } | 183 } |
160 | 184 |
161 provider_host_->AssociateRegistration(registration.get()); | 185 provider_host_->AssociateRegistration(registration.get()); |
162 job_->ForwardToServiceWorker(); | 186 job_->ForwardToServiceWorker(); |
| 187 TRACE_EVENT_ASYNC_END2( |
| 188 "ServiceWorker", |
| 189 "ServiceWorkerControlleeRequestHandler::PrepareForMainResource", |
| 190 job_.get(), |
| 191 "Status", status, |
| 192 "Info", |
| 193 "Forwarded to the ServiceWorker"); |
163 } | 194 } |
164 | 195 |
165 void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( | 196 void ServiceWorkerControlleeRequestHandler::OnVersionStatusChanged( |
166 ServiceWorkerRegistration* registration, | 197 ServiceWorkerRegistration* registration, |
167 ServiceWorkerVersion* version) { | 198 ServiceWorkerVersion* version) { |
168 if (version != registration->active_version() || | 199 if (version != registration->active_version() || |
169 version->status() != ServiceWorkerVersion::ACTIVATED) { | 200 version->status() != ServiceWorkerVersion::ACTIVATED) { |
170 job_->FallbackToNetwork(); | 201 job_->FallbackToNetwork(); |
171 return; | 202 return; |
172 } | 203 } |
173 | 204 |
174 provider_host_->AssociateRegistration(registration); | 205 provider_host_->AssociateRegistration(registration); |
175 job_->ForwardToServiceWorker(); | 206 job_->ForwardToServiceWorker(); |
176 } | 207 } |
177 | 208 |
178 void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { | 209 void ServiceWorkerControlleeRequestHandler::PrepareForSubResource() { |
179 DCHECK(job_.get()); | 210 DCHECK(job_.get()); |
180 DCHECK(context_); | 211 DCHECK(context_); |
181 DCHECK(provider_host_->active_version()); | 212 DCHECK(provider_host_->active_version()); |
182 job_->ForwardToServiceWorker(); | 213 job_->ForwardToServiceWorker(); |
183 } | 214 } |
184 | 215 |
185 } // namespace content | 216 } // namespace content |
OLD | NEW |