OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/renderer/service_worker/service_worker_context_client.h" | 5 #include "content/renderer/service_worker/service_worker_context_client.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "base/threading/thread_checker.h" | 14 #include "base/threading/thread_checker.h" |
15 #include "base/threading/thread_local.h" | 15 #include "base/threading/thread_local.h" |
16 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
18 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
| 19 #include "content/child/background_sync/background_sync_type_converters.h" |
19 #include "content/child/notifications/notification_data_conversions.h" | 20 #include "content/child/notifications/notification_data_conversions.h" |
20 #include "content/child/request_extra_data.h" | 21 #include "content/child/request_extra_data.h" |
21 #include "content/child/service_worker/service_worker_dispatcher.h" | 22 #include "content/child/service_worker/service_worker_dispatcher.h" |
22 #include "content/child/service_worker/service_worker_handle_reference.h" | 23 #include "content/child/service_worker/service_worker_handle_reference.h" |
23 #include "content/child/service_worker/service_worker_network_provider.h" | 24 #include "content/child/service_worker/service_worker_network_provider.h" |
24 #include "content/child/service_worker/service_worker_provider_context.h" | 25 #include "content/child/service_worker/service_worker_provider_context.h" |
25 #include "content/child/service_worker/service_worker_registration_handle_refere
nce.h" | 26 #include "content/child/service_worker/service_worker_registration_handle_refere
nce.h" |
26 #include "content/child/service_worker/web_service_worker_impl.h" | 27 #include "content/child/service_worker/web_service_worker_impl.h" |
27 #include "content/child/service_worker/web_service_worker_provider_impl.h" | 28 #include "content/child/service_worker/web_service_worker_provider_impl.h" |
28 #include "content/child/service_worker/web_service_worker_registration_impl.h" | 29 #include "content/child/service_worker/web_service_worker_registration_impl.h" |
29 #include "content/child/thread_safe_sender.h" | 30 #include "content/child/thread_safe_sender.h" |
30 #include "content/child/web_data_consumer_handle_impl.h" | 31 #include "content/child/web_data_consumer_handle_impl.h" |
31 #include "content/child/webmessageportchannel_impl.h" | 32 #include "content/child/webmessageportchannel_impl.h" |
32 #include "content/common/devtools_messages.h" | 33 #include "content/common/devtools_messages.h" |
33 #include "content/common/message_port_messages.h" | 34 #include "content/common/message_port_messages.h" |
34 #include "content/common/service_worker/embedded_worker_messages.h" | 35 #include "content/common/service_worker/embedded_worker_messages.h" |
35 #include "content/common/service_worker/fetch_event_dispatcher.mojom.h" | 36 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h" |
36 #include "content/common/service_worker/service_worker_messages.h" | 37 #include "content/common/service_worker/service_worker_messages.h" |
37 #include "content/common/service_worker/service_worker_status_code.h" | 38 #include "content/common/service_worker/service_worker_status_code.h" |
38 #include "content/common/service_worker/service_worker_utils.h" | 39 #include "content/common/service_worker/service_worker_utils.h" |
39 #include "content/public/common/push_event_payload.h" | 40 #include "content/public/common/push_event_payload.h" |
40 #include "content/public/common/referrer.h" | 41 #include "content/public/common/referrer.h" |
41 #include "content/public/renderer/content_renderer_client.h" | 42 #include "content/public/renderer/content_renderer_client.h" |
42 #include "content/public/renderer/document_state.h" | 43 #include "content/public/renderer/document_state.h" |
43 #include "content/renderer/background_sync/background_sync_client_impl.h" | |
44 #include "content/renderer/devtools/devtools_agent.h" | 44 #include "content/renderer/devtools/devtools_agent.h" |
45 #include "content/renderer/render_thread_impl.h" | 45 #include "content/renderer/render_thread_impl.h" |
46 #include "content/renderer/service_worker/embedded_worker_dispatcher.h" | 46 #include "content/renderer/service_worker/embedded_worker_dispatcher.h" |
47 #include "content/renderer/service_worker/embedded_worker_instance_client_impl.h
" | 47 #include "content/renderer/service_worker/embedded_worker_instance_client_impl.h
" |
48 #include "content/renderer/service_worker/service_worker_type_util.h" | 48 #include "content/renderer/service_worker/service_worker_type_util.h" |
49 #include "ipc/ipc_message.h" | 49 #include "ipc/ipc_message.h" |
50 #include "ipc/ipc_message_macros.h" | 50 #include "ipc/ipc_message_macros.h" |
51 #include "mojo/public/cpp/bindings/interface_request.h" | |
52 #include "mojo/public/cpp/bindings/strong_binding.h" | |
53 #include "services/service_manager/public/cpp/interface_provider.h" | |
54 #include "services/service_manager/public/cpp/interface_registry.h" | |
55 #include "third_party/WebKit/public/platform/URLConversion.h" | 51 #include "third_party/WebKit/public/platform/URLConversion.h" |
56 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h" | 52 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h" |
57 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" | 53 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" |
58 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 54 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
59 #include "third_party/WebKit/public/platform/WebString.h" | 55 #include "third_party/WebKit/public/platform/WebString.h" |
60 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificati
onData.h" | 56 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificati
onData.h" |
61 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerClientQueryOptions.h" | 57 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerClientQueryOptions.h" |
62 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerError.h" | 58 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerError.h" |
63 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerRequest.h" | 59 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerRequest.h" |
64 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerResponse.h" | 60 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor
kerResponse.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 // worker thread. | 171 // worker thread. |
176 struct ServiceWorkerContextClient::WorkerContextData { | 172 struct ServiceWorkerContextClient::WorkerContextData { |
177 using ClientsCallbacksMap = | 173 using ClientsCallbacksMap = |
178 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; | 174 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; |
179 using ClaimClientsCallbacksMap = | 175 using ClaimClientsCallbacksMap = |
180 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; | 176 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; |
181 using ClientCallbacksMap = | 177 using ClientCallbacksMap = |
182 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; | 178 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; |
183 using SkipWaitingCallbacksMap = | 179 using SkipWaitingCallbacksMap = |
184 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; | 180 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; |
185 using SyncEventCallbacksMap = | 181 using SyncEventCallbacksMap = IDMap<const SyncCallback, IDMapOwnPointer>; |
186 IDMap<const base::Callback<void(blink::mojom::ServiceWorkerEventStatus, | 182 using FetchEventCallbacksMap = IDMap<const FetchCallback, IDMapOwnPointer>; |
187 base::Time /* dispatch_event_time */)>, | |
188 IDMapOwnPointer>; | |
189 using FetchEventCallbacksMap = | |
190 IDMap<const base::Callback<void(ServiceWorkerStatusCode, | |
191 base::Time /* dispatch_event_time */)>, | |
192 IDMapOwnPointer>; | |
193 using NavigationPreloadRequestsMap = | 183 using NavigationPreloadRequestsMap = |
194 IDMap<ServiceWorkerContextClient::NavigationPreloadRequest, | 184 IDMap<ServiceWorkerContextClient::NavigationPreloadRequest, |
195 IDMapOwnPointer>; | 185 IDMapOwnPointer>; |
196 | 186 |
197 explicit WorkerContextData(ServiceWorkerContextClient* owner) | 187 explicit WorkerContextData(ServiceWorkerContextClient* owner) |
198 : interface_registry(std::string()), | 188 : event_dispatcher_binding(owner), |
199 weak_factory(owner), | 189 weak_factory(owner), |
200 proxy_weak_factory(owner->proxy_) {} | 190 proxy_weak_factory(owner->proxy_) {} |
201 | 191 |
202 ~WorkerContextData() { | 192 ~WorkerContextData() { |
203 DCHECK(thread_checker.CalledOnValidThread()); | 193 DCHECK(thread_checker.CalledOnValidThread()); |
204 } | 194 } |
205 | 195 |
| 196 mojo::Binding<mojom::ServiceWorkerEventDispatcher> event_dispatcher_binding; |
| 197 |
206 // Pending callbacks for GetClientDocuments(). | 198 // Pending callbacks for GetClientDocuments(). |
207 ClientsCallbacksMap clients_callbacks; | 199 ClientsCallbacksMap clients_callbacks; |
208 | 200 |
209 // Pending callbacks for OpenWindow() and FocusClient(). | 201 // Pending callbacks for OpenWindow() and FocusClient(). |
210 ClientCallbacksMap client_callbacks; | 202 ClientCallbacksMap client_callbacks; |
211 | 203 |
212 // Pending callbacks for SkipWaiting(). | 204 // Pending callbacks for SkipWaiting(). |
213 SkipWaitingCallbacksMap skip_waiting_callbacks; | 205 SkipWaitingCallbacksMap skip_waiting_callbacks; |
214 | 206 |
215 // Pending callbacks for ClaimClients(). | 207 // Pending callbacks for ClaimClients(). |
216 ClaimClientsCallbacksMap claim_clients_callbacks; | 208 ClaimClientsCallbacksMap claim_clients_callbacks; |
217 | 209 |
218 // Pending callbacks for Background Sync Events. | 210 // Pending callbacks for Background Sync Events. |
219 SyncEventCallbacksMap sync_event_callbacks; | 211 SyncEventCallbacksMap sync_event_callbacks; |
220 | 212 |
221 // Pending callbacks for Fetch Events. | 213 // Pending callbacks for Fetch Events. |
222 FetchEventCallbacksMap fetch_event_callbacks; | 214 FetchEventCallbacksMap fetch_event_callbacks; |
223 | 215 |
224 // Pending navigation preload requests. | 216 // Pending navigation preload requests. |
225 NavigationPreloadRequestsMap preload_requests; | 217 NavigationPreloadRequestsMap preload_requests; |
226 | 218 |
227 service_manager::InterfaceRegistry interface_registry; | |
228 // This is not used when mojo for the service workers is enabled. At that | |
229 // time, remote interfaces are stored in EmbeddedWorkerInstanceClientImpl. | |
230 service_manager::InterfaceProvider remote_interfaces; | |
231 | |
232 base::ThreadChecker thread_checker; | 219 base::ThreadChecker thread_checker; |
233 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; | 220 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; |
234 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; | 221 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; |
235 }; | 222 }; |
236 | 223 |
237 class ServiceWorkerContextClient::NavigationPreloadRequest final | 224 class ServiceWorkerContextClient::NavigationPreloadRequest final |
238 : public mojom::URLLoaderClient { | 225 : public mojom::URLLoaderClient { |
239 public: | 226 public: |
240 NavigationPreloadRequest(int fetch_event_id, | 227 NavigationPreloadRequest(int fetch_event_id, |
241 const GURL& url, | 228 const GURL& url, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 const int fetch_event_id_; | 329 const int fetch_event_id_; |
343 const GURL url_; | 330 const GURL url_; |
344 mojom::URLLoaderPtr url_loader_; | 331 mojom::URLLoaderPtr url_loader_; |
345 mojo::Binding<mojom::URLLoaderClient> binding_; | 332 mojo::Binding<mojom::URLLoaderClient> binding_; |
346 | 333 |
347 std::unique_ptr<blink::WebServiceWorkerResponse> response_; | 334 std::unique_ptr<blink::WebServiceWorkerResponse> response_; |
348 mojo::ScopedDataPipeConsumerHandle body_; | 335 mojo::ScopedDataPipeConsumerHandle body_; |
349 bool result_reported_ = false; | 336 bool result_reported_ = false; |
350 }; | 337 }; |
351 | 338 |
352 class ServiceWorkerContextClient::FetchEventDispatcherImpl | |
353 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { | |
354 public: | |
355 static void Create(mojom::FetchEventDispatcherRequest request) { | |
356 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), | |
357 std::move(request)); | |
358 } | |
359 | |
360 FetchEventDispatcherImpl() {} | |
361 | |
362 ~FetchEventDispatcherImpl() override {} | |
363 | |
364 void DispatchFetchEvent(int fetch_event_id, | |
365 const ServiceWorkerFetchRequest& request, | |
366 mojom::FetchEventPreloadHandlePtr preload_handle, | |
367 const DispatchFetchEventCallback& callback) override { | |
368 ServiceWorkerContextClient* client = | |
369 ServiceWorkerContextClient::ThreadSpecificInstance(); | |
370 if (!client) { | |
371 callback.Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); | |
372 return; | |
373 } | |
374 client->DispatchFetchEvent( | |
375 fetch_event_id, request, | |
376 preload_handle | |
377 ? base::MakeUnique<NavigationPreloadRequest>( | |
378 fetch_event_id, request.url, std::move(preload_handle)) | |
379 : nullptr, | |
380 callback); | |
381 } | |
382 | |
383 private: | |
384 DISALLOW_COPY_AND_ASSIGN(FetchEventDispatcherImpl); | |
385 }; | |
386 | |
387 ServiceWorkerContextClient* | 339 ServiceWorkerContextClient* |
388 ServiceWorkerContextClient::ThreadSpecificInstance() { | 340 ServiceWorkerContextClient::ThreadSpecificInstance() { |
389 return g_worker_client_tls.Pointer()->Get(); | 341 return g_worker_client_tls.Pointer()->Get(); |
390 } | 342 } |
391 | 343 |
392 ServiceWorkerContextClient::ServiceWorkerContextClient( | 344 ServiceWorkerContextClient::ServiceWorkerContextClient( |
393 int embedded_worker_id, | 345 int embedded_worker_id, |
394 int64_t service_worker_version_id, | 346 int64_t service_worker_version_id, |
395 const GURL& service_worker_scope, | 347 const GURL& service_worker_scope, |
396 const GURL& script_url, | 348 const GURL& script_url, |
397 int worker_devtools_agent_route_id, | 349 int worker_devtools_agent_route_id, |
| 350 mojom::ServiceWorkerEventDispatcherRequest dispatcher_request, |
398 std::unique_ptr<EmbeddedWorkerInstanceClientImpl> embedded_worker_client) | 351 std::unique_ptr<EmbeddedWorkerInstanceClientImpl> embedded_worker_client) |
399 : embedded_worker_id_(embedded_worker_id), | 352 : embedded_worker_id_(embedded_worker_id), |
400 service_worker_version_id_(service_worker_version_id), | 353 service_worker_version_id_(service_worker_version_id), |
401 service_worker_scope_(service_worker_scope), | 354 service_worker_scope_(service_worker_scope), |
402 script_url_(script_url), | 355 script_url_(script_url), |
403 worker_devtools_agent_route_id_(worker_devtools_agent_route_id), | 356 worker_devtools_agent_route_id_(worker_devtools_agent_route_id), |
404 sender_(ChildThreadImpl::current()->thread_safe_sender()), | 357 sender_(ChildThreadImpl::current()->thread_safe_sender()), |
405 main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 358 main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
406 proxy_(nullptr), | 359 proxy_(nullptr), |
| 360 pending_dispatcher_request_(std::move(dispatcher_request)), |
407 embedded_worker_client_(std::move(embedded_worker_client)) { | 361 embedded_worker_client_(std::move(embedded_worker_client)) { |
408 TRACE_EVENT_ASYNC_BEGIN0("ServiceWorker", | 362 TRACE_EVENT_ASYNC_BEGIN0("ServiceWorker", |
409 "ServiceWorkerContextClient::StartingWorkerContext", | 363 "ServiceWorkerContextClient::StartingWorkerContext", |
410 this); | 364 this); |
411 TRACE_EVENT_ASYNC_STEP_INTO0( | 365 TRACE_EVENT_ASYNC_STEP_INTO0( |
412 "ServiceWorker", | 366 "ServiceWorker", |
413 "ServiceWorkerContextClient::StartingWorkerContext", | 367 "ServiceWorkerContextClient::StartingWorkerContext", |
414 this, | 368 this, |
415 "PrepareWorker"); | 369 "PrepareWorker"); |
416 } | 370 } |
417 | 371 |
| 372 ServiceWorkerContextClient::ServiceWorkerContextClient( |
| 373 int embedded_worker_id, |
| 374 int64_t service_worker_version_id, |
| 375 const GURL& service_worker_scope, |
| 376 const GURL& script_url, |
| 377 int worker_devtools_agent_route_id) |
| 378 : ServiceWorkerContextClient::ServiceWorkerContextClient( |
| 379 embedded_worker_id, |
| 380 service_worker_version_id, |
| 381 service_worker_scope, |
| 382 script_url, |
| 383 worker_devtools_agent_route_id, |
| 384 mojom::ServiceWorkerEventDispatcherRequest(), |
| 385 nullptr) {} |
| 386 |
418 ServiceWorkerContextClient::~ServiceWorkerContextClient() {} | 387 ServiceWorkerContextClient::~ServiceWorkerContextClient() {} |
419 | 388 |
420 void ServiceWorkerContextClient::OnMessageReceived( | 389 void ServiceWorkerContextClient::OnMessageReceived( |
421 int thread_id, | 390 int thread_id, |
422 int embedded_worker_id, | 391 int embedded_worker_id, |
423 const IPC::Message& message) { | 392 const IPC::Message& message) { |
424 CHECK_EQ(embedded_worker_id_, embedded_worker_id); | 393 CHECK_EQ(embedded_worker_id_, embedded_worker_id); |
425 bool handled = true; | 394 bool handled = true; |
426 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) | 395 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) |
427 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) | 396 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
(...skipping 19 matching lines...) Expand all Loading... |
447 OnNavigateClientError) | 416 OnNavigateClientError) |
448 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidSkipWaiting, OnDidSkipWaiting) | 417 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidSkipWaiting, OnDidSkipWaiting) |
449 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidClaimClients, OnDidClaimClients) | 418 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidClaimClients, OnDidClaimClients) |
450 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ClaimClientsError, OnClaimClientsError) | 419 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ClaimClientsError, OnClaimClientsError) |
451 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_Ping, OnPing); | 420 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_Ping, OnPing); |
452 IPC_MESSAGE_UNHANDLED(handled = false) | 421 IPC_MESSAGE_UNHANDLED(handled = false) |
453 IPC_END_MESSAGE_MAP() | 422 IPC_END_MESSAGE_MAP() |
454 DCHECK(handled); | 423 DCHECK(handled); |
455 } | 424 } |
456 | 425 |
457 void ServiceWorkerContextClient::BindInterfaceProviders( | |
458 service_manager::mojom::InterfaceProviderRequest request, | |
459 service_manager::mojom::InterfaceProviderPtr remote_interfaces) { | |
460 context_->interface_registry.Bind( | |
461 std::move(request), service_manager::Identity(), | |
462 service_manager::InterfaceProviderSpec(), service_manager::Identity(), | |
463 service_manager::InterfaceProviderSpec()); | |
464 context_->remote_interfaces.Bind(std::move(remote_interfaces)); | |
465 } | |
466 | |
467 blink::WebURL ServiceWorkerContextClient::scope() const { | 426 blink::WebURL ServiceWorkerContextClient::scope() const { |
468 return service_worker_scope_; | 427 return service_worker_scope_; |
469 } | 428 } |
470 | 429 |
471 void ServiceWorkerContextClient::getClient( | 430 void ServiceWorkerContextClient::getClient( |
472 const blink::WebString& id, | 431 const blink::WebString& id, |
473 blink::WebServiceWorkerClientCallbacks* callbacks) { | 432 blink::WebServiceWorkerClientCallbacks* callbacks) { |
474 DCHECK(callbacks); | 433 DCHECK(callbacks); |
475 int request_id = context_->client_callbacks.Add(callbacks); | 434 int request_id = context_->client_callbacks.Add(callbacks); |
476 Send(new ServiceWorkerHostMsg_GetClient( | 435 Send(new ServiceWorkerHostMsg_GetClient( |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 // willDestroyWorkerContext. | 511 // willDestroyWorkerContext. |
553 context_.reset(new WorkerContextData(this)); | 512 context_.reset(new WorkerContextData(this)); |
554 | 513 |
555 ServiceWorkerRegistrationObjectInfo registration_info; | 514 ServiceWorkerRegistrationObjectInfo registration_info; |
556 ServiceWorkerVersionAttributes version_attrs; | 515 ServiceWorkerVersionAttributes version_attrs; |
557 provider_context_->GetAssociatedRegistration(®istration_info, | 516 provider_context_->GetAssociatedRegistration(®istration_info, |
558 &version_attrs); | 517 &version_attrs); |
559 DCHECK_NE(registration_info.registration_id, | 518 DCHECK_NE(registration_info.registration_id, |
560 kInvalidServiceWorkerRegistrationId); | 519 kInvalidServiceWorkerRegistrationId); |
561 | 520 |
562 // Register Mojo interfaces. | |
563 context_->interface_registry.AddInterface( | |
564 base::Bind(&BackgroundSyncClientImpl::Create)); | |
565 context_->interface_registry.AddInterface( | |
566 base::Bind(&FetchEventDispatcherImpl::Create)); | |
567 | |
568 if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { | 521 if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { |
569 DCHECK(embedded_worker_client_); | 522 DCHECK(pending_dispatcher_request_.is_pending()); |
570 embedded_worker_client_->ExposeInterfacesToBrowser( | 523 BindEventDispatcher(std::move(pending_dispatcher_request_)); |
571 &context_->interface_registry); | |
572 } | 524 } |
573 | 525 |
574 SetRegistrationInServiceWorkerGlobalScope(registration_info, version_attrs); | 526 SetRegistrationInServiceWorkerGlobalScope(registration_info, version_attrs); |
575 | 527 |
576 Send(new EmbeddedWorkerHostMsg_WorkerThreadStarted( | 528 Send(new EmbeddedWorkerHostMsg_WorkerThreadStarted( |
577 embedded_worker_id_, WorkerThread::GetCurrentId(), | 529 embedded_worker_id_, WorkerThread::GetCurrentId(), |
578 provider_context_->provider_id())); | 530 provider_context_->provider_id())); |
579 | 531 |
580 TRACE_EVENT_ASYNC_STEP_INTO0( | 532 TRACE_EVENT_ASYNC_STEP_INTO0( |
581 "ServiceWorker", | 533 "ServiceWorker", |
(...skipping 26 matching lines...) Expand all Loading... |
608 v8::Local<v8::Context> context) { | 560 v8::Local<v8::Context> context) { |
609 // At this point WillStopCurrentWorkerThread is already called, so | 561 // At this point WillStopCurrentWorkerThread is already called, so |
610 // worker_task_runner_->RunsTasksOnCurrentThread() returns false | 562 // worker_task_runner_->RunsTasksOnCurrentThread() returns false |
611 // (while we're still on the worker thread). | 563 // (while we're still on the worker thread). |
612 proxy_ = NULL; | 564 proxy_ = NULL; |
613 | 565 |
614 // Aborts the all pending sync event callbacks. | 566 // Aborts the all pending sync event callbacks. |
615 for (WorkerContextData::SyncEventCallbacksMap::iterator it( | 567 for (WorkerContextData::SyncEventCallbacksMap::iterator it( |
616 &context_->sync_event_callbacks); | 568 &context_->sync_event_callbacks); |
617 !it.IsAtEnd(); it.Advance()) { | 569 !it.IsAtEnd(); it.Advance()) { |
618 it.GetCurrentValue()->Run(blink::mojom::ServiceWorkerEventStatus::ABORTED, | 570 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
619 base::Time::Now()); | |
620 } | 571 } |
621 // Aborts the all pending fetch event callbacks. | 572 // Aborts the all pending fetch event callbacks. |
622 for (WorkerContextData::FetchEventCallbacksMap::iterator it( | 573 for (WorkerContextData::FetchEventCallbacksMap::iterator it( |
623 &context_->fetch_event_callbacks); | 574 &context_->fetch_event_callbacks); |
624 !it.IsAtEnd(); it.Advance()) { | 575 !it.IsAtEnd(); it.Advance()) { |
625 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); | 576 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
626 } | 577 } |
627 | 578 |
628 // We have to clear callbacks now, as they need to be freed on the | 579 // We have to clear callbacks now, as they need to be freed on the |
629 // same thread. | 580 // same thread. |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 | 761 |
811 void ServiceWorkerContextClient::didHandleSyncEvent( | 762 void ServiceWorkerContextClient::didHandleSyncEvent( |
812 int request_id, | 763 int request_id, |
813 blink::WebServiceWorkerEventResult result, | 764 blink::WebServiceWorkerEventResult result, |
814 double event_dispatch_time) { | 765 double event_dispatch_time) { |
815 const SyncCallback* callback = | 766 const SyncCallback* callback = |
816 context_->sync_event_callbacks.Lookup(request_id); | 767 context_->sync_event_callbacks.Lookup(request_id); |
817 if (!callback) | 768 if (!callback) |
818 return; | 769 return; |
819 if (result == blink::WebServiceWorkerEventResultCompleted) { | 770 if (result == blink::WebServiceWorkerEventResultCompleted) { |
820 callback->Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED, | 771 callback->Run(SERVICE_WORKER_OK, |
821 base::Time::FromDoubleT(event_dispatch_time)); | 772 base::Time::FromDoubleT(event_dispatch_time)); |
822 } else { | 773 } else { |
823 callback->Run(blink::mojom::ServiceWorkerEventStatus::REJECTED, | 774 callback->Run(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, |
824 base::Time::FromDoubleT(event_dispatch_time)); | 775 base::Time::FromDoubleT(event_dispatch_time)); |
825 } | 776 } |
826 context_->sync_event_callbacks.Remove(request_id); | 777 context_->sync_event_callbacks.Remove(request_id); |
827 } | 778 } |
828 | 779 |
829 blink::WebServiceWorkerNetworkProvider* | 780 blink::WebServiceWorkerNetworkProvider* |
830 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( | 781 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( |
831 blink::WebDataSource* data_source) { | 782 blink::WebDataSource* data_source) { |
832 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); | 783 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); |
833 | 784 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 void ServiceWorkerContextClient::registerForeignFetchScopes( | 877 void ServiceWorkerContextClient::registerForeignFetchScopes( |
927 const blink::WebVector<blink::WebURL>& sub_scopes, | 878 const blink::WebVector<blink::WebURL>& sub_scopes, |
928 const blink::WebVector<blink::WebSecurityOrigin>& origins) { | 879 const blink::WebVector<blink::WebSecurityOrigin>& origins) { |
929 Send(new ServiceWorkerHostMsg_RegisterForeignFetchScopes( | 880 Send(new ServiceWorkerHostMsg_RegisterForeignFetchScopes( |
930 GetRoutingID(), std::vector<GURL>(sub_scopes.begin(), sub_scopes.end()), | 881 GetRoutingID(), std::vector<GURL>(sub_scopes.begin(), sub_scopes.end()), |
931 std::vector<url::Origin>(origins.begin(), origins.end()))); | 882 std::vector<url::Origin>(origins.begin(), origins.end()))); |
932 } | 883 } |
933 | 884 |
934 void ServiceWorkerContextClient::DispatchSyncEvent( | 885 void ServiceWorkerContextClient::DispatchSyncEvent( |
935 const std::string& tag, | 886 const std::string& tag, |
936 blink::WebServiceWorkerContextProxy::LastChanceOption last_chance, | 887 blink::mojom::BackgroundSyncEventLastChance last_chance, |
937 const SyncCallback& callback) { | 888 const DispatchSyncEventCallback& callback) { |
938 TRACE_EVENT0("ServiceWorker", | 889 TRACE_EVENT0("ServiceWorker", |
939 "ServiceWorkerContextClient::DispatchSyncEvent"); | 890 "ServiceWorkerContextClient::DispatchSyncEvent"); |
940 int request_id = | 891 int request_id = |
941 context_->sync_event_callbacks.Add(new SyncCallback(callback)); | 892 context_->sync_event_callbacks.Add(new SyncCallback(callback)); |
942 | 893 |
| 894 // TODO(shimazu): Use typemap when this is moved to blink-side. |
| 895 blink::WebServiceWorkerContextProxy::LastChanceOption web_last_chance = |
| 896 mojo::ConvertTo<blink::WebServiceWorkerContextProxy::LastChanceOption>( |
| 897 last_chance); |
| 898 |
943 // TODO(jkarlin): Make this blink::WebString::FromUTF8Lenient once | 899 // TODO(jkarlin): Make this blink::WebString::FromUTF8Lenient once |
944 // https://crrev.com/1768063002/ lands. | 900 // https://crrev.com/1768063002/ lands. |
945 proxy_->dispatchSyncEvent(request_id, blink::WebString::fromUTF8(tag), | 901 proxy_->dispatchSyncEvent(request_id, blink::WebString::fromUTF8(tag), |
946 last_chance); | 902 web_last_chance); |
947 } | 903 } |
948 | 904 |
949 void ServiceWorkerContextClient::Send(IPC::Message* message) { | 905 void ServiceWorkerContextClient::Send(IPC::Message* message) { |
950 sender_->Send(message); | 906 sender_->Send(message); |
951 } | 907 } |
952 | 908 |
953 void ServiceWorkerContextClient::SendWorkerStarted() { | 909 void ServiceWorkerContextClient::SendWorkerStarted() { |
954 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 910 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
955 TRACE_EVENT_ASYNC_END0("ServiceWorker", | 911 TRACE_EVENT_ASYNC_END0("ServiceWorker", |
956 "ServiceWorkerContextClient::StartingWorkerContext", | 912 "ServiceWorkerContextClient::StartingWorkerContext", |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 | 970 |
1015 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { | 971 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { |
1016 TRACE_EVENT0("ServiceWorker", | 972 TRACE_EVENT0("ServiceWorker", |
1017 "ServiceWorkerContextClient::OnInstallEvent"); | 973 "ServiceWorkerContextClient::OnInstallEvent"); |
1018 proxy_->dispatchInstallEvent(request_id); | 974 proxy_->dispatchInstallEvent(request_id); |
1019 } | 975 } |
1020 | 976 |
1021 void ServiceWorkerContextClient::DispatchFetchEvent( | 977 void ServiceWorkerContextClient::DispatchFetchEvent( |
1022 int fetch_event_id, | 978 int fetch_event_id, |
1023 const ServiceWorkerFetchRequest& request, | 979 const ServiceWorkerFetchRequest& request, |
1024 std::unique_ptr<NavigationPreloadRequest> preload_request, | 980 mojom::FetchEventPreloadHandlePtr preload_handle, |
1025 const FetchCallback& callback) { | 981 const DispatchFetchEventCallback& callback) { |
| 982 std::unique_ptr<NavigationPreloadRequest> preload_request = |
| 983 preload_handle |
| 984 ? base::MakeUnique<NavigationPreloadRequest>( |
| 985 fetch_event_id, request.url, std::move(preload_handle)) |
| 986 : nullptr; |
1026 const bool navigation_preload_sent = !!preload_request; | 987 const bool navigation_preload_sent = !!preload_request; |
1027 blink::WebServiceWorkerRequest webRequest; | 988 blink::WebServiceWorkerRequest webRequest; |
1028 TRACE_EVENT0("ServiceWorker", | 989 TRACE_EVENT0("ServiceWorker", |
1029 "ServiceWorkerContextClient::DispatchFetchEvent"); | 990 "ServiceWorkerContextClient::DispatchFetchEvent"); |
1030 context_->fetch_event_callbacks.AddWithID(new FetchCallback(callback), | 991 context_->fetch_event_callbacks.AddWithID(new FetchCallback(callback), |
1031 fetch_event_id); | 992 fetch_event_id); |
1032 if (preload_request) { | 993 if (preload_request) { |
1033 context_->preload_requests.AddWithID(std::move(preload_request), | 994 context_->preload_requests.AddWithID(std::move(preload_request), |
1034 fetch_event_id); | 995 fetch_event_id); |
1035 } | 996 } |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), | 1258 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), |
1298 std::move(data_consumer_handle)); | 1259 std::move(data_consumer_handle)); |
1299 } | 1260 } |
1300 | 1261 |
1301 void ServiceWorkerContextClient::OnNavigationPreloadError( | 1262 void ServiceWorkerContextClient::OnNavigationPreloadError( |
1302 int fetch_event_id, | 1263 int fetch_event_id, |
1303 std::unique_ptr<blink::WebServiceWorkerError> error) { | 1264 std::unique_ptr<blink::WebServiceWorkerError> error) { |
1304 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); | 1265 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); |
1305 } | 1266 } |
1306 | 1267 |
| 1268 void ServiceWorkerContextClient::BindEventDispatcher( |
| 1269 mojom::ServiceWorkerEventDispatcherRequest request) { |
| 1270 DCHECK(context_); |
| 1271 DCHECK(!context_->event_dispatcher_binding.is_bound()); |
| 1272 context_->event_dispatcher_binding.Bind(std::move(request)); |
| 1273 } |
| 1274 |
1307 base::WeakPtr<ServiceWorkerContextClient> | 1275 base::WeakPtr<ServiceWorkerContextClient> |
1308 ServiceWorkerContextClient::GetWeakPtr() { | 1276 ServiceWorkerContextClient::GetWeakPtr() { |
1309 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1277 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
1310 DCHECK(context_); | 1278 DCHECK(context_); |
1311 return context_->weak_factory.GetWeakPtr(); | 1279 return context_->weak_factory.GetWeakPtr(); |
1312 } | 1280 } |
1313 | 1281 |
1314 } // namespace content | 1282 } // namespace content |
OLD | NEW |