Chromium Code Reviews| Index: content/renderer/service_worker/service_worker_context_client.cc |
| diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..3dbd314dec201ae9559e4024a15165bea2113c76 |
| --- /dev/null |
| +++ b/content/renderer/service_worker/service_worker_context_client.cc |
| @@ -0,0 +1,92 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/renderer/service_worker/service_worker_context_client.h" |
| + |
| +#include "base/lazy_instance.h" |
| +#include "base/message_loop/message_loop_proxy.h" |
| +#include "base/pickle.h" |
| +#include "base/threading/thread_local.h" |
| +#include "content/child/thread_safe_sender.h" |
| +#include "content/renderer/render_thread_impl.h" |
| +#include "content/renderer/service_worker/embedded_worker_dispatcher.h" |
| +#include "ipc/ipc_message_macros.h" |
| +#include "third_party/WebKit/public/platform/WebString.h" |
| +#include "webkit/child/worker_task_runner.h" |
| + |
| +using webkit_glue::WorkerTaskRunner; |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +// For now client must be a per-thread instance. |
| +// TODO(kinuko): This needs to be refactored when we start using thread pool |
| +// or having multiple clients per one thread. |
| +base::LazyInstance<base::ThreadLocalPointer<ServiceWorkerContextClient> >:: |
| + Leaky g_worker_client_tls = LAZY_INSTANCE_INITIALIZER; |
| + |
| +void CallWorkerContextDestroyedOnMainThread(int embedded_worker_id) { |
| + if (!RenderThreadImpl::current() || |
| + !RenderThreadImpl::current()->embedded_worker_dispatcher()) |
| + return; |
| + RenderThreadImpl::current()->embedded_worker_dispatcher()-> |
| + WorkerContextDestroyed(embedded_worker_id); |
| +} |
| + |
| +} // namespace |
| + |
| +ServiceWorkerContextClient* |
| +ServiceWorkerContextClient::ThreadSpecificInstance() { |
| + return g_worker_client_tls.Pointer()->Get(); |
| +} |
| + |
| +ServiceWorkerContextClient::ServiceWorkerContextClient( |
| + int32 embedded_worker_id, |
| + int64 service_worker_version_id, |
| + const GURL& script_url) |
| + : embedded_worker_id_(embedded_worker_id), |
| + service_worker_version_id_(service_worker_version_id), |
| + script_url_(script_url), |
| + sender_(ChildThread::current()->thread_safe_sender()), |
| + main_thread_proxy_(base::MessageLoopProxy::current()), |
| + proxy_(NULL) { |
| +} |
| + |
| +ServiceWorkerContextClient::~ServiceWorkerContextClient() { |
| + DCHECK(g_worker_client_tls.Pointer()->Get() != NULL); |
| + g_worker_client_tls.Pointer()->Set(NULL); |
| +} |
| + |
| +void ServiceWorkerContextClient::OnMessageReceived( |
| + const IPC::Message& msg) { |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void ServiceWorkerContextClient::workerContextStarted( |
| + blink::WebServiceWorkerContextProxy* proxy) { |
| + DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId()); |
| + DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); |
| + g_worker_client_tls.Pointer()->Set(this); |
| + proxy_ = proxy; |
| + |
| + // TODO(kinuko): Send WorkerStarted message to the browser with the |
| + // current thread ID so that the browser can start sending embedded worker |
| + // messages directly to this client. |
|
michaeln
2013/11/13 00:31:37
i guess you mean messages for this likes of oninst
kinuko
2013/11/18 14:09:48
Yep.
|
| +} |
| + |
| +void ServiceWorkerContextClient::workerContextClosed() { |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +void ServiceWorkerContextClient::workerContextDestroyed() { |
| + DCHECK_NE(0, WorkerTaskRunner::Instance()->CurrentWorkerId()); |
| + proxy_ = NULL; |
| + main_thread_proxy_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&CallWorkerContextDestroyedOnMainThread, |
| + embedded_worker_id_)); |
| +} |
| + |
| +} // namespace content |