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/renderer/service_worker/embedded_worker_context_message_filter.h"
6
7#include "base/message_loop/message_loop_proxy.h"
8#include "content/child/child_thread.h"
9#include "content/child/thread_safe_sender.h"
10#include "content/child/worker_thread_task_runner.h"
11#include "content/renderer/service_worker/embedded_worker_context_client.h"
12#include "ipc/ipc_message_macros.h"
13
14namespace content {
15
16EmbeddedWorkerContextMessageFilter::EmbeddedWorkerContextMessageFilter()
17    : main_thread_loop_proxy_(base::MessageLoopProxy::current()),
18      thread_safe_sender_(ChildThread::current()->thread_safe_sender()) {}
19
20EmbeddedWorkerContextMessageFilter::~EmbeddedWorkerContextMessageFilter() {}
21
22base::TaskRunner*
23EmbeddedWorkerContextMessageFilter::OverrideTaskRunnerForMessage(
24    const IPC::Message& msg) {
25  if (IPC_MESSAGE_CLASS(msg) != EmbeddedWorkerContextMsgStart)
26    return NULL;
27  int ipc_thread_id = 0;
28  const bool success = PickleIterator(msg).ReadInt(&ipc_thread_id);
29  DCHECK(success);
30  if (!ipc_thread_id)
31    return main_thread_loop_proxy_.get();
32  return new WorkerThreadTaskRunner(ipc_thread_id);
33}
34
35bool EmbeddedWorkerContextMessageFilter::OnMessageReceived(
36    const IPC::Message& msg) {
37  if (IPC_MESSAGE_CLASS(msg) != EmbeddedWorkerContextMsgStart)
38    return false;
39  EmbeddedWorkerContextClient* client =
40      EmbeddedWorkerContextClient::ThreadSpecificInstance();
41  if (!client) {
42    LOG(ERROR) << "Stray message is sent to nonexistent worker";
43    return true;
44  }
45  return client->OnMessageReceived(msg);
46}
47
48}  // namespace content
49