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