- add sources.
[platform/framework/web/crosswalk.git] / src / content / child / service_worker / service_worker_message_filter.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/child/service_worker/service_worker_message_filter.h"
6
7 #include "ipc/ipc_message_macros.h"
8 #include "base/bind.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "base/pickle.h"
11 #include "content/child/service_worker/service_worker_dispatcher.h"
12 #include "content/child/thread_safe_sender.h"
13 #include "webkit/child/worker_task_runner.h"
14
15 using webkit_glue::WorkerTaskRunner;
16
17 namespace content {
18
19 ServiceWorkerMessageFilter::ServiceWorkerMessageFilter(ThreadSafeSender* sender)
20     : main_thread_loop_proxy_(base::MessageLoopProxy::current()),
21       thread_safe_sender_(sender) {}
22
23 ServiceWorkerMessageFilter::~ServiceWorkerMessageFilter() {}
24
25 bool ServiceWorkerMessageFilter::OnMessageReceived(const IPC::Message& msg) {
26   if (IPC_MESSAGE_CLASS(msg) != ServiceWorkerMsgStart)
27     return false;
28   int thread_id = 0;
29   bool result = PickleIterator(msg).ReadInt(&thread_id);
30   DCHECK(result);
31   base::Closure closure =
32       base::Bind(&ServiceWorkerMessageFilter::DispatchMessage, this, msg);
33   if (!thread_id) {
34     main_thread_loop_proxy_->PostTask(FROM_HERE, closure);
35     return true;
36   }
37   WorkerTaskRunner::Instance()->PostTask(thread_id, closure);
38   return true;
39 }
40
41 void ServiceWorkerMessageFilter::DispatchMessage(const IPC::Message& msg) {
42   ServiceWorkerDispatcher::ThreadSpecificInstance(thread_safe_sender_.get())
43       ->OnMessageReceived(msg);
44 }
45
46 }  // namespace content