Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(469)

Side by Side Diff: content/renderer/service_worker/service_worker_script_context.cc

Issue 785133006: Enable messaging over a navigator.connect initiated channel. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@navigator-connect_serviceside
Patch Set: add empty line Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/service_worker/service_worker_script_context.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/service_worker/service_worker_script_context.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698