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