Index: chrome/browser/browser_message_filter.cc |
=================================================================== |
--- chrome/browser/browser_message_filter.cc (revision 68139) |
+++ chrome/browser/browser_message_filter.cc (working copy) |
@@ -2,40 +2,87 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/browser_io_message_filter.h" |
+#include "chrome/browser/browser_message_filter.h" |
#include "base/logging.h" |
+#include "base/process.h" |
#include "base/process_util.h" |
#include "chrome/browser/renderer_host/browser_render_process_host.h" |
-BrowserIOMessageFilter::BrowserIOMessageFilter() : channel_(NULL) { |
+BrowserMessageFilter::BrowserMessageFilter() |
+ : channel_(NULL), peer_handle_(base::kNullProcessHandle) { |
} |
-BrowserIOMessageFilter::~BrowserIOMessageFilter() { |
+BrowserMessageFilter::~BrowserMessageFilter() { |
} |
-void BrowserIOMessageFilter::OnFilterAdded(IPC::Channel* channel) { |
+void BrowserMessageFilter::OnFilterAdded(IPC::Channel* channel) { |
channel_ = channel; |
} |
-void BrowserIOMessageFilter::OnChannelClosing() { |
+void BrowserMessageFilter::OnChannelClosing() { |
channel_ = NULL; |
} |
-void BrowserIOMessageFilter::OnChannelConnected(int32 peer_pid) { |
+void BrowserMessageFilter::OnChannelConnected(int32 peer_pid) { |
if (!base::OpenProcessHandle(peer_pid, &peer_handle_)) { |
NOTREACHED(); |
} |
} |
-bool BrowserIOMessageFilter::Send(IPC::Message* msg) { |
+bool BrowserMessageFilter::Send(IPC::Message* message) { |
+ if (message->is_sync()) { |
+ // We don't support sending synchronous messages from the browser. If we |
+ // really needed it, we can make this class derive from SyncMessageFilter |
+ // but it seems better to not allow sending synchronous messages from the |
+ // browser, since it might allow a corrupt/malicious renderer to hang us. |
+ NOTREACHED() << "Can't send sync message through BrowserMessageFilter!"; |
+ return false; |
+ } |
+ |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ NewRunnableMethod(this, &BrowserMessageFilter::Send, message)); |
+ return true; |
+ } |
+ |
if (channel_) |
- return channel_->Send(msg); |
+ return channel_->Send(message); |
- delete msg; |
+ delete message; |
return false; |
} |
-void BrowserIOMessageFilter::BadMessageReceived(uint32 msg_type) { |
+void BrowserMessageFilter::OverrideThreadForMessage(const IPC::Message& message, |
+ BrowserThread::ID* thread) { |
+} |
+ |
+bool BrowserMessageFilter::OnMessageReceived(const IPC::Message& message) { |
+ BrowserThread::ID thread = BrowserThread::IO; |
+ OverrideThreadForMessage(message, &thread); |
+ if (thread == BrowserThread::IO) |
+ return DispatchMessage(message); |
+ |
+ BrowserThread::PostTask( |
+ thread, FROM_HERE, |
+ NewRunnableMethod( |
+ this, &BrowserMessageFilter::DispatchMessage, message)); |
+ return true; |
+} |
+ |
+bool BrowserMessageFilter::DispatchMessage(const IPC::Message& message) { |
+ bool message_was_ok = true; |
+ bool rv = OnMessageReceived(message, &message_was_ok); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) << |
+ "Must handle messages that were dispatched to another thread!"; |
+ if (!message_was_ok) |
+ BadMessageReceived(message.type()); |
+ |
+ return rv; |
+} |
+ |
+void BrowserMessageFilter::BadMessageReceived(uint32 msg_type) { |
BrowserRenderProcessHost::BadMessageTerminateProcess(msg_type, peer_handle()); |
} |