Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: chrome/browser/browser_message_filter.cc

Issue 5541005: Make BrowserMessageFilter support dispatching messages on different threads. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/browser_io_message_filter.h" 5 #include "chrome/browser/browser_message_filter.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/process.h"
8 #include "base/process_util.h" 9 #include "base/process_util.h"
9 #include "chrome/browser/renderer_host/browser_render_process_host.h" 10 #include "chrome/browser/renderer_host/browser_render_process_host.h"
10 11
11 BrowserIOMessageFilter::BrowserIOMessageFilter() : channel_(NULL) { 12 BrowserMessageFilter::BrowserMessageFilter()
13 : channel_(NULL), peer_handle_(base::kNullProcessHandle) {
12 } 14 }
13 15
14 BrowserIOMessageFilter::~BrowserIOMessageFilter() { 16 BrowserMessageFilter::~BrowserMessageFilter() {
15 } 17 }
16 18
17 void BrowserIOMessageFilter::OnFilterAdded(IPC::Channel* channel) { 19 void BrowserMessageFilter::OnFilterAdded(IPC::Channel* channel) {
18 channel_ = channel; 20 channel_ = channel;
19 } 21 }
20 22
21 void BrowserIOMessageFilter::OnChannelClosing() { 23 void BrowserMessageFilter::OnChannelClosing() {
22 channel_ = NULL; 24 channel_ = NULL;
23 } 25 }
24 26
25 void BrowserIOMessageFilter::OnChannelConnected(int32 peer_pid) { 27 void BrowserMessageFilter::OnChannelConnected(int32 peer_pid) {
26 if (!base::OpenProcessHandle(peer_pid, &peer_handle_)) { 28 if (!base::OpenProcessHandle(peer_pid, &peer_handle_)) {
27 NOTREACHED(); 29 NOTREACHED();
28 } 30 }
29 } 31 }
30 32
31 bool BrowserIOMessageFilter::Send(IPC::Message* msg) { 33 bool BrowserMessageFilter::Send(IPC::Message* message) {
34 if (message->is_sync()) {
35 // We don't support sending synchronous messages from the browser. If we
36 // really needed it, we can make this class derive from SyncMessageFilter
37 // but it seems better to not allow sending synchronous messages from the
38 // browser, since it might allow a corrupt/malicious renderer to hang us.
39 NOTREACHED() << "Can't send sync message through BrowserMessageFilter!";
40 return false;
41 }
42
43 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
44 BrowserThread::PostTask(
45 BrowserThread::IO,
46 FROM_HERE,
47 NewRunnableMethod(this, &BrowserMessageFilter::Send, message));
48 return true;
49 }
50
32 if (channel_) 51 if (channel_)
33 return channel_->Send(msg); 52 return channel_->Send(message);
34 53
35 delete msg; 54 delete message;
36 return false; 55 return false;
37 } 56 }
38 57
39 void BrowserIOMessageFilter::BadMessageReceived(uint32 msg_type) { 58 bool BrowserMessageFilter::ShouldHandleMessageOnThread(
59 const IPC::Message& message,
60 BrowserThread::ID* thread) {
61 return false;
62 }
63
64 bool BrowserMessageFilter::OnMessageReceived(const IPC::Message& message) {
65 BrowserThread::ID thread = BrowserThread::IO;
66 ShouldHandleMessageOnThread(message, &thread);
Matt Perry 2010/12/09 18:20:06 You don't actually use the return value here. Migh
jam 2010/12/09 22:44:51 true, updated
67 if (thread == BrowserThread::IO)
68 return DispatchMessage(message);
69
70 BrowserThread::PostTask(
71 thread, FROM_HERE,
72 NewRunnableMethod(
73 this, &BrowserMessageFilter::DispatchMessage, message));
74 return true;
75 }
76
77 bool BrowserMessageFilter::DispatchMessage(const IPC::Message& message) {
78 bool message_was_ok = true;
79 bool rv = OnMessageReceived(message, &message_was_ok);
80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) <<
81 "Must handle messages that were dispatched to another thread!";
82 if (!message_was_ok)
83 BadMessageReceived(message.type());
84
85 return rv;
86 }
87
88 void BrowserMessageFilter::BadMessageReceived(uint32 msg_type) {
40 BrowserRenderProcessHost::BadMessageTerminateProcess(msg_type, peer_handle()); 89 BrowserRenderProcessHost::BadMessageTerminateProcess(msg_type, peer_handle());
41 } 90 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698