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
3 // found in the LICENSE file.
5 #include "content/renderer/service_worker/service_worker_script_context.h"
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/trace_event/trace_event.h"
11 #include "content/child/notifications/notification_data_conversions.h"
12 #include "content/child/service_worker/web_service_worker_registration_impl.h"
13 #include "content/child/thread_safe_sender.h"
14 #include "content/child/webmessageportchannel_impl.h"
15 #include "content/common/message_port_messages.h"
16 #include "content/common/service_worker/service_worker_messages.h"
17 #include "content/public/common/referrer.h"
18 #include "content/renderer/service_worker/embedded_worker_context_client.h"
19 #include "ipc/ipc_message.h"
20 #include "third_party/WebKit/public/platform/WebCrossOriginServiceWorkerClient.h"
21 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
22 #include "third_party/WebKit/public/platform/WebServiceWorkerClientQueryOptions.h"
23 #include "third_party/WebKit/public/platform/WebServiceWorkerRequest.h"
24 #include "third_party/WebKit/public/platform/WebString.h"
25 #include "third_party/WebKit/public/platform/WebURL.h"
26 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificationData.h"
27 #include "third_party/WebKit/public/web/WebServiceWorkerContextClient.h"
28 #include "third_party/WebKit/public/web/WebServiceWorkerContextProxy.h"
34 void SendPostMessageToClientOnMainThread(
35 ThreadSafeSender
* sender
,
37 const std::string
& uuid
,
38 const base::string16
& message
,
39 scoped_ptr
<blink::WebMessagePortChannelArray
> channels
) {
40 sender
->Send(new ServiceWorkerHostMsg_PostMessageToClient(
41 routing_id
, uuid
, message
,
42 WebMessagePortChannelImpl::ExtractMessagePortIDs(channels
.release())));
45 void SendCrossOriginMessageToClientOnMainThread(
46 ThreadSafeSender
* sender
,
48 const base::string16
& message
,
49 scoped_ptr
<blink::WebMessagePortChannelArray
> channels
) {
50 sender
->Send(new MessagePortHostMsg_PostMessage(
52 MessagePortMessage(message
),
53 WebMessagePortChannelImpl::ExtractMessagePortIDs(
54 channels
.release())));
57 blink::WebURLRequest::FetchRequestMode
GetBlinkFetchRequestMode(
58 FetchRequestMode mode
) {
59 return static_cast<blink::WebURLRequest::FetchRequestMode
>(mode
);
62 blink::WebURLRequest::FetchCredentialsMode
GetBlinkFetchCredentialsMode(
63 FetchCredentialsMode credentials_mode
) {
64 return static_cast<blink::WebURLRequest::FetchCredentialsMode
>(
68 blink::WebURLRequest::RequestContext
GetBlinkRequestContext(
69 RequestContextType request_context_type
) {
70 return static_cast<blink::WebURLRequest::RequestContext
>(
71 request_context_type
);
74 blink::WebURLRequest::FrameType
GetBlinkFrameType(
75 RequestContextFrameType frame_type
) {
76 return static_cast<blink::WebURLRequest::FrameType
>(frame_type
);
79 blink::WebServiceWorkerClientInfo
80 ToWebServiceWorkerClientInfo(const ServiceWorkerClientInfo
& client_info
) {
81 DCHECK(client_info
.IsValid());
83 blink::WebServiceWorkerClientInfo web_client_info
;
85 web_client_info
.uuid
= base::UTF8ToUTF16(client_info
.client_uuid
);
86 web_client_info
.pageVisibilityState
= client_info
.page_visibility_state
;
87 web_client_info
.isFocused
= client_info
.is_focused
;
88 web_client_info
.url
= client_info
.url
;
89 web_client_info
.frameType
= GetBlinkFrameType(client_info
.frame_type
);
90 web_client_info
.clientType
= client_info
.client_type
;
92 return web_client_info
;
97 ServiceWorkerScriptContext::ServiceWorkerScriptContext(
98 EmbeddedWorkerContextClient
* embedded_context
,
99 blink::WebServiceWorkerContextProxy
* proxy
)
100 : embedded_context_(embedded_context
),
104 ServiceWorkerScriptContext::~ServiceWorkerScriptContext() {}
106 void ServiceWorkerScriptContext::OnMessageReceived(
107 const IPC::Message
& message
) {
109 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerScriptContext
, message
)
110 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent
, OnActivateEvent
)
111 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent
, OnFetchEvent
)
112 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent
, OnInstallEvent
)
113 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent
, OnSyncEvent
)
114 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent
,
115 OnNotificationClickEvent
)
116 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent
, OnPushEvent
)
117 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent
, OnGeofencingEvent
)
118 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent
,
119 OnCrossOriginConnectEvent
)
120 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker
, OnPostMessage
)
121 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker
,
122 OnCrossOriginMessageToWorker
)
123 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients
,
125 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse
,
126 OnOpenWindowResponse
)
127 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError
,
129 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse
,
130 OnFocusClientResponse
)
131 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidSkipWaiting
, OnDidSkipWaiting
)
132 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidClaimClients
, OnDidClaimClients
)
133 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ClaimClientsError
, OnClaimClientsError
)
134 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_Ping
, OnPing
);
135 IPC_MESSAGE_UNHANDLED(handled
= false)
136 IPC_END_MESSAGE_MAP()
141 void ServiceWorkerScriptContext::SetRegistrationInServiceWorkerGlobalScope(
142 scoped_ptr
<WebServiceWorkerRegistrationImpl
> registration
) {
143 proxy_
->setRegistration(registration
.release());
146 void ServiceWorkerScriptContext::DidHandleActivateEvent(
148 blink::WebServiceWorkerEventResult result
) {
150 "ServiceWorker.ActivateEventExecutionTime",
151 base::TimeTicks::Now() - activate_start_timings_
[request_id
]);
152 activate_start_timings_
.erase(request_id
);
154 Send(new ServiceWorkerHostMsg_ActivateEventFinished(
155 GetRoutingID(), request_id
, result
));
158 void ServiceWorkerScriptContext::DidHandleInstallEvent(
160 blink::WebServiceWorkerEventResult result
) {
162 "ServiceWorker.InstallEventExecutionTime",
163 base::TimeTicks::Now() - install_start_timings_
[request_id
]);
164 install_start_timings_
.erase(request_id
);
166 Send(new ServiceWorkerHostMsg_InstallEventFinished(
167 GetRoutingID(), request_id
, result
));
170 void ServiceWorkerScriptContext::DidHandleFetchEvent(
172 ServiceWorkerFetchEventResult result
,
173 const ServiceWorkerResponse
& response
) {
175 "ServiceWorker.FetchEventExecutionTime",
176 base::TimeTicks::Now() - fetch_start_timings_
[request_id
]);
177 fetch_start_timings_
.erase(request_id
);
179 Send(new ServiceWorkerHostMsg_FetchEventFinished(
180 GetRoutingID(), request_id
, result
, response
));
183 void ServiceWorkerScriptContext::DidHandleNotificationClickEvent(
185 blink::WebServiceWorkerEventResult result
) {
187 "ServiceWorker.NotificationClickEventExecutionTime",
188 base::TimeTicks::Now() - notification_click_start_timings_
[request_id
]);
189 notification_click_start_timings_
.erase(request_id
);
191 Send(new ServiceWorkerHostMsg_NotificationClickEventFinished(
192 GetRoutingID(), request_id
));
195 void ServiceWorkerScriptContext::DidHandlePushEvent(
197 blink::WebServiceWorkerEventResult result
) {
198 if (result
== blink::WebServiceWorkerEventResultCompleted
) {
200 "ServiceWorker.PushEventExecutionTime",
201 base::TimeTicks::Now() - push_start_timings_
[request_id
]);
203 push_start_timings_
.erase(request_id
);
205 Send(new ServiceWorkerHostMsg_PushEventFinished(
206 GetRoutingID(), request_id
, result
));
209 void ServiceWorkerScriptContext::DidHandleSyncEvent(int request_id
) {
210 Send(new ServiceWorkerHostMsg_SyncEventFinished(
211 GetRoutingID(), request_id
));
214 void ServiceWorkerScriptContext::DidHandleCrossOriginConnectEvent(
216 bool accept_connection
) {
217 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished(
218 GetRoutingID(), request_id
, accept_connection
));
221 void ServiceWorkerScriptContext::GetClients(
222 const blink::WebServiceWorkerClientQueryOptions
& weboptions
,
223 blink::WebServiceWorkerClientsCallbacks
* callbacks
) {
225 int request_id
= pending_clients_callbacks_
.Add(callbacks
);
226 ServiceWorkerClientQueryOptions options
;
227 options
.client_type
= weboptions
.clientType
;
228 options
.include_uncontrolled
= weboptions
.includeUncontrolled
;
229 Send(new ServiceWorkerHostMsg_GetClients(
230 GetRoutingID(), request_id
, options
));
233 void ServiceWorkerScriptContext::OpenWindow(
234 const GURL
& url
, blink::WebServiceWorkerClientCallbacks
* callbacks
) {
236 int request_id
= pending_client_callbacks_
.Add(callbacks
);
237 Send(new ServiceWorkerHostMsg_OpenWindow(GetRoutingID(), request_id
, url
));
240 void ServiceWorkerScriptContext::SetCachedMetadata(const GURL
& url
,
243 std::vector
<char> copy(data
, data
+ size
);
244 Send(new ServiceWorkerHostMsg_SetCachedMetadata(GetRoutingID(), url
, copy
));
247 void ServiceWorkerScriptContext::ClearCachedMetadata(const GURL
& url
) {
248 Send(new ServiceWorkerHostMsg_ClearCachedMetadata(GetRoutingID(), url
));
251 void ServiceWorkerScriptContext::PostMessageToClient(
252 const base::string16
& uuid
,
253 const base::string16
& message
,
254 scoped_ptr
<blink::WebMessagePortChannelArray
> channels
) {
255 // This may send channels for MessagePorts, and all internal book-keeping
256 // messages for MessagePort (e.g. QueueMessages) are sent from main thread
257 // (with thread hopping), so we need to do the same thread hopping here not
258 // to overtake those messages.
259 embedded_context_
->main_thread_task_runner()->PostTask(
261 base::Bind(&SendPostMessageToClientOnMainThread
,
262 make_scoped_refptr(embedded_context_
->thread_safe_sender()),
264 base::UTF16ToUTF8(uuid
),
265 message
, base::Passed(&channels
)));
268 void ServiceWorkerScriptContext::PostCrossOriginMessageToClient(
269 const blink::WebCrossOriginServiceWorkerClient
& client
,
270 const base::string16
& message
,
271 scoped_ptr
<blink::WebMessagePortChannelArray
> channels
) {
272 // This may send channels for MessagePorts, and all internal book-keeping
273 // messages for MessagePort (e.g. QueueMessages) are sent from main thread
274 // (with thread hopping), so we need to do the same thread hopping here not
275 // to overtake those messages.
276 embedded_context_
->main_thread_task_runner()->PostTask(
278 base::Bind(&SendCrossOriginMessageToClientOnMainThread
,
279 make_scoped_refptr(embedded_context_
->thread_safe_sender()),
280 client
.clientID
, message
, base::Passed(&channels
)));
283 void ServiceWorkerScriptContext::FocusClient(
284 const base::string16
& uuid
,
285 blink::WebServiceWorkerClientCallbacks
* callback
) {
287 int request_id
= pending_client_callbacks_
.Add(callback
);
288 Send(new ServiceWorkerHostMsg_FocusClient(GetRoutingID(), request_id
,
289 base::UTF16ToUTF8(uuid
)));
292 void ServiceWorkerScriptContext::ClaimClients(
293 blink::WebServiceWorkerClientsClaimCallbacks
* callbacks
) {
295 int request_id
= pending_claim_clients_callbacks_
.Add(callbacks
);
296 Send(new ServiceWorkerHostMsg_ClaimClients(GetRoutingID(), request_id
));
299 void ServiceWorkerScriptContext::SkipWaiting(
300 blink::WebServiceWorkerSkipWaitingCallbacks
* callbacks
) {
302 int request_id
= pending_skip_waiting_callbacks_
.Add(callbacks
);
303 Send(new ServiceWorkerHostMsg_SkipWaiting(GetRoutingID(), request_id
));
306 void ServiceWorkerScriptContext::Send(IPC::Message
* message
) {
307 embedded_context_
->Send(message
);
310 int ServiceWorkerScriptContext::GetRoutingID() const {
311 return embedded_context_
->embedded_worker_id();
314 void ServiceWorkerScriptContext::OnActivateEvent(int request_id
) {
315 TRACE_EVENT0("ServiceWorker",
316 "ServiceWorkerScriptContext::OnActivateEvent");
317 activate_start_timings_
[request_id
] = base::TimeTicks::Now();
318 proxy_
->dispatchActivateEvent(request_id
);
321 void ServiceWorkerScriptContext::OnInstallEvent(int request_id
) {
322 TRACE_EVENT0("ServiceWorker",
323 "ServiceWorkerScriptContext::OnInstallEvent");
324 install_start_timings_
[request_id
] = base::TimeTicks::Now();
325 proxy_
->dispatchInstallEvent(request_id
);
328 void ServiceWorkerScriptContext::OnFetchEvent(
330 const ServiceWorkerFetchRequest
& request
) {
331 blink::WebServiceWorkerRequest webRequest
;
332 TRACE_EVENT0("ServiceWorker",
333 "ServiceWorkerScriptContext::OnFetchEvent");
334 webRequest
.setURL(blink::WebURL(request
.url
));
335 webRequest
.setMethod(blink::WebString::fromUTF8(request
.method
));
336 for (ServiceWorkerHeaderMap::const_iterator it
= request
.headers
.begin();
337 it
!= request
.headers
.end();
339 webRequest
.setHeader(blink::WebString::fromUTF8(it
->first
),
340 blink::WebString::fromUTF8(it
->second
));
342 if (!request
.blob_uuid
.empty()) {
343 webRequest
.setBlob(blink::WebString::fromUTF8(request
.blob_uuid
),
346 webRequest
.setReferrer(
347 blink::WebString::fromUTF8(request
.referrer
.url
.spec()),
348 request
.referrer
.policy
);
349 webRequest
.setMode(GetBlinkFetchRequestMode(request
.mode
));
350 webRequest
.setCredentialsMode(
351 GetBlinkFetchCredentialsMode(request
.credentials_mode
));
352 webRequest
.setRequestContext(
353 GetBlinkRequestContext(request
.request_context_type
));
354 webRequest
.setFrameType(GetBlinkFrameType(request
.frame_type
));
355 webRequest
.setIsReload(request
.is_reload
);
356 fetch_start_timings_
[request_id
] = base::TimeTicks::Now();
357 proxy_
->dispatchFetchEvent(request_id
, webRequest
);
360 void ServiceWorkerScriptContext::OnSyncEvent(int request_id
) {
361 TRACE_EVENT0("ServiceWorker",
362 "ServiceWorkerScriptContext::OnSyncEvent");
363 proxy_
->dispatchSyncEvent(request_id
);
366 void ServiceWorkerScriptContext::OnNotificationClickEvent(
368 const std::string
& notification_id
,
369 const PlatformNotificationData
& notification_data
) {
370 TRACE_EVENT0("ServiceWorker",
371 "ServiceWorkerScriptContext::OnNotificationClickEvent");
372 notification_click_start_timings_
[request_id
] = base::TimeTicks::Now();
373 proxy_
->dispatchNotificationClickEvent(
375 blink::WebString::fromUTF8(notification_id
),
376 ToWebNotificationData(notification_data
));
379 void ServiceWorkerScriptContext::OnPushEvent(int request_id
,
380 const std::string
& data
) {
381 TRACE_EVENT0("ServiceWorker",
382 "ServiceWorkerScriptContext::OnPushEvent");
383 push_start_timings_
[request_id
] = base::TimeTicks::Now();
384 proxy_
->dispatchPushEvent(request_id
, blink::WebString::fromUTF8(data
));
387 void ServiceWorkerScriptContext::OnGeofencingEvent(
389 blink::WebGeofencingEventType event_type
,
390 const std::string
& region_id
,
391 const blink::WebCircularGeofencingRegion
& region
) {
392 TRACE_EVENT0("ServiceWorker",
393 "ServiceWorkerScriptContext::OnGeofencingEvent");
394 proxy_
->dispatchGeofencingEvent(
395 request_id
, event_type
, blink::WebString::fromUTF8(region_id
), region
);
396 Send(new ServiceWorkerHostMsg_GeofencingEventFinished(GetRoutingID(),
400 void ServiceWorkerScriptContext::OnCrossOriginConnectEvent(
402 const NavigatorConnectClient
& client
) {
403 TRACE_EVENT0("ServiceWorker",
404 "ServiceWorkerScriptContext::OnCrossOriginConnectEvent");
405 blink::WebCrossOriginServiceWorkerClient web_client
;
406 web_client
.origin
= client
.origin
;
407 web_client
.targetURL
= client
.target_url
;
408 web_client
.clientID
= client
.message_port_id
;
409 proxy_
->dispatchCrossOriginConnectEvent(request_id
, web_client
);
412 void ServiceWorkerScriptContext::OnPostMessage(
413 const base::string16
& message
,
414 const std::vector
<TransferredMessagePort
>& sent_message_ports
,
415 const std::vector
<int>& new_routing_ids
) {
416 TRACE_EVENT0("ServiceWorker",
417 "ServiceWorkerScriptContext::OnPostEvent");
418 blink::WebMessagePortChannelArray ports
=
419 WebMessagePortChannelImpl::CreatePorts(
420 sent_message_ports
, new_routing_ids
,
421 embedded_context_
->main_thread_task_runner());
423 // dispatchMessageEvent is expected to execute onmessage function
425 base::TimeTicks before
= base::TimeTicks::Now();
426 proxy_
->dispatchMessageEvent(message
, ports
);
428 "ServiceWorker.MessageEventExecutionTime",
429 base::TimeTicks::Now() - before
);
432 void ServiceWorkerScriptContext::OnCrossOriginMessageToWorker(
433 const NavigatorConnectClient
& client
,
434 const base::string16
& message
,
435 const std::vector
<TransferredMessagePort
>& sent_message_ports
,
436 const std::vector
<int>& new_routing_ids
) {
437 TRACE_EVENT0("ServiceWorker",
438 "ServiceWorkerScriptContext::OnCrossOriginMessageToWorker");
439 blink::WebMessagePortChannelArray ports
=
440 WebMessagePortChannelImpl::CreatePorts(
441 sent_message_ports
, new_routing_ids
,
442 embedded_context_
->main_thread_task_runner());
444 blink::WebCrossOriginServiceWorkerClient web_client
;
445 web_client
.origin
= client
.origin
;
446 web_client
.targetURL
= client
.target_url
;
447 web_client
.clientID
= client
.message_port_id
;
448 proxy_
->dispatchCrossOriginMessageEvent(web_client
, message
, ports
);
451 void ServiceWorkerScriptContext::OnDidGetClients(
452 int request_id
, const std::vector
<ServiceWorkerClientInfo
>& clients
) {
453 TRACE_EVENT0("ServiceWorker",
454 "ServiceWorkerScriptContext::OnDidGetClients");
455 blink::WebServiceWorkerClientsCallbacks
* callbacks
=
456 pending_clients_callbacks_
.Lookup(request_id
);
458 NOTREACHED() << "Got stray response: " << request_id
;
461 scoped_ptr
<blink::WebServiceWorkerClientsInfo
> info(
462 new blink::WebServiceWorkerClientsInfo
);
463 blink::WebVector
<blink::WebServiceWorkerClientInfo
> convertedClients(
465 for (size_t i
= 0; i
< clients
.size(); ++i
)
466 convertedClients
[i
] = ToWebServiceWorkerClientInfo(clients
[i
]);
467 info
->clients
.swap(convertedClients
);
468 callbacks
->onSuccess(info
.release());
469 pending_clients_callbacks_
.Remove(request_id
);
472 void ServiceWorkerScriptContext::OnOpenWindowResponse(
474 const ServiceWorkerClientInfo
& client
) {
475 TRACE_EVENT0("ServiceWorker",
476 "ServiceWorkerScriptContext::OnOpenWindowResponse");
477 blink::WebServiceWorkerClientCallbacks
* callbacks
=
478 pending_client_callbacks_
.Lookup(request_id
);
480 NOTREACHED() << "Got stray response: " << request_id
;
483 scoped_ptr
<blink::WebServiceWorkerClientInfo
> web_client
;
484 if (!client
.IsEmpty()) {
485 DCHECK(client
.IsValid());
486 web_client
.reset(new blink::WebServiceWorkerClientInfo(
487 ToWebServiceWorkerClientInfo(client
)));
489 callbacks
->onSuccess(web_client
.release());
490 pending_client_callbacks_
.Remove(request_id
);
493 void ServiceWorkerScriptContext::OnOpenWindowError(
495 const std::string
& message
) {
496 TRACE_EVENT0("ServiceWorker",
497 "ServiceWorkerScriptContext::OnOpenWindowError");
498 blink::WebServiceWorkerClientCallbacks
* callbacks
=
499 pending_client_callbacks_
.Lookup(request_id
);
501 NOTREACHED() << "Got stray response: " << request_id
;
504 scoped_ptr
<blink::WebServiceWorkerError
> error(
505 new blink::WebServiceWorkerError(
506 blink::WebServiceWorkerError::ErrorTypeUnknown
,
507 blink::WebString::fromUTF8(message
)));
508 callbacks
->onError(error
.release());
509 pending_client_callbacks_
.Remove(request_id
);
512 void ServiceWorkerScriptContext::OnFocusClientResponse(
513 int request_id
, const ServiceWorkerClientInfo
& client
) {
514 TRACE_EVENT0("ServiceWorker",
515 "ServiceWorkerScriptContext::OnFocusClientResponse");
516 blink::WebServiceWorkerClientCallbacks
* callback
=
517 pending_client_callbacks_
.Lookup(request_id
);
519 NOTREACHED() << "Got stray response: " << request_id
;
522 if (!client
.IsEmpty()) {
523 DCHECK(client
.IsValid());
524 scoped_ptr
<blink::WebServiceWorkerClientInfo
> web_client (
525 new blink::WebServiceWorkerClientInfo(
526 ToWebServiceWorkerClientInfo(client
)));
527 callback
->onSuccess(web_client
.release());
529 scoped_ptr
<blink::WebServiceWorkerError
> error(
530 new blink::WebServiceWorkerError(
531 blink::WebServiceWorkerError::ErrorTypeNotFound
,
532 "The WindowClient was not found."));
533 callback
->onError(error
.release());
536 pending_client_callbacks_
.Remove(request_id
);
539 void ServiceWorkerScriptContext::OnDidSkipWaiting(int request_id
) {
540 TRACE_EVENT0("ServiceWorker",
541 "ServiceWorkerScriptContext::OnDidSkipWaiting");
542 blink::WebServiceWorkerSkipWaitingCallbacks
* callbacks
=
543 pending_skip_waiting_callbacks_
.Lookup(request_id
);
545 NOTREACHED() << "Got stray response: " << request_id
;
548 callbacks
->onSuccess();
549 pending_skip_waiting_callbacks_
.Remove(request_id
);
552 void ServiceWorkerScriptContext::OnDidClaimClients(int request_id
) {
553 TRACE_EVENT0("ServiceWorker",
554 "ServiceWorkerScriptContext::OnDidClaimClients");
555 blink::WebServiceWorkerClientsClaimCallbacks
* callbacks
=
556 pending_claim_clients_callbacks_
.Lookup(request_id
);
558 NOTREACHED() << "Got stray response: " << request_id
;
561 callbacks
->onSuccess();
562 pending_claim_clients_callbacks_
.Remove(request_id
);
565 void ServiceWorkerScriptContext::OnClaimClientsError(
567 blink::WebServiceWorkerError::ErrorType error_type
,
568 const base::string16
& message
) {
569 TRACE_EVENT0("ServiceWorker",
570 "ServiceWorkerScriptContext::OnClaimClientsError");
571 blink::WebServiceWorkerClientsClaimCallbacks
* callbacks
=
572 pending_claim_clients_callbacks_
.Lookup(request_id
);
574 NOTREACHED() << "Got stray response: " << request_id
;
577 scoped_ptr
<blink::WebServiceWorkerError
> error(
578 new blink::WebServiceWorkerError(error_type
, message
));
579 callbacks
->onError(error
.release());
580 pending_claim_clients_callbacks_
.Remove(request_id
);
583 void ServiceWorkerScriptContext::OnPing() {
584 Send(new ServiceWorkerHostMsg_Pong(GetRoutingID()));
587 } // namespace content