| 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/renderer/service_worker/service_worker_script_context.h" | 5 #include "content/renderer/service_worker/service_worker_script_context.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "content/child/notifications/notification_data_conversions.h" | 10 #include "content/child/notifications/notification_data_conversions.h" |
| 11 #include "content/child/thread_safe_sender.h" | 11 #include "content/child/thread_safe_sender.h" |
| 12 #include "content/child/webmessageportchannel_impl.h" | 12 #include "content/child/webmessageportchannel_impl.h" |
| 13 #include "content/common/message_port_messages.h" |
| 13 #include "content/common/service_worker/service_worker_messages.h" | 14 #include "content/common/service_worker/service_worker_messages.h" |
| 14 #include "content/renderer/service_worker/embedded_worker_context_client.h" | 15 #include "content/renderer/service_worker/embedded_worker_context_client.h" |
| 15 #include "ipc/ipc_message.h" | 16 #include "ipc/ipc_message.h" |
| 16 #include "third_party/WebKit/public/platform/WebCrossOriginServiceWorkerClient.h
" | 17 #include "third_party/WebKit/public/platform/WebCrossOriginServiceWorkerClient.h
" |
| 17 #include "third_party/WebKit/public/platform/WebNotificationData.h" | 18 #include "third_party/WebKit/public/platform/WebNotificationData.h" |
| 18 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" | 19 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" |
| 19 #include "third_party/WebKit/public/platform/WebServiceWorkerRequest.h" | 20 #include "third_party/WebKit/public/platform/WebServiceWorkerRequest.h" |
| 20 #include "third_party/WebKit/public/platform/WebString.h" | 21 #include "third_party/WebKit/public/platform/WebString.h" |
| 21 #include "third_party/WebKit/public/platform/WebURL.h" | 22 #include "third_party/WebKit/public/platform/WebURL.h" |
| 22 #include "third_party/WebKit/public/web/WebServiceWorkerContextClient.h" | 23 #include "third_party/WebKit/public/web/WebServiceWorkerContextClient.h" |
| 23 #include "third_party/WebKit/public/web/WebServiceWorkerContextProxy.h" | 24 #include "third_party/WebKit/public/web/WebServiceWorkerContextProxy.h" |
| 24 | 25 |
| 25 namespace content { | 26 namespace content { |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| 28 | 29 |
| 29 void SendPostMessageToDocumentOnMainThread( | 30 void SendPostMessageToDocumentOnMainThread( |
| 30 ThreadSafeSender* sender, | 31 ThreadSafeSender* sender, |
| 31 int routing_id, | 32 int routing_id, |
| 32 int client_id, | 33 int client_id, |
| 33 const base::string16& message, | 34 const base::string16& message, |
| 34 scoped_ptr<blink::WebMessagePortChannelArray> channels) { | 35 scoped_ptr<blink::WebMessagePortChannelArray> channels) { |
| 35 sender->Send(new ServiceWorkerHostMsg_PostMessageToDocument( | 36 sender->Send(new ServiceWorkerHostMsg_PostMessageToDocument( |
| 36 routing_id, client_id, message, | 37 routing_id, client_id, message, |
| 37 WebMessagePortChannelImpl::ExtractMessagePortIDs(channels.release()))); | 38 WebMessagePortChannelImpl::ExtractMessagePortIDs(channels.release()))); |
| 38 } | 39 } |
| 39 | 40 |
| 41 void SendCrossOriginMessageToClientOnMainThread( |
| 42 ThreadSafeSender* sender, |
| 43 int message_port_id, |
| 44 const base::string16& message, |
| 45 scoped_ptr<blink::WebMessagePortChannelArray> channels) { |
| 46 sender->Send(new MessagePortHostMsg_PostMessage( |
| 47 message_port_id, message, |
| 48 WebMessagePortChannelImpl::ExtractMessagePortIDs(channels.release()))); |
| 49 } |
| 50 |
| 40 blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode( | 51 blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode( |
| 41 FetchRequestMode mode) { | 52 FetchRequestMode mode) { |
| 42 return static_cast<blink::WebURLRequest::FetchRequestMode>(mode); | 53 return static_cast<blink::WebURLRequest::FetchRequestMode>(mode); |
| 43 } | 54 } |
| 44 | 55 |
| 45 blink::WebURLRequest::FetchCredentialsMode GetBlinkFetchCredentialsMode( | 56 blink::WebURLRequest::FetchCredentialsMode GetBlinkFetchCredentialsMode( |
| 46 FetchCredentialsMode credentials_mode) { | 57 FetchCredentialsMode credentials_mode) { |
| 47 return static_cast<blink::WebURLRequest::FetchCredentialsMode>( | 58 return static_cast<blink::WebURLRequest::FetchCredentialsMode>( |
| 48 credentials_mode); | 59 credentials_mode); |
| 49 } | 60 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 79 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) | 90 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
| 80 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) | 91 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
| 81 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) | 92 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) |
| 82 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, | 93 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
| 83 OnNotificationClickEvent) | 94 OnNotificationClickEvent) |
| 84 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) | 95 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
| 85 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) | 96 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) |
| 86 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, | 97 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, |
| 87 OnCrossOriginConnectEvent) | 98 OnCrossOriginConnectEvent) |
| 88 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) | 99 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) |
| 100 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, |
| 101 OnCrossOriginMessageToWorker) |
| 89 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClientDocuments, | 102 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClientDocuments, |
| 90 OnDidGetClientDocuments) | 103 OnDidGetClientDocuments) |
| 91 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, | 104 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, |
| 92 OnFocusClientResponse) | 105 OnFocusClientResponse) |
| 93 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidSkipWaiting, OnDidSkipWaiting) | 106 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidSkipWaiting, OnDidSkipWaiting) |
| 94 IPC_MESSAGE_UNHANDLED(handled = false) | 107 IPC_MESSAGE_UNHANDLED(handled = false) |
| 95 IPC_END_MESSAGE_MAP() | 108 IPC_END_MESSAGE_MAP() |
| 96 | 109 |
| 97 // TODO(gavinp): Would it be preferable to put an AddListener() method to | 110 // TODO(gavinp): Would it be preferable to put an AddListener() method to |
| 98 // EmbeddedWorkerContextClient? | 111 // EmbeddedWorkerContextClient? |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 // messages for MessagePort (e.g. QueueMessages) are sent from main thread | 206 // messages for MessagePort (e.g. QueueMessages) are sent from main thread |
| 194 // (with thread hopping), so we need to do the same thread hopping here not | 207 // (with thread hopping), so we need to do the same thread hopping here not |
| 195 // to overtake those messages. | 208 // to overtake those messages. |
| 196 embedded_context_->main_thread_proxy()->PostTask( | 209 embedded_context_->main_thread_proxy()->PostTask( |
| 197 FROM_HERE, | 210 FROM_HERE, |
| 198 base::Bind(&SendPostMessageToDocumentOnMainThread, | 211 base::Bind(&SendPostMessageToDocumentOnMainThread, |
| 199 make_scoped_refptr(embedded_context_->thread_safe_sender()), | 212 make_scoped_refptr(embedded_context_->thread_safe_sender()), |
| 200 GetRoutingID(), client_id, message, base::Passed(&channels))); | 213 GetRoutingID(), client_id, message, base::Passed(&channels))); |
| 201 } | 214 } |
| 202 | 215 |
| 216 void ServiceWorkerScriptContext::PostCrossOriginMessageToClient( |
| 217 const blink::WebCrossOriginServiceWorkerClient& client, |
| 218 const base::string16& message, |
| 219 scoped_ptr<blink::WebMessagePortChannelArray> channels) { |
| 220 // This may send channels for MessagePorts, and all internal book-keeping |
| 221 // messages for MessagePort (e.g. QueueMessages) are sent from main thread |
| 222 // (with thread hopping), so we need to do the same thread hopping here not |
| 223 // to overtake those messages. |
| 224 embedded_context_->main_thread_proxy()->PostTask( |
| 225 FROM_HERE, |
| 226 base::Bind(&SendCrossOriginMessageToClientOnMainThread, |
| 227 make_scoped_refptr(embedded_context_->thread_safe_sender()), |
| 228 client.clientID, message, base::Passed(&channels))); |
| 229 } |
| 230 |
| 203 void ServiceWorkerScriptContext::FocusClient( | 231 void ServiceWorkerScriptContext::FocusClient( |
| 204 int client_id, blink::WebServiceWorkerClientFocusCallback* callback) { | 232 int client_id, blink::WebServiceWorkerClientFocusCallback* callback) { |
| 205 DCHECK(callback); | 233 DCHECK(callback); |
| 206 int request_id = pending_focus_client_callbacks_.Add(callback); | 234 int request_id = pending_focus_client_callbacks_.Add(callback); |
| 207 Send(new ServiceWorkerHostMsg_FocusClient( | 235 Send(new ServiceWorkerHostMsg_FocusClient( |
| 208 GetRoutingID(), request_id, client_id)); | 236 GetRoutingID(), request_id, client_id)); |
| 209 } | 237 } |
| 210 | 238 |
| 211 void ServiceWorkerScriptContext::SkipWaiting( | 239 void ServiceWorkerScriptContext::SkipWaiting( |
| 212 blink::WebServiceWorkerSkipWaitingCallbacks* callbacks) { | 240 blink::WebServiceWorkerSkipWaitingCallbacks* callbacks) { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 | 367 |
| 340 // dispatchMessageEvent is expected to execute onmessage function | 368 // dispatchMessageEvent is expected to execute onmessage function |
| 341 // synchronously. | 369 // synchronously. |
| 342 base::TimeTicks before = base::TimeTicks::Now(); | 370 base::TimeTicks before = base::TimeTicks::Now(); |
| 343 proxy_->dispatchMessageEvent(message, ports); | 371 proxy_->dispatchMessageEvent(message, ports); |
| 344 UMA_HISTOGRAM_TIMES( | 372 UMA_HISTOGRAM_TIMES( |
| 345 "ServiceWorker.MessageEventExecutionTime", | 373 "ServiceWorker.MessageEventExecutionTime", |
| 346 base::TimeTicks::Now() - before); | 374 base::TimeTicks::Now() - before); |
| 347 } | 375 } |
| 348 | 376 |
| 377 void ServiceWorkerScriptContext::OnCrossOriginMessageToWorker( |
| 378 const CrossOriginServiceWorkerClient& client, |
| 379 const base::string16& message, |
| 380 const std::vector<int>& sent_message_port_ids, |
| 381 const std::vector<int>& new_routing_ids) { |
| 382 TRACE_EVENT0("ServiceWorker", |
| 383 "ServiceWorkerScriptContext::OnCrossOriginMessageToWorker"); |
| 384 std::vector<WebMessagePortChannelImpl*> ports; |
| 385 if (!sent_message_port_ids.empty()) { |
| 386 base::MessageLoopProxy* loop_proxy = embedded_context_->main_thread_proxy(); |
| 387 ports.resize(sent_message_port_ids.size()); |
| 388 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { |
| 389 ports[i] = new WebMessagePortChannelImpl( |
| 390 new_routing_ids[i], sent_message_port_ids[i], loop_proxy); |
| 391 } |
| 392 } |
| 393 |
| 394 blink::WebCrossOriginServiceWorkerClient web_client; |
| 395 web_client.origin = client.origin; |
| 396 web_client.targetURL = client.target_url; |
| 397 web_client.clientID = client.message_port_id; |
| 398 proxy_->dispatchCrossOriginMessageEvent(web_client, message, ports); |
| 399 } |
| 400 |
| 349 void ServiceWorkerScriptContext::OnDidGetClientDocuments( | 401 void ServiceWorkerScriptContext::OnDidGetClientDocuments( |
| 350 int request_id, const std::vector<ServiceWorkerClientInfo>& clients) { | 402 int request_id, const std::vector<ServiceWorkerClientInfo>& clients) { |
| 351 TRACE_EVENT0("ServiceWorker", | 403 TRACE_EVENT0("ServiceWorker", |
| 352 "ServiceWorkerScriptContext::OnDidGetClientDocuments"); | 404 "ServiceWorkerScriptContext::OnDidGetClientDocuments"); |
| 353 blink::WebServiceWorkerClientsCallbacks* callbacks = | 405 blink::WebServiceWorkerClientsCallbacks* callbacks = |
| 354 pending_clients_callbacks_.Lookup(request_id); | 406 pending_clients_callbacks_.Lookup(request_id); |
| 355 if (!callbacks) { | 407 if (!callbacks) { |
| 356 NOTREACHED() << "Got stray response: " << request_id; | 408 NOTREACHED() << "Got stray response: " << request_id; |
| 357 return; | 409 return; |
| 358 } | 410 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 pending_skip_waiting_callbacks_.Lookup(request_id); | 447 pending_skip_waiting_callbacks_.Lookup(request_id); |
| 396 if (!callbacks) { | 448 if (!callbacks) { |
| 397 NOTREACHED() << "Got stray response: " << request_id; | 449 NOTREACHED() << "Got stray response: " << request_id; |
| 398 return; | 450 return; |
| 399 } | 451 } |
| 400 callbacks->onSuccess(); | 452 callbacks->onSuccess(); |
| 401 pending_skip_waiting_callbacks_.Remove(request_id); | 453 pending_skip_waiting_callbacks_.Remove(request_id); |
| 402 } | 454 } |
| 403 | 455 |
| 404 } // namespace content | 456 } // namespace content |
| OLD | NEW |