| 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_fetch_dispatcher.h" | 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 | 64 |
| 65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( | 65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( |
| 66 ServiceWorkerFetchType type) { | 66 ServiceWorkerFetchType type) { |
| 67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) | 67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) |
| 68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; | 68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; |
| 69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; | 69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; |
| 70 } | 70 } |
| 71 | 71 |
| 72 } // namespace | 72 } // namespace |
| 73 | 73 |
| 74 // Helper to receive the fetch event response even if |
| 75 // ServiceWorkerFetchDispatcher has been destroyed. |
| 76 class ServiceWorkerFetchDispatcher::ResponseCallback { |
| 77 public: |
| 78 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, |
| 79 ServiceWorkerVersion* version) |
| 80 : fetch_dispatcher_(fetch_dispatcher), version_(version) {} |
| 81 |
| 82 void Run(int request_id, |
| 83 ServiceWorkerFetchEventResult fetch_result, |
| 84 const ServiceWorkerResponse& response) { |
| 85 const bool handled = |
| 86 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); |
| 87 if (!version_->FinishRequest(request_id, handled)) |
| 88 NOTREACHED() << "Should only receive one reply per event"; |
| 89 |
| 90 // |fetch_dispatcher| is null if the URLRequest was killed. |
| 91 if (fetch_dispatcher_) |
| 92 fetch_dispatcher_->DidFinish(request_id, fetch_result, response); |
| 93 } |
| 94 |
| 95 private: |
| 96 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; |
| 97 // Owns |this|. |
| 98 ServiceWorkerVersion* version_; |
| 99 |
| 100 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); |
| 101 }; |
| 102 |
| 74 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( | 103 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( |
| 75 std::unique_ptr<ServiceWorkerFetchRequest> request, | 104 std::unique_ptr<ServiceWorkerFetchRequest> request, |
| 76 ServiceWorkerVersion* version, | 105 ServiceWorkerVersion* version, |
| 77 ResourceType resource_type, | 106 ResourceType resource_type, |
| 78 const net::BoundNetLog& net_log, | 107 const net::BoundNetLog& net_log, |
| 79 const base::Closure& prepare_callback, | 108 const base::Closure& prepare_callback, |
| 80 const FetchCallback& fetch_callback) | 109 const FetchCallback& fetch_callback) |
| 81 : version_(version), | 110 : version_(version), |
| 82 net_log_(net_log), | 111 net_log_(net_log), |
| 83 prepare_callback_(prepare_callback), | 112 prepare_callback_(prepare_callback), |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 | 190 |
| 162 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); | 191 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); |
| 163 int response_id = version_->StartRequest( | 192 int response_id = version_->StartRequest( |
| 164 GetEventType(), | 193 GetEventType(), |
| 165 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, | 194 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, |
| 166 weak_factory_.GetWeakPtr())); | 195 weak_factory_.GetWeakPtr())); |
| 167 int event_finish_id = version_->StartRequest( | 196 int event_finish_id = version_->StartRequest( |
| 168 FetchTypeToWaitUntilEventType(request_->fetch_type), | 197 FetchTypeToWaitUntilEventType(request_->fetch_type), |
| 169 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 198 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 170 | 199 |
| 200 ResponseCallback* response_callback = |
| 201 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); |
| 171 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( | 202 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( |
| 172 response_id, base::Bind(&ServiceWorkerFetchDispatcher::DidFinish, | 203 response_id, |
| 173 weak_factory_.GetWeakPtr())); | 204 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, |
| 205 base::Owned(response_callback))); |
| 174 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( | 206 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( |
| 175 event_finish_id); | 207 event_finish_id); |
| 176 version_->DispatchEvent({response_id, event_finish_id}, | 208 version_->DispatchEvent({response_id, event_finish_id}, |
| 177 ServiceWorkerMsg_FetchEvent( | 209 ServiceWorkerMsg_FetchEvent( |
| 178 response_id, event_finish_id, *request_.get())); | 210 response_id, event_finish_id, *request_.get())); |
| 179 } | 211 } |
| 180 | 212 |
| 181 void ServiceWorkerFetchDispatcher::DidFailToDispatch( | 213 void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
| 182 ServiceWorkerStatusCode status) { | 214 ServiceWorkerStatusCode status) { |
| 183 EndNetLogEventWithServiceWorkerStatus( | 215 EndNetLogEventWithServiceWorkerStatus( |
| 184 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); | 216 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); |
| 185 DidFail(status); | 217 DidFail(status); |
| 186 } | 218 } |
| 187 | 219 |
| 188 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { | 220 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { |
| 189 DCHECK_NE(SERVICE_WORKER_OK, status); | 221 DCHECK_NE(SERVICE_WORKER_OK, status); |
| 190 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 222 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 191 ServiceWorkerResponse()); | 223 ServiceWorkerResponse()); |
| 192 } | 224 } |
| 193 | 225 |
| 194 void ServiceWorkerFetchDispatcher::DidFinish( | 226 void ServiceWorkerFetchDispatcher::DidFinish( |
| 195 int request_id, | 227 int request_id, |
| 196 ServiceWorkerFetchEventResult fetch_result, | 228 ServiceWorkerFetchEventResult fetch_result, |
| 197 const ServiceWorkerResponse& response) { | 229 const ServiceWorkerResponse& response) { |
| 198 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); | 230 net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); |
| 199 | |
| 200 const bool handled = | |
| 201 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); | |
| 202 if (!version_->FinishRequest(request_id, handled)) | |
| 203 NOTREACHED() << "Should only receive one reply per event"; | |
| 204 | |
| 205 Complete(SERVICE_WORKER_OK, fetch_result, response); | 231 Complete(SERVICE_WORKER_OK, fetch_result, response); |
| 206 } | 232 } |
| 207 | 233 |
| 208 void ServiceWorkerFetchDispatcher::Complete( | 234 void ServiceWorkerFetchDispatcher::Complete( |
| 209 ServiceWorkerStatusCode status, | 235 ServiceWorkerStatusCode status, |
| 210 ServiceWorkerFetchEventResult fetch_result, | 236 ServiceWorkerFetchEventResult fetch_result, |
| 211 const ServiceWorkerResponse& response) { | 237 const ServiceWorkerResponse& response) { |
| 212 DCHECK(!fetch_callback_.is_null()); | 238 DCHECK(!fetch_callback_.is_null()); |
| 213 | 239 |
| 214 did_complete_ = true; | 240 did_complete_ = true; |
| 215 net_log_.EndEvent( | 241 net_log_.EndEvent( |
| 216 net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, | 242 net::NetLog::TYPE_SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| 217 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); | 243 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); |
| 218 | 244 |
| 219 FetchCallback fetch_callback = fetch_callback_; | 245 FetchCallback fetch_callback = fetch_callback_; |
| 220 scoped_refptr<ServiceWorkerVersion> version = version_; | 246 scoped_refptr<ServiceWorkerVersion> version = version_; |
| 221 fetch_callback.Run(status, fetch_result, response, version); | 247 fetch_callback.Run(status, fetch_result, response, version); |
| 222 } | 248 } |
| 223 | 249 |
| 224 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() | 250 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |
| 225 const { | 251 const { |
| 226 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) | 252 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) |
| 227 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; | 253 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; |
| 228 return ResourceTypeToEventType(resource_type_); | 254 return ResourceTypeToEventType(resource_type_); |
| 229 } | 255 } |
| 230 | 256 |
| 231 } // namespace content | 257 } // namespace content |
| OLD | NEW |