Index: chrome/browser/browser_message_filter.h |
=================================================================== |
--- chrome/browser/browser_message_filter.h (revision 68139) |
+++ chrome/browser/browser_message_filter.h (working copy) |
@@ -2,39 +2,63 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef CHROME_BROWSER_BROWSER_IO_MESSAGE_FILTER_H_ |
-#define CHROME_BROWSER_BROWSER_IO_MESSAGE_FILTER_H_ |
+#ifndef CHROME_BROWSER_BROWSER_MESSAGE_FILTER_H_ |
+#define CHROME_BROWSER_BROWSER_MESSAGE_FILTER_H_ |
#pragma once |
#include "base/process.h" |
+#include "chrome/browser/browser_thread.h" |
#include "ipc/ipc_channel_proxy.h" |
-// Base class for message filters in the browser process that reside on the IO |
-// thread. |
-class BrowserIOMessageFilter : public IPC::ChannelProxy::MessageFilter, |
- public IPC::Message::Sender { |
+// Base class for message filters in the browser process. You can receive and |
+// send messages on any thread. |
+class BrowserMessageFilter : public IPC::ChannelProxy::MessageFilter, |
+ public IPC::Message::Sender { |
public: |
- BrowserIOMessageFilter(); |
- virtual ~BrowserIOMessageFilter(); |
+ BrowserMessageFilter(); |
+ virtual ~BrowserMessageFilter(); |
// IPC::ChannelProxy::MessageFilter methods. If you override them, make sure |
- // to call them as well. |
+ // to call them as well. These are always called on the IO thread. |
virtual void OnFilterAdded(IPC::Channel* channel); |
virtual void OnChannelClosing(); |
virtual void OnChannelConnected(int32 peer_pid); |
+ // DON'T OVERRIDE THIS! Override the other version below. |
+ virtual bool OnMessageReceived(const IPC::Message& message); |
- // IPC::Message::Sender implementation: |
- virtual bool Send(IPC::Message* msg); |
+ // IPC::Message::Sender implementation. Can be called on any thread. Can't |
+ // send sync messages (since we don't want to block the browser on any other |
+ // process). |
+ virtual bool Send(IPC::Message* message); |
+ // If you want the given message to be dispatched to your OnMessageReceived on |
+ // a different thread, change |thread| to the id of the target thread. |
+ // If you don't handle this message, or want to keep it on the IO thread, do |
+ // nothing. |
+ virtual void OverrideThreadForMessage(const IPC::Message& message, |
+ BrowserThread::ID* thread); |
+ |
+ // Override this to receive messages. |
+ // Your function will normally be called on the IO thread. However, if your |
+ // OverrideThreadForMessage modifies the thread used to dispatch the message, |
+ // your function will be called on the requested thread. |
+ virtual bool OnMessageReceived(const IPC::Message& message, |
+ bool* message_was_ok) = 0; |
+ |
protected: |
+ // Can be called on any thread, after OnChannelConnected is called. |
base::ProcessHandle peer_handle() { return peer_handle_; } |
// Call this if a message couldn't be deserialized. This kills the renderer. |
+ // Can be called on any thread. |
void BadMessageReceived(uint32 msg_type); |
private: |
+ // Dispatches a message to the derived class. |
+ bool DispatchMessage(const IPC::Message& message); |
+ |
IPC::Channel* channel_; |
base::ProcessHandle peer_handle_; |
}; |
-#endif // CHROME_BROWSER_BROWSER_IO_MESSAGE_FILTER_H_ |
+#endif // CHROME_BROWSER_BROWSER_MESSAGE_FILTER_H_ |