summaryrefslogtreecommitdiffstats
path: root/ipc/ipc_channel_proxy.cc
diff options
context:
space:
mode:
authorjdduke@chromium.org <jdduke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-21 00:13:23 +0000
committerjdduke@chromium.org <jdduke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-21 00:13:23 +0000
commitda2c4ffa21aefaecd88ad130a5272b022e44c770 (patch)
treec11cc69503961d9b673c530864b233987f2533cc /ipc/ipc_channel_proxy.cc
parent97a39a8f7d066e59f496c07dbe0c6bfeca6eaae3 (diff)
downloadchromium_src-da2c4ffa21aefaecd88ad130a5272b022e44c770.zip
chromium_src-da2c4ffa21aefaecd88ad130a5272b022e44c770.tar.gz
chromium_src-da2c4ffa21aefaecd88ad130a5272b022e44c770.tar.bz2
Revert "Allow MessageFilters to restrict listening to specific message classes"
This reverts commit 2955e4e3c747fd4aa3c227d6c4e4c698cf31b3c4. Reason for revert: Frequent crashes on Windows. BUG=345368 TBR= Review URL: https://codereview.chromium.org/165333004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@252428 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ipc/ipc_channel_proxy.cc')
-rw-r--r--ipc/ipc_channel_proxy.cc106
1 files changed, 6 insertions, 100 deletions
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc
index 776b423..3a0cf30 100644
--- a/ipc/ipc_channel_proxy.cc
+++ b/ipc/ipc_channel_proxy.cc
@@ -14,96 +14,12 @@
#include "ipc/ipc_listener.h"
#include "ipc/ipc_logging.h"
#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_message_start.h"
#include "ipc/ipc_message_utils.h"
namespace IPC {
//------------------------------------------------------------------------------
-class ChannelProxy::Context::MessageFilterRouter {
- public:
- typedef std::vector<MessageFilter*> MessageFilters;
-
- MessageFilterRouter() {}
- ~MessageFilterRouter() {}
-
- void AddFilter(MessageFilter* filter) {
- // Determine if the filter should be applied to all messages, or only
- // messages of a certain class.
- std::vector<uint32> supported_message_classes;
- if (filter->GetSupportedMessageClasses(&supported_message_classes)) {
- DCHECK(!supported_message_classes.empty());
- for (size_t i = 0; i < supported_message_classes.size(); ++i) {
- DCHECK(ValidMessageClass(supported_message_classes[i]));
- message_class_filters_[supported_message_classes[i]].push_back(filter);
- }
- } else {
- global_filters_.push_back(filter);
- }
- }
-
- void RemoveFilter(MessageFilter* filter) {
- if (RemoveFilter(global_filters_, filter))
- return;
-
- for (size_t i = 0; i < arraysize(message_class_filters_); ++i)
- RemoveFilter(message_class_filters_[i], filter);
- }
-
- bool TryFilters(const Message& message) {
- if (TryFilters(global_filters_, message))
- return true;
-
- const int message_class = IPC_MESSAGE_CLASS(message);
- if (!ValidMessageClass(message_class))
- return false;
-
- return TryFilters(message_class_filters_[message_class], message);
- }
-
- void Clear() {
- global_filters_.clear();
- for (size_t i = 0; i < arraysize(message_class_filters_); ++i)
- message_class_filters_[i].clear();
- }
-
- private:
- static bool TryFilters(MessageFilters& filters, const IPC::Message& message) {
- for (size_t i = 0; i < filters.size(); ++i) {
- if (filters[i]->OnMessageReceived(message)) {
- return true;
- }
- }
- return false;
- }
-
- static bool RemoveFilter(MessageFilters& filters, MessageFilter* filter) {
- MessageFilters::iterator it =
- std::find(filters.begin(), filters.end(), filter);
- if (it == filters.end())
- return false;
-
- filters.erase(it);
- return true;
- }
-
- static bool ValidMessageClass(int message_class) {
- return message_class >= 0 && message_class < LastIPCMsgStart;
- }
-
- // List of global and selective filters; a given filter will exist in either
- // |message_global_filters_| OR |message_class_filters_|, but not both.
- // Note that |message_global_filters_| will be given first offering of any
- // given message. It's the filter implementer and installer's
- // responsibility to ensure that a filter is either global or selective to
- // ensure proper message filtering order.
- MessageFilters global_filters_;
- MessageFilters message_class_filters_[LastIPCMsgStart];
-};
-
-//------------------------------------------------------------------------------
-
ChannelProxy::MessageFilter::MessageFilter() {}
void ChannelProxy::MessageFilter::OnFilterAdded(Channel* channel) {}
@@ -120,11 +36,6 @@ bool ChannelProxy::MessageFilter::OnMessageReceived(const Message& message) {
return false;
}
-bool ChannelProxy::MessageFilter::GetSupportedMessageClasses(
- std::vector<uint32>* /*supported_message_classes*/) const {
- return false;
-}
-
ChannelProxy::MessageFilter::~MessageFilter() {}
//------------------------------------------------------------------------------
@@ -135,7 +46,6 @@ ChannelProxy::Context::Context(Listener* listener,
listener_(listener),
ipc_task_runner_(ipc_task_runner),
channel_connected_called_(false),
- message_filter_router_(new MessageFilterRouter()),
peer_pid_(base::kNullProcessId) {
DCHECK(ipc_task_runner_.get());
}
@@ -155,19 +65,20 @@ void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle,
}
bool ChannelProxy::Context::TryFilters(const Message& message) {
- DCHECK(message_filter_router_);
#ifdef IPC_MESSAGE_LOG_ENABLED
Logging* logger = Logging::GetInstance();
if (logger->Enabled())
logger->OnPreDispatchMessage(message);
#endif
- if (message_filter_router_->TryFilters(message)) {
+ for (size_t i = 0; i < filters_.size(); ++i) {
+ if (filters_[i]->OnMessageReceived(message)) {
#ifdef IPC_MESSAGE_LOG_ENABLED
- if (logger->Enabled())
- logger->OnPostDispatchMessage(message, channel_id_);
+ if (logger->Enabled())
+ logger->OnPostDispatchMessage(message, channel_id_);
#endif
- return true;
+ return true;
+ }
}
return false;
}
@@ -246,7 +157,6 @@ void ChannelProxy::Context::OnChannelClosed() {
// We don't need the filters anymore.
filters_.clear();
- message_filter_router_->Clear();
channel_.reset();
@@ -280,8 +190,6 @@ void ChannelProxy::Context::OnAddFilter() {
for (size_t i = 0; i < new_filters.size(); ++i) {
filters_.push_back(new_filters[i]);
- message_filter_router_->AddFilter(new_filters[i].get());
-
// If the channel has already been created, then we need to send this
// message so that the filter gets access to the Channel.
if (channel_.get())
@@ -297,8 +205,6 @@ void ChannelProxy::Context::OnRemoveFilter(MessageFilter* filter) {
if (!channel_.get())
return; // The filters have already been deleted.
- message_filter_router_->RemoveFilter(filter);
-
for (size_t i = 0; i < filters_.size(); ++i) {
if (filters_[i].get() == filter) {
filter->OnFilterRemoved();