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

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

Issue 1210643002: Update navigator.services API to use the new services.onconnect event [2/3]. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@serviceport
Patch Set: properly close connections when a worker is stopped Created 5 years, 5 months 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
OLDNEW
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 "base/lazy_instance.h" 7 #include "base/lazy_instance.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 "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "base/thread_task_runner_handle.h" 11 #include "base/thread_task_runner_handle.h"
12 #include "base/threading/thread_checker.h" 12 #include "base/threading/thread_checker.h"
13 #include "base/threading/thread_local.h" 13 #include "base/threading/thread_local.h"
14 #include "base/trace_event/trace_event.h" 14 #include "base/trace_event/trace_event.h"
15 #include "content/child/navigator_connect/service_port_dispatcher_impl.h"
15 #include "content/child/notifications/notification_data_conversions.h" 16 #include "content/child/notifications/notification_data_conversions.h"
16 #include "content/child/request_extra_data.h" 17 #include "content/child/request_extra_data.h"
17 #include "content/child/service_worker/service_worker_dispatcher.h" 18 #include "content/child/service_worker/service_worker_dispatcher.h"
18 #include "content/child/service_worker/service_worker_network_provider.h" 19 #include "content/child/service_worker/service_worker_network_provider.h"
19 #include "content/child/service_worker/service_worker_provider_context.h" 20 #include "content/child/service_worker/service_worker_provider_context.h"
20 #include "content/child/service_worker/service_worker_registration_handle_refere nce.h" 21 #include "content/child/service_worker/service_worker_registration_handle_refere nce.h"
21 #include "content/child/service_worker/web_service_worker_impl.h" 22 #include "content/child/service_worker/web_service_worker_impl.h"
22 #include "content/child/service_worker/web_service_worker_provider_impl.h" 23 #include "content/child/service_worker/web_service_worker_provider_impl.h"
23 #include "content/child/service_worker/web_service_worker_registration_impl.h" 24 #include "content/child/service_worker/web_service_worker_registration_impl.h"
24 #include "content/child/thread_safe_sender.h" 25 #include "content/child/thread_safe_sender.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 using ClientsCallbacksMap = 174 using ClientsCallbacksMap =
174 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; 175 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>;
175 using ClaimClientsCallbacksMap = 176 using ClaimClientsCallbacksMap =
176 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; 177 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>;
177 using ClientCallbacksMap = 178 using ClientCallbacksMap =
178 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; 179 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>;
179 using SkipWaitingCallbacksMap = 180 using SkipWaitingCallbacksMap =
180 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; 181 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>;
181 182
182 explicit WorkerContextData(ServiceWorkerContextClient* owner) 183 explicit WorkerContextData(ServiceWorkerContextClient* owner)
183 : weak_factory(owner) {} 184 : weak_factory(owner), proxy_weak_factory(owner->proxy_) {}
184 185
185 ~WorkerContextData() { 186 ~WorkerContextData() {
186 DCHECK(thread_checker.CalledOnValidThread()); 187 DCHECK(thread_checker.CalledOnValidThread());
187 } 188 }
188 189
189 // Pending callbacks for GetClientDocuments(). 190 // Pending callbacks for GetClientDocuments().
190 ClientsCallbacksMap clients_callbacks; 191 ClientsCallbacksMap clients_callbacks;
191 192
192 // Pending callbacks for OpenWindow() and FocusClient(). 193 // Pending callbacks for OpenWindow() and FocusClient().
193 ClientCallbacksMap client_callbacks; 194 ClientCallbacksMap client_callbacks;
194 195
195 // Pending callbacks for SkipWaiting(). 196 // Pending callbacks for SkipWaiting().
196 SkipWaitingCallbacksMap skip_waiting_callbacks; 197 SkipWaitingCallbacksMap skip_waiting_callbacks;
197 198
198 // Pending callbacks for ClaimClients(). 199 // Pending callbacks for ClaimClients().
199 ClaimClientsCallbacksMap claim_clients_callbacks; 200 ClaimClientsCallbacksMap claim_clients_callbacks;
200 201
201 base::ThreadChecker thread_checker; 202 base::ThreadChecker thread_checker;
202 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; 203 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory;
204 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory;
203 }; 205 };
204 206
205 ServiceWorkerContextClient* 207 ServiceWorkerContextClient*
206 ServiceWorkerContextClient::ThreadSpecificInstance() { 208 ServiceWorkerContextClient::ThreadSpecificInstance() {
207 return g_worker_client_tls.Pointer()->Get(); 209 return g_worker_client_tls.Pointer()->Get();
208 } 210 }
209 211
210 ServiceWorkerContextClient::ServiceWorkerContextClient( 212 ServiceWorkerContextClient::ServiceWorkerContextClient(
211 int embedded_worker_id, 213 int embedded_worker_id,
212 int64 service_worker_version_id, 214 int64 service_worker_version_id,
(...skipping 28 matching lines...) Expand all
241 bool handled = true; 243 bool handled = true;
242 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) 244 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message)
243 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) 245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent)
244 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) 246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent)
245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) 247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent)
246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) 248 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent)
247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, 249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent,
248 OnNotificationClickEvent) 250 OnNotificationClickEvent)
249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) 251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent)
250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) 252 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent)
251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent,
252 OnCrossOriginConnectEvent)
253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) 253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage)
254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, 254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker,
255 OnCrossOriginMessageToWorker) 255 OnCrossOriginMessageToWorker)
256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, 256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts,
257 OnSendStashedMessagePorts) 257 OnSendStashedMessagePorts)
258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) 258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients)
259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, 259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse,
260 OnOpenWindowResponse) 260 OnOpenWindowResponse)
261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, 261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError,
262 OnOpenWindowError) 262 OnOpenWindowError)
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); 339 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL);
340 DCHECK(!proxy_); 340 DCHECK(!proxy_);
341 g_worker_client_tls.Pointer()->Set(this); 341 g_worker_client_tls.Pointer()->Set(this);
342 proxy_ = proxy; 342 proxy_ = proxy;
343 343
344 // Initialize pending callback maps. This needs to be freed on the 344 // Initialize pending callback maps. This needs to be freed on the
345 // same thread before the worker context goes away in 345 // same thread before the worker context goes away in
346 // willDestroyWorkerContext. 346 // willDestroyWorkerContext.
347 context_.reset(new WorkerContextData(this)); 347 context_.reset(new WorkerContextData(this));
348 348
349 // Register Mojo services.
350 service_registry_.ServiceRegistry::AddService(
351 base::Bind(&ServicePortDispatcherImpl::Create,
352 context_->proxy_weak_factory.GetWeakPtr()));
353
349 SetRegistrationInServiceWorkerGlobalScope(); 354 SetRegistrationInServiceWorkerGlobalScope();
350 355
351 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoaded( 356 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoaded(
352 embedded_worker_id_, 357 embedded_worker_id_,
353 WorkerTaskRunner::Instance()->CurrentWorkerId(), 358 WorkerTaskRunner::Instance()->CurrentWorkerId(),
354 provider_context_->provider_id())); 359 provider_context_->provider_id()));
355 360
356 TRACE_EVENT_ASYNC_STEP_INTO0( 361 TRACE_EVENT_ASYNC_STEP_INTO0(
357 "ServiceWorker", 362 "ServiceWorker",
358 "ServiceWorkerContextClient::StartingWorkerContext", 363 "ServiceWorkerContextClient::StartingWorkerContext",
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 GetRoutingID(), request_id, result)); 523 GetRoutingID(), request_id, result));
519 } 524 }
520 525
521 void ServiceWorkerContextClient::didHandleSyncEvent( 526 void ServiceWorkerContextClient::didHandleSyncEvent(
522 int request_id, 527 int request_id,
523 blink::WebServiceWorkerEventResult result) { 528 blink::WebServiceWorkerEventResult result) {
524 Send(new ServiceWorkerHostMsg_SyncEventFinished(GetRoutingID(), request_id, 529 Send(new ServiceWorkerHostMsg_SyncEventFinished(GetRoutingID(), request_id,
525 result)); 530 result));
526 } 531 }
527 532
528 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent(
529 int request_id,
530 bool accept_connection) {
531 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished(
532 GetRoutingID(), request_id, accept_connection));
533 }
534
535 blink::WebServiceWorkerNetworkProvider* 533 blink::WebServiceWorkerNetworkProvider*
536 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( 534 ServiceWorkerContextClient::createServiceWorkerNetworkProvider(
537 blink::WebDataSource* data_source) { 535 blink::WebDataSource* data_source) {
538 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); 536 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
539 537
540 // Create a content::ServiceWorkerNetworkProvider for this data source so 538 // Create a content::ServiceWorkerNetworkProvider for this data source so
541 // we can observe its requests. 539 // we can observe its requests.
542 scoped_ptr<ServiceWorkerNetworkProvider> provider( 540 scoped_ptr<ServiceWorkerNetworkProvider> provider(
543 new ServiceWorkerNetworkProvider( 541 new ServiceWorkerNetworkProvider(
544 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); 542 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER));
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 const std::string& region_id, 760 const std::string& region_id,
763 const blink::WebCircularGeofencingRegion& region) { 761 const blink::WebCircularGeofencingRegion& region) {
764 TRACE_EVENT0("ServiceWorker", 762 TRACE_EVENT0("ServiceWorker",
765 "ServiceWorkerContextClient::OnGeofencingEvent"); 763 "ServiceWorkerContextClient::OnGeofencingEvent");
766 proxy_->dispatchGeofencingEvent( 764 proxy_->dispatchGeofencingEvent(
767 request_id, event_type, blink::WebString::fromUTF8(region_id), region); 765 request_id, event_type, blink::WebString::fromUTF8(region_id), region);
768 Send(new ServiceWorkerHostMsg_GeofencingEventFinished(GetRoutingID(), 766 Send(new ServiceWorkerHostMsg_GeofencingEventFinished(GetRoutingID(),
769 request_id)); 767 request_id));
770 } 768 }
771 769
772 void ServiceWorkerContextClient::OnCrossOriginConnectEvent(
773 int request_id,
774 const NavigatorConnectClient& client) {
775 TRACE_EVENT0("ServiceWorker",
776 "ServiceWorkerContextClient::OnCrossOriginConnectEvent");
777 blink::WebCrossOriginServiceWorkerClient web_client;
778 web_client.origin = client.origin;
779 web_client.targetURL = client.target_url;
780 web_client.clientID = client.message_port_id;
781 proxy_->dispatchCrossOriginConnectEvent(request_id, web_client);
782 }
783
784 void ServiceWorkerContextClient::OnPostMessage( 770 void ServiceWorkerContextClient::OnPostMessage(
785 const base::string16& message, 771 const base::string16& message,
786 const std::vector<TransferredMessagePort>& sent_message_ports, 772 const std::vector<TransferredMessagePort>& sent_message_ports,
787 const std::vector<int>& new_routing_ids) { 773 const std::vector<int>& new_routing_ids) {
788 TRACE_EVENT0("ServiceWorker", 774 TRACE_EVENT0("ServiceWorker",
789 "ServiceWorkerContextClient::OnPostEvent"); 775 "ServiceWorkerContextClient::OnPostEvent");
790 blink::WebMessagePortChannelArray ports = 776 blink::WebMessagePortChannelArray ports =
791 WebMessagePortChannelImpl::CreatePorts( 777 WebMessagePortChannelImpl::CreatePorts(
792 sent_message_ports, new_routing_ids, 778 sent_message_ports, new_routing_ids,
793 main_thread_task_runner_); 779 main_thread_task_runner_);
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 } 957 }
972 958
973 base::WeakPtr<ServiceWorkerContextClient> 959 base::WeakPtr<ServiceWorkerContextClient>
974 ServiceWorkerContextClient::GetWeakPtr() { 960 ServiceWorkerContextClient::GetWeakPtr() {
975 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 961 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
976 DCHECK(context_); 962 DCHECK(context_);
977 return context_->weak_factory.GetWeakPtr(); 963 return context_->weak_factory.GetWeakPtr();
978 } 964 }
979 965
980 } // namespace content 966 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698