Chromium Code Reviews| 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) { |
| +BrowserThread::ID BrowserMessageFilter::HandleMessageOnThread( |
| + const IPC::Message& message) { |
| + return BrowserThread::IO; |
| +} |
| + |
| +bool BrowserMessageFilter::OnMessageReceived(const IPC::Message& message) { |
| + BrowserThread::ID thread = HandleMessageOnThread(message); |
| + if (thread == BrowserThread::IO) |
| + return DispatchMessage(message); |
| + |
| + BrowserThread::PostTask( |
| + thread, FROM_HERE, |
| + NewRunnableMethod( |
| + this, &BrowserMessageFilter::DispatchMessage, message)); |
|
darin (slow to review)
2010/12/06 05:14:58
This has the side effect of generating a PostTask
jam
2010/12/06 07:24:43
Each message filter's HandleMessageOnThread should
|
| + 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()); |
| } |