15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
1158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/kill.h"
1258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process_handle.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/browser_child_process_host_impl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/content_switches.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_message.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserMessageFilter;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass BrowserMessageFilter::Internal : public IPC::MessageFilter {
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  explicit Internal(BrowserMessageFilter* filter) : filter_(filter) {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~Internal() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // IPC::MessageFilter implementation:
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE {
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    filter_->sender_ = sender;
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    filter_->OnFilterAdded(sender);
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnFilterRemoved() OVERRIDE {
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    filter_->OnFilterRemoved();
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnChannelClosing() OVERRIDE {
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    filter_->sender_ = NULL;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    filter_->OnChannelClosing();
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnChannelConnected(int32 peer_pid) OVERRIDE {
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    filter_->peer_pid_ = peer_pid;
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    filter_->OnChannelConnected(peer_pid);
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::ID thread = BrowserThread::IO;
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    filter_->OverrideThreadForMessage(message, &thread);
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (thread == BrowserThread::IO) {
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scoped_refptr<base::TaskRunner> runner =
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          filter_->OverrideTaskRunnerForMessage(message);
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (runner.get()) {
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        runner->PostTask(
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            FROM_HERE,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            base::Bind(
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                base::IgnoreResult(&Internal::DispatchMessage), this, message));
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return true;
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return DispatchMessage(message);
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (thread == BrowserThread::UI &&
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !BrowserMessageFilter::CheckCanDispatchOnUI(message, filter_.get())) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::PostTask(
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        thread, FROM_HERE,
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::Bind(
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            base::IgnoreResult(&Internal::DispatchMessage), this, message));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetSupportedMessageClasses(
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::vector<uint32>* supported_message_classes) const OVERRIDE {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    supported_message_classes->assign(
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        filter_->message_classes_to_filter().begin(),
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        filter_->message_classes_to_filter().end());
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Dispatches a message to the derived class.
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool DispatchMessage(const IPC::Message& message) {
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool rv = filter_->OnMessageReceived(message);
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) <<
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        "Must handle messages that were dispatched to another thread!";
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return rv;
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<BrowserMessageFilter> filter_;
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Internal);
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserMessageFilter::BrowserMessageFilter(uint32 message_class_to_filter)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : internal_(NULL),
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      sender_(NULL),
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      peer_handle_(base::kNullProcessHandle),
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      peer_pid_(base::kNullProcessId),
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      message_classes_to_filter_(1, message_class_to_filter) {}
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserMessageFilter::BrowserMessageFilter(
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const uint32* message_classes_to_filter,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    size_t num_message_classes_to_filter)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : internal_(NULL),
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      sender_(NULL),
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      peer_handle_(base::kNullProcessHandle),
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      peer_pid_(base::kNullProcessId),
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      message_classes_to_filter_(
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          message_classes_to_filter,
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          message_classes_to_filter + num_message_classes_to_filter) {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(num_message_classes_to_filter);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::ProcessHandle BrowserMessageFilter::PeerHandle() {
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN)
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::AutoLock lock(peer_handle_lock_);
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (peer_handle_ == base::kNullProcessHandle)
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::OpenPrivilegedProcessHandle(peer_pid_, &peer_handle_);
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return peer_handle_;
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::ProcessHandle result = base::kNullProcessHandle;
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::OpenPrivilegedProcessHandle(peer_pid_, &result);
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return result;
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserMessageFilter::OnDestruct() const {
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  delete this;
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserMessageFilter::Send(IPC::Message* message) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message->is_sync()) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't support sending synchronous messages from the browser.  If we
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // really needed it, we can make this class derive from SyncMessageFilter
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // but it seems better to not allow sending synchronous messages from the
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // browser, since it might allow a corrupt/malicious renderer to hang us.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Can't send sync message through BrowserMessageFilter!";
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(base::IgnoreResult(&BrowserMessageFilter::Send), this,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   message));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (sender_)
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return sender_->Send(message);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete message;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TaskRunner* BrowserMessageFilter::OverrideTaskRunnerForMessage(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserMessageFilter::CheckCanDispatchOnUI(const IPC::Message& message,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                IPC::Sender* sender) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Windows there's a potential deadlock with sync messsages going in
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a circle from browser -> plugin -> renderer -> browser.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Linux we can avoid this by avoiding sync messages from browser->plugin.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac we avoid this by not supporting windowed plugins.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message.is_sync() && !message.is_caller_pumping_messages()) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: IF YOU HIT THIS ASSERT, THE SOLUTION IS ALMOST NEVER TO RUN A
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NESTED MESSAGE LOOP IN THE RENDERER!!!
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // That introduces reentrancy which causes hard to track bugs.  You should
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // find a way to either turn this into an asynchronous message, or one
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that can be answered on the IO thread.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Can't send sync messages to UI thread without pumping "
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "messages in the renderer or else deadlocks can occur if the page "
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "has windowed plugins! (message type " << message.type() << ")";
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reply->set_reply_error();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sender->Send(reply);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserMessageFilter::BadMessageReceived() {
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (command_line->HasSwitch(switches::kDisableKillAfterBadIPC))
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserChildProcessHostImpl::HistogramBadMessageTerminated(
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      PROCESS_TYPE_RENDERER);
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::KillProcess(PeerHandle(), content::RESULT_CODE_KILLED_BAD_MESSAGE,
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    false);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserMessageFilter::~BrowserMessageFilter() {
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN)
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (peer_handle_ != base::kNullProcessHandle)
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::CloseProcessHandle(peer_handle_);
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIPC::MessageFilter* BrowserMessageFilter::GetFilter() {
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We create this on demand so that if a filter is used in a unit test but
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // never attached to a channel, we don't leak Internal and this;
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!internal_) << "Should only be called once.";
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  internal_ = new Internal(this);
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return internal_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
228