1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CONTENT_CHILD_CROSS_MESSAGE_FILTER_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CONTENT_CHILD_CROSS_MESSAGE_FILTER_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ipc/ipc_channel_proxy.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base { 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TaskRunner; 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content { 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ThreadSafeSender; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A base class for implementing IPC MessageFilter's that run on a different 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// thread or TaskRunner than the main thread. 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ChildMessageFilter 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : public base::RefCountedThreadSafe<ChildMessageFilter>, 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public IPC::Sender { 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // IPC::Sender implementation. Can be called on any threads. 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool Send(IPC::Message* message) OVERRIDE; 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If implementers want to run OnMessageReceived on a different task 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // runner it should override this and return the TaskRunner for the message. 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returning NULL runs OnMessageReceived() on the current IPC thread. 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual base::TaskRunner* OverrideTaskRunnerForMessage( 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const IPC::Message& msg) = 0; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If OverrideTaskRunnerForMessage is overriden and returns non-null 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // this will be called on the returned TaskRunner. 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& msg) = 0; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This method is called when WorkerTaskRunner::PostTask() returned false 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // for the target thread. Note that there's still a little chance that 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // PostTask() returns true but OnMessageReceived() is never called on the 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // target thread. By default this does nothing. 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnStaleMessageReceived(const IPC::Message& msg) {} 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ChildMessageFilter(); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~ChildMessageFilter(); 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class Internal; 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class ChildThread; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class RenderThreadImpl; 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class WorkerThread; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class base::RefCountedThreadSafe<ChildMessageFilter>; 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IPC::ChannelProxy::MessageFilter* GetFilter(); 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This implements IPC::ChannelProxy::MessageFilter to hide the actual 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // filter methods from child classes. 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Internal* internal_; 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<ThreadSafeSender> thread_safe_sender_; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChildMessageFilter); 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace content 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // CONTENT_CHILD_CROSS_MESSAGE_FILTER_H_ 69