Index: content/public/browser/browser_message_filter.cc |
diff --git a/content/public/browser/browser_message_filter.cc b/content/public/browser/browser_message_filter.cc |
index 377cfb79d35b66f10b22b85d0e8d126db7b5dc24..89d871557b58a1c4101fd02a019c983c11e7fd2b 100644 |
--- a/content/public/browser/browser_message_filter.cc |
+++ b/content/public/browser/browser_message_filter.cc |
@@ -12,6 +12,7 @@ |
#include "base/process/process_handle.h" |
#include "base/task_runner.h" |
#include "content/browser/browser_child_process_host_impl.h" |
+#include "content/browser/browser_message_filter_peer.h" |
#include "content/public/browser/user_metrics.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/common/result_codes.h" |
@@ -30,23 +31,23 @@ class BrowserMessageFilter::Internal : public IPC::MessageFilter { |
virtual ~Internal() {} |
// IPC::MessageFilter implementation: |
- virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE { |
- filter_->channel_ = channel; |
- filter_->OnFilterAdded(channel); |
+ virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE { |
+ filter_->sender_ = sender; |
+ filter_->OnFilterAdded(sender); |
} |
virtual void OnFilterRemoved() OVERRIDE { |
filter_->OnFilterRemoved(); |
+ filter_->OnFilterRemovedFromHost(); |
} |
- virtual void OnChannelClosing() OVERRIDE { |
- filter_->channel_ = NULL; |
- filter_->OnChannelClosing(); |
+ virtual void OnSenderClosing() OVERRIDE { |
+ filter_->sender_ = NULL; |
+ filter_->OnSenderClosing(); |
} |
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE { |
- filter_->peer_pid_ = peer_pid; |
- filter_->OnChannelConnected(peer_pid); |
+ virtual void OnSenderConnected() OVERRIDE { |
+ filter_->OnSenderConnected(); |
} |
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
@@ -101,43 +102,22 @@ class BrowserMessageFilter::Internal : public IPC::MessageFilter { |
BrowserMessageFilter::BrowserMessageFilter(uint32 message_class_to_filter) |
: internal_(NULL), |
- channel_(NULL), |
-#if defined(OS_WIN) |
- peer_handle_(base::kNullProcessHandle), |
-#endif |
- peer_pid_(base::kNullProcessId), |
+ sender_(NULL), |
+ peer_(NULL), |
message_classes_to_filter_(1, message_class_to_filter) {} |
BrowserMessageFilter::BrowserMessageFilter( |
const uint32* message_classes_to_filter, |
size_t num_message_classes_to_filter) |
: internal_(NULL), |
- channel_(NULL), |
-#if defined(OS_WIN) |
- peer_handle_(base::kNullProcessHandle), |
-#endif |
- peer_pid_(base::kNullProcessId), |
+ sender_(NULL), |
+ peer_(NULL), |
message_classes_to_filter_( |
message_classes_to_filter, |
message_classes_to_filter + num_message_classes_to_filter) { |
DCHECK(num_message_classes_to_filter); |
} |
-base::ProcessHandle BrowserMessageFilter::PeerHandle() { |
-#if defined(OS_WIN) |
- base::AutoLock lock(peer_handle_lock_); |
- if (peer_handle_ == base::kNullProcessHandle) |
- base::OpenPrivilegedProcessHandle(peer_pid_, &peer_handle_); |
- |
- return peer_handle_; |
-#else |
- base::ProcessHandle result = base::kNullProcessHandle; |
- base::OpenPrivilegedProcessHandle(peer_pid_, &result); |
- return result; |
-#endif |
-} |
- |
- |
void BrowserMessageFilter::OnDestruct() const { |
delete this; |
} |
@@ -161,8 +141,8 @@ bool BrowserMessageFilter::Send(IPC::Message* message) { |
return true; |
} |
- if (channel_) |
- return channel_->Send(message); |
+ if (sender_) |
+ return sender_->Send(message); |
delete message; |
return false; |
@@ -199,14 +179,8 @@ bool BrowserMessageFilter::CheckCanDispatchOnUI(const IPC::Message& message, |
} |
void BrowserMessageFilter::BadMessageReceived() { |
- CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- if (command_line->HasSwitch(switches::kDisableKillAfterBadIPC)) |
- return; |
- |
- BrowserChildProcessHostImpl::HistogramBadMessageTerminated( |
- PROCESS_TYPE_RENDERER); |
- base::KillProcess(PeerHandle(), content::RESULT_CODE_KILLED_BAD_MESSAGE, |
- false); |
+ if (peer_) |
+ peer_->BadMessageReceived(); |
} |
BrowserMessageFilter::~BrowserMessageFilter() { |
@@ -218,10 +192,31 @@ BrowserMessageFilter::~BrowserMessageFilter() { |
IPC::MessageFilter* BrowserMessageFilter::GetFilter() { |
// We create this on demand so that if a filter is used in a unit test but |
- // never attached to a channel, we don't leak Internal and this; |
+ // never attached to a sender, we don't leak Internal and this; |
DCHECK(!internal_) << "Should only be called once."; |
internal_ = new Internal(this); |
return internal_; |
} |
+void BrowserMessageFilter::OnFilterAddedToHost(BrowserMessageFilterPeer* peer) { |
+ DCHECK(!peer_); |
+ peer_ = peer; |
+} |
+ |
+void BrowserMessageFilter::OnFilterRemovedFromHost() { |
+ peer_ = NULL; |
+} |
+ |
+base::ProcessHandle BrowserMessageFilter::PeerHandle() { |
+ if (!peer_) |
+ return base::kNullProcessHandle; |
+ return peer_->GetHandle(); |
+} |
+ |
+base::ProcessId BrowserMessageFilter::peer_pid() const { |
+ if (!peer_) |
+ return base::kNullProcessId; |
+ return peer_->pid(); |
+} |
+ |
} // namespace content |