| 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 base::Bind(&NetLogServiceWorkerStatusCallback, status)); | 62 base::Bind(&NetLogServiceWorkerStatusCallback, status)); |
| 63 } | 63 } |
| 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 template<typename T, typename U> |
| 73 T MojoType(const U& type) { |
| 74 return static_cast<T>(type); |
| 75 } |
| 76 |
| 77 #define CastAndCopyToMojo(from, to) do { \ |
| 78 from = MojoType<decltype(from)>(to); \ |
| 79 } while(false) |
| 80 |
| 81 blink::mojom::ServiceWorkerFetchRequestPtr CreateMojoType( |
| 82 const content::ServiceWorkerFetchRequest* request) { |
| 83 auto mojo_request = blink::mojom::ServiceWorkerFetchRequest::New(); |
| 84 CastAndCopyToMojo(mojo_request->mode, request->mode); |
| 85 mojo_request->is_main_resource_load = request->is_main_resource_load; |
| 86 CastAndCopyToMojo(mojo_request->request_context_type, |
| 87 request->request_context_type); |
| 88 CastAndCopyToMojo(mojo_request->frame_type, request->frame_type); |
| 89 mojo_request->url = request->url; |
| 90 mojo_request->method = request->method; |
| 91 // mojo_request->headers = request->headers; |
| 92 mojo_request->blob_uuid = request->blob_uuid; |
| 93 // mojo_request->referrer = request->referrer; |
| 94 CastAndCopyToMojo(mojo_request->credentials_mode, request->credentials_mode); |
| 95 CastAndCopyToMojo(mojo_request->redirect_mode, request->redirect_mode); |
| 96 mojo_request->client_id = request->client_id; |
| 97 mojo_request->is_reload = request->is_reload; |
| 98 CastAndCopyToMojo(mojo_request->fetch_type, request->fetch_type); |
| 99 return mojo_request; |
| 100 } |
| 101 |
| 72 } // namespace | 102 } // namespace |
| 73 | 103 |
| 74 // Helper to receive the fetch event response even if | 104 // Helper to receive the fetch event response even if |
| 75 // ServiceWorkerFetchDispatcher has been destroyed. | 105 // ServiceWorkerFetchDispatcher has been destroyed. |
| 76 class ServiceWorkerFetchDispatcher::ResponseCallback { | 106 class ServiceWorkerFetchDispatcher::ResponseCallback { |
| 77 public: | 107 public: |
| 78 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, | 108 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, |
| 79 ServiceWorkerVersion* version) | 109 ServiceWorkerVersion* version) |
| 80 : fetch_dispatcher_(fetch_dispatcher), version_(version) {} | 110 : fetch_dispatcher_(fetch_dispatcher), version_(version) {} |
| 81 | 111 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 93 } | 123 } |
| 94 | 124 |
| 95 private: | 125 private: |
| 96 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; | 126 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; |
| 97 // Owns |this|. | 127 // Owns |this|. |
| 98 ServiceWorkerVersion* version_; | 128 ServiceWorkerVersion* version_; |
| 99 | 129 |
| 100 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); | 130 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); |
| 101 }; | 131 }; |
| 102 | 132 |
| 133 class ServiceWorkerFetchDispatcher::ResponseMojoCallback { |
| 134 public: |
| 135 ResponseMojoCallback( |
| 136 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, |
| 137 ServiceWorkerVersion* version) |
| 138 : fetch_dispatcher_(fetch_dispatcher), version_(version) { |
| 139 } |
| 140 |
| 141 void Run(int request_id, bool handled, blink::mojom::ServiceWorkerResponsePtr
response) { |
| 142 LOG(ERROR) << "ServiceWorkerFetchDispatcher::ResponseMojoCallback"; |
| 143 LOG(ERROR) << "(handled: " << (handled ? "true": "false") << ")"; |
| 144 ServiceWorkerResponse result; |
| 145 if (response) { |
| 146 LOG(ERROR) << " url: " << response->url; |
| 147 LOG(ERROR) << " status_code: " << response->status_code; |
| 148 LOG(ERROR) << " status_text: " << response->status_text; |
| 149 LOG(ERROR) << " blob_uuid: " << response->blob_uuid; |
| 150 LOG(ERROR) << " blob_size: " << response->blob_size; |
| 151 LOG(ERROR) << " stream_url: " << response->stream_url; |
| 152 result.url = GURL(std::string(response->url)); |
| 153 result.status_code = response->status_code; |
| 154 result.status_text = response->status_text; |
| 155 result.blob_uuid = response->blob_uuid; |
| 156 result.blob_size = response->blob_size; |
| 157 result.stream_url = GURL(std::string(response->stream_url)); |
| 158 } |
| 159 if (!version_->FinishRequest(request_id, handled)) |
| 160 NOTREACHED() << "Should only receive one reply per event"; |
| 161 LOG(ERROR) << "Complete"; |
| 162 // |fetch_dispatcher| is null if the URLRequest was killed. |
| 163 if (fetch_dispatcher_) |
| 164 fetch_dispatcher_->Complete( |
| 165 SERVICE_WORKER_OK, |
| 166 handled ? SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE |
| 167 : SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 168 result); |
| 169 } |
| 170 private: |
| 171 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; |
| 172 ServiceWorkerVersion* version_; |
| 173 }; |
| 174 |
| 103 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( | 175 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( |
| 104 std::unique_ptr<ServiceWorkerFetchRequest> request, | 176 std::unique_ptr<ServiceWorkerFetchRequest> request, |
| 105 ServiceWorkerVersion* version, | 177 ServiceWorkerVersion* version, |
| 106 ResourceType resource_type, | 178 ResourceType resource_type, |
| 107 const net::BoundNetLog& net_log, | 179 const net::BoundNetLog& net_log, |
| 108 const base::Closure& prepare_callback, | 180 const base::Closure& prepare_callback, |
| 109 const FetchCallback& fetch_callback) | 181 const FetchCallback& fetch_callback) |
| 110 : version_(version), | 182 : version_(version), |
| 111 net_log_(net_log), | 183 net_log_(net_log), |
| 112 prepare_callback_(prepare_callback), | 184 prepare_callback_(prepare_callback), |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 | 254 |
| 183 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { | 255 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
| 184 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) | 256 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) |
| 185 << "Worker stopped too soon after it was started."; | 257 << "Worker stopped too soon after it was started."; |
| 186 | 258 |
| 187 DCHECK(!prepare_callback_.is_null()); | 259 DCHECK(!prepare_callback_.is_null()); |
| 188 base::Closure prepare_callback = prepare_callback_; | 260 base::Closure prepare_callback = prepare_callback_; |
| 189 prepare_callback.Run(); | 261 prepare_callback.Run(); |
| 190 | 262 |
| 191 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); | 263 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); |
| 264 |
| 265 |
| 192 int response_id = version_->StartRequest( | 266 int response_id = version_->StartRequest( |
| 193 GetEventType(), | 267 GetEventType(), |
| 194 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, | 268 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, |
| 195 weak_factory_.GetWeakPtr())); | 269 weak_factory_.GetWeakPtr())); |
| 196 int event_finish_id = version_->StartRequest( | 270 int event_finish_id = version_->StartRequest( |
| 197 FetchTypeToWaitUntilEventType(request_->fetch_type), | 271 FetchTypeToWaitUntilEventType(request_->fetch_type), |
| 198 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 272 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 199 | 273 |
| 274 // Try mojo |
| 275 base::WeakPtr<blink::mojom::ServiceWorkerGlobalScopeClient> client = |
| 276 version_->GetMojoServiceForRequest< |
| 277 blink::mojom::ServiceWorkerGlobalScopeClient>(response_id); |
| 278 if (client) { |
| 279 LOG(ERROR) << "Mojo fetchevent!"; |
| 280 ResponseMojoCallback* mojo_callback = |
| 281 new ResponseMojoCallback(weak_factory_.GetWeakPtr(), version_.get()); |
| 282 client->DispatchFetchEvent(response_id, event_finish_id, |
| 283 CreateMojoType(request_.get()), |
| 284 base::Bind(&ResponseMojoCallback::Run, |
| 285 base::Owned(mojo_callback), |
| 286 response_id)); |
| 287 return; |
| 288 } |
| 289 |
| 200 ResponseCallback* response_callback = | 290 ResponseCallback* response_callback = |
| 201 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); | 291 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); |
| 202 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( | 292 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( |
| 203 response_id, | 293 response_id, |
| 204 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, | 294 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, |
| 205 base::Owned(response_callback))); | 295 base::Owned(response_callback))); |
| 206 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( | 296 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( |
| 207 event_finish_id); | 297 event_finish_id); |
| 208 version_->DispatchEvent({response_id, event_finish_id}, | 298 version_->DispatchEvent({response_id, event_finish_id}, |
| 209 ServiceWorkerMsg_FetchEvent( | 299 ServiceWorkerMsg_FetchEvent( |
| 210 response_id, event_finish_id, *request_.get())); | 300 response_id, event_finish_id, *request_.get())); |
| 301 |
| 211 } | 302 } |
| 212 | 303 |
| 213 void ServiceWorkerFetchDispatcher::DidFailToDispatch( | 304 void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
| 214 ServiceWorkerStatusCode status) { | 305 ServiceWorkerStatusCode status) { |
| 215 EndNetLogEventWithServiceWorkerStatus( | 306 EndNetLogEventWithServiceWorkerStatus( |
| 216 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); | 307 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); |
| 217 DidFail(status); | 308 DidFail(status); |
| 218 } | 309 } |
| 219 | 310 |
| 220 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { | 311 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 248 } | 339 } |
| 249 | 340 |
| 250 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() | 341 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |
| 251 const { | 342 const { |
| 252 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) | 343 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) |
| 253 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; | 344 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; |
| 254 return ResourceTypeToEventType(resource_type_); | 345 return ResourceTypeToEventType(resource_type_); |
| 255 } | 346 } |
| 256 | 347 |
| 257 } // namespace content | 348 } // namespace content |
| OLD | NEW |