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

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

Issue 1223193009: WIP attempt to replace StartWorker/StopWorker IPCs with a new mojo EmbeddedWorker service. Base URL: https://chromium.googlesource.com/chromium/src.git@mojo-event-dispatching-option2
Patch Set: 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
« no previous file with comments | « content/renderer/service_worker/service_worker_context_client.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 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"
(...skipping 14 matching lines...) Expand all
25 #include "content/child/webmessageportchannel_impl.h" 25 #include "content/child/webmessageportchannel_impl.h"
26 #include "content/child/worker_task_runner.h" 26 #include "content/child/worker_task_runner.h"
27 #include "content/common/devtools_messages.h" 27 #include "content/common/devtools_messages.h"
28 #include "content/common/message_port_messages.h" 28 #include "content/common/message_port_messages.h"
29 #include "content/common/service_worker/embedded_worker_messages.h" 29 #include "content/common/service_worker/embedded_worker_messages.h"
30 #include "content/common/service_worker/service_worker_messages.h" 30 #include "content/common/service_worker/service_worker_messages.h"
31 #include "content/public/common/referrer.h" 31 #include "content/public/common/referrer.h"
32 #include "content/public/renderer/document_state.h" 32 #include "content/public/renderer/document_state.h"
33 #include "content/renderer/devtools/devtools_agent.h" 33 #include "content/renderer/devtools/devtools_agent.h"
34 #include "content/renderer/render_thread_impl.h" 34 #include "content/renderer/render_thread_impl.h"
35 #include "content/renderer/service_worker/embedded_worker_dispatcher.h" 35 #include "content/renderer/service_worker/embedded_worker_impl.h"
36 #include "content/renderer/service_worker/service_worker_type_util.h" 36 #include "content/renderer/service_worker/service_worker_type_util.h"
37 #include "ipc/ipc_message.h" 37 #include "ipc/ipc_message.h"
38 #include "ipc/ipc_message_macros.h" 38 #include "ipc/ipc_message_macros.h"
39 #include "third_party/WebKit/public/platform/WebCrossOriginServiceWorkerClient.h " 39 #include "third_party/WebKit/public/platform/WebCrossOriginServiceWorkerClient.h "
40 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h" 40 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
41 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" 41 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
42 #include "third_party/WebKit/public/platform/WebServiceWorkerClientQueryOptions. h" 42 #include "third_party/WebKit/public/platform/WebServiceWorkerClientQueryOptions. h"
43 #include "third_party/WebKit/public/platform/WebServiceWorkerRequest.h" 43 #include "third_party/WebKit/public/platform/WebServiceWorkerRequest.h"
44 #include "third_party/WebKit/public/platform/WebServiceWorkerResponse.h" 44 #include "third_party/WebKit/public/platform/WebServiceWorkerResponse.h"
45 #include "third_party/WebKit/public/platform/WebString.h" 45 #include "third_party/WebKit/public/platform/WebString.h"
46 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificati onData.h" 46 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificati onData.h"
47 #include "third_party/WebKit/public/web/WebDataSource.h" 47 #include "third_party/WebKit/public/web/WebDataSource.h"
48 #include "third_party/WebKit/public/web/WebServiceWorkerContextClient.h" 48 #include "third_party/WebKit/public/web/WebServiceWorkerContextClient.h"
49 #include "third_party/WebKit/public/web/WebServiceWorkerContextProxy.h" 49 #include "third_party/WebKit/public/web/WebServiceWorkerContextProxy.h"
50 #include "third_party/WebKit/public/web/WebServiceWorkerNetworkProvider.h" 50 #include "third_party/WebKit/public/web/WebServiceWorkerNetworkProvider.h"
51 51
52 namespace content { 52 namespace content {
53 53
54 namespace { 54 namespace {
55 55
56 // For now client must be a per-thread instance. 56 // For now client must be a per-thread instance.
57 base::LazyInstance<base::ThreadLocalPointer<ServiceWorkerContextClient>>:: 57 base::LazyInstance<base::ThreadLocalPointer<ServiceWorkerContextClient>>::
58 Leaky g_worker_client_tls = LAZY_INSTANCE_INITIALIZER; 58 Leaky g_worker_client_tls = LAZY_INSTANCE_INITIALIZER;
59 59
60 void CallWorkerContextDestroyedOnMainThread(int embedded_worker_id) {
61 if (!RenderThreadImpl::current() ||
62 !RenderThreadImpl::current()->embedded_worker_dispatcher())
63 return;
64 RenderThreadImpl::current()->embedded_worker_dispatcher()->
65 WorkerContextDestroyed(embedded_worker_id);
66 }
67
68 // We store an instance of this class in the "extra data" of the WebDataSource 60 // We store an instance of this class in the "extra data" of the WebDataSource
69 // and attach a ServiceWorkerNetworkProvider to it as base::UserData. 61 // and attach a ServiceWorkerNetworkProvider to it as base::UserData.
70 // (see createServiceWorkerNetworkProvider). 62 // (see createServiceWorkerNetworkProvider).
71 class DataSourceExtraData 63 class DataSourceExtraData
72 : public blink::WebDataSource::ExtraData, 64 : public blink::WebDataSource::ExtraData,
73 public base::SupportsUserData { 65 public base::SupportsUserData {
74 public: 66 public:
75 DataSourceExtraData() {} 67 DataSourceExtraData() {}
76 virtual ~DataSourceExtraData() {} 68 virtual ~DataSourceExtraData() {}
77 }; 69 };
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; 194 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory;
203 }; 195 };
204 196
205 ServiceWorkerContextClient* 197 ServiceWorkerContextClient*
206 ServiceWorkerContextClient::ThreadSpecificInstance() { 198 ServiceWorkerContextClient::ThreadSpecificInstance() {
207 return g_worker_client_tls.Pointer()->Get(); 199 return g_worker_client_tls.Pointer()->Get();
208 } 200 }
209 201
210 ServiceWorkerContextClient::ServiceWorkerContextClient( 202 ServiceWorkerContextClient::ServiceWorkerContextClient(
211 int embedded_worker_id, 203 int embedded_worker_id,
204 EmbeddedWorkerImpl* embedded_worker,
212 int64 service_worker_version_id, 205 int64 service_worker_version_id,
213 const GURL& service_worker_scope, 206 const GURL& service_worker_scope,
214 const GURL& script_url, 207 const GURL& script_url,
215 int worker_devtools_agent_route_id) 208 int worker_devtools_agent_route_id)
216 : embedded_worker_id_(embedded_worker_id), 209 : embedded_worker_id_(embedded_worker_id),
210 embedded_worker_(embedded_worker),
217 service_worker_version_id_(service_worker_version_id), 211 service_worker_version_id_(service_worker_version_id),
218 service_worker_scope_(service_worker_scope), 212 service_worker_scope_(service_worker_scope),
219 script_url_(script_url), 213 script_url_(script_url),
220 worker_devtools_agent_route_id_(worker_devtools_agent_route_id), 214 worker_devtools_agent_route_id_(worker_devtools_agent_route_id),
221 sender_(ChildThreadImpl::current()->thread_safe_sender()), 215 sender_(ChildThreadImpl::current()->thread_safe_sender()),
222 main_thread_task_runner_(RenderThreadImpl::current()->GetTaskRunner()), 216 main_thread_task_runner_(RenderThreadImpl::current()->GetTaskRunner()),
223 proxy_(nullptr) { 217 proxy_(nullptr) {
224 TRACE_EVENT_ASYNC_BEGIN0("ServiceWorker", 218 TRACE_EVENT_ASYNC_BEGIN0("ServiceWorker",
225 "ServiceWorkerContextClient::StartingWorkerContext", 219 "ServiceWorkerContextClient::StartingWorkerContext",
226 this); 220 this);
227 TRACE_EVENT_ASYNC_STEP_INTO0( 221 TRACE_EVENT_ASYNC_STEP_INTO0(
228 "ServiceWorker", 222 "ServiceWorker", "ServiceWorkerContextClient::StartingWorkerContext",
229 "ServiceWorkerContextClient::StartingWorkerContext", 223 this, "PrepareWorker");
230 this,
231 "PrepareWorker");
232 } 224 }
233 225
234 ServiceWorkerContextClient::~ServiceWorkerContextClient() {} 226 ServiceWorkerContextClient::~ServiceWorkerContextClient() {}
235 227
236 void ServiceWorkerContextClient::OnMessageReceived( 228 void ServiceWorkerContextClient::OnMessageReceived(
237 int thread_id, 229 int thread_id,
238 int embedded_worker_id, 230 int embedded_worker_id,
239 const IPC::Message& message) { 231 const IPC::Message& message) {
240 CHECK_EQ(embedded_worker_id_, embedded_worker_id); 232 CHECK_EQ(embedded_worker_id_, embedded_worker_id);
241 bool handled = true; 233 bool handled = true;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 309
318 void ServiceWorkerContextClient::workerReadyForInspection() { 310 void ServiceWorkerContextClient::workerReadyForInspection() {
319 Send(new EmbeddedWorkerHostMsg_WorkerReadyForInspection(embedded_worker_id_)); 311 Send(new EmbeddedWorkerHostMsg_WorkerReadyForInspection(embedded_worker_id_));
320 } 312 }
321 313
322 void ServiceWorkerContextClient::workerContextFailedToStart() { 314 void ServiceWorkerContextClient::workerContextFailedToStart() {
323 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); 315 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
324 DCHECK(!proxy_); 316 DCHECK(!proxy_);
325 317
326 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoadFailed(embedded_worker_id_)); 318 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoadFailed(embedded_worker_id_));
327 319 embedded_worker_->WorkerContextDestroyed();
328 RenderThreadImpl::current()->embedded_worker_dispatcher()->
329 WorkerContextDestroyed(embedded_worker_id_);
330 } 320 }
331 321
332 void ServiceWorkerContextClient::workerContextStarted( 322 void ServiceWorkerContextClient::workerContextStarted(
333 blink::WebServiceWorkerContextProxy* proxy) { 323 blink::WebServiceWorkerContextProxy* proxy) {
334 DCHECK(!worker_task_runner_.get()); 324 DCHECK(!worker_task_runner_.get());
335 DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId()); 325 DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId());
336 worker_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 326 worker_task_runner_ = base::ThreadTaskRunnerHandle::Get();
337 // g_worker_client_tls.Pointer()->Get() could return NULL if this context 327 // g_worker_client_tls.Pointer()->Get() could return NULL if this context
338 // gets deleted before workerContextStarted() is called. 328 // gets deleted before workerContextStarted() is called.
339 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); 329 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 // same thread. 372 // same thread.
383 context_.reset(); 373 context_.reset();
384 374
385 // This also lets the message filter stop dispatching messages to 375 // This also lets the message filter stop dispatching messages to
386 // this client. 376 // this client.
387 g_worker_client_tls.Pointer()->Set(NULL); 377 g_worker_client_tls.Pointer()->Set(NULL);
388 } 378 }
389 379
390 void ServiceWorkerContextClient::workerContextDestroyed() { 380 void ServiceWorkerContextClient::workerContextDestroyed() {
391 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); 381 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL);
392 382 embedded_worker_->WorkerContextDestroyed();
393 // Now we should be able to free the WebEmbeddedWorker container on the
394 // main thread.
395 main_thread_task_runner_->PostTask(
396 FROM_HERE,
397 base::Bind(&CallWorkerContextDestroyedOnMainThread,
398 embedded_worker_id_));
399 } 383 }
400 384
401 void ServiceWorkerContextClient::reportException( 385 void ServiceWorkerContextClient::reportException(
402 const blink::WebString& error_message, 386 const blink::WebString& error_message,
403 int line_number, 387 int line_number,
404 int column_number, 388 int column_number,
405 const blink::WebString& source_url) { 389 const blink::WebString& source_url) {
406 Send(new EmbeddedWorkerHostMsg_ReportException( 390 Send(new EmbeddedWorkerHostMsg_ReportException(
407 embedded_worker_id_, 391 embedded_worker_id_,
408 error_message, 392 error_message,
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 } 955 }
972 956
973 base::WeakPtr<ServiceWorkerContextClient> 957 base::WeakPtr<ServiceWorkerContextClient>
974 ServiceWorkerContextClient::GetWeakPtr() { 958 ServiceWorkerContextClient::GetWeakPtr() {
975 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 959 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
976 DCHECK(context_); 960 DCHECK(context_);
977 return context_->weak_factory.GetWeakPtr(); 961 return context_->weak_factory.GetWeakPtr();
978 } 962 }
979 963
980 } // namespace content 964 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/service_worker/service_worker_context_client.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698