service_worker_message_filter.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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 "base/message_loop/message_loop_proxy.h"
8#include "content/child/service_worker/service_worker_dispatcher.h"
9#include "content/child/thread_safe_sender.h"
10#include "content/child/worker_thread_task_runner.h"
11#include "content/common/service_worker/service_worker_messages.h"
12#include "ipc/ipc_message_macros.h"
13
14namespace content {
15
16ServiceWorkerMessageFilter::ServiceWorkerMessageFilter(ThreadSafeSender* sender)
17    : main_thread_loop_proxy_(base::MessageLoopProxy::current()),
18      thread_safe_sender_(sender) {}
19
20ServiceWorkerMessageFilter::~ServiceWorkerMessageFilter() {}
21
22base::TaskRunner* ServiceWorkerMessageFilter::OverrideTaskRunnerForMessage(
23    const IPC::Message& msg) {
24  if (IPC_MESSAGE_CLASS(msg) != ServiceWorkerMsgStart)
25    return NULL;
26  int ipc_thread_id = 0;
27  const bool success = PickleIterator(msg).ReadInt(&ipc_thread_id);
28  DCHECK(success);
29  if (!ipc_thread_id)
30    return main_thread_loop_proxy_.get();
31  return new WorkerThreadTaskRunner(ipc_thread_id);
32}
33
34bool ServiceWorkerMessageFilter::OnMessageReceived(const IPC::Message& msg) {
35  if (IPC_MESSAGE_CLASS(msg) != ServiceWorkerMsgStart)
36    return false;
37  ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(
38      thread_safe_sender_.get())->OnMessageReceived(msg);
39  return true;
40}
41
42void ServiceWorkerMessageFilter::OnStaleMessageReceived(
43    const IPC::Message& msg) {
44  // Specifically handle some messages in case we failed to post task
45  // to the thread (meaning that the context on the thread is now gone).
46  IPC_BEGIN_MESSAGE_MAP(ServiceWorkerMessageFilter, msg)
47    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered,
48                        OnStaleRegistered)
49  IPC_END_MESSAGE_MAP()
50}
51
52void ServiceWorkerMessageFilter::OnStaleRegistered(
53    int32 thread_id,
54    int32 request_id,
55    const ServiceWorkerObjectInfo& info) {
56  // Inform the browser that the context seems to have been destroyed
57  // (so that it can delete the corresponding ServiceWorker handle).
58  thread_safe_sender_->Send(
59      new ServiceWorkerHostMsg_ServiceWorkerObjectDestroyed(info.handle_id));
60}
61
62}  // namespace content
63