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

Unified Diff: content/public/browser/browser_message_filter.cc

Issue 24514003: Make BrowserMessageFilter not derive from IPC::ChannelProxy::MessageFilter. This allows us to hide … (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 3 months 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 side-by-side diff with in-line comments
Download patch
Index: content/public/browser/browser_message_filter.cc
===================================================================
--- content/public/browser/browser_message_filter.cc (revision 225319)
+++ content/public/browser/browser_message_filter.cc (working copy)
@@ -18,52 +18,88 @@
namespace content {
-BrowserMessageFilter::BrowserMessageFilter()
- : channel_(NULL),
-#if defined(OS_WIN)
- peer_handle_(base::kNullProcessHandle),
-#endif
- peer_pid_(base::kNullProcessId) {
-}
+class BrowserMessageFilter::Internal : public IPC::ChannelProxy::MessageFilter {
+ public:
+ explicit Internal(BrowserMessageFilter* filter) : filter_(filter) {
+ }
-void BrowserMessageFilter::OnFilterAdded(IPC::Channel* channel) {
- channel_ = channel;
-}
+ private:
+ virtual ~Internal() {
+ filter_->internal_ = NULL;
scherkus (not reviewing) 2013/09/26 19:57:37 sanity check: this should be fine since GetFilter(
jam 2013/09/26 20:22:39 (removed now that I changed the lifetime)
+ }
-void BrowserMessageFilter::OnChannelClosing() {
- channel_ = NULL;
-}
+ // IPC::ChannelProxy::MessageFilter implementation:
+ virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE {
+ filter_->channel_ = channel;
+ filter_->OnFilterAdded(channel);
+ }
-void BrowserMessageFilter::OnChannelConnected(int32 peer_pid) {
- peer_pid_ = peer_pid;
-}
+ virtual void OnFilterRemoved() OVERRIDE {
+ filter_->OnFilterRemoved();
+ }
-bool BrowserMessageFilter::OnMessageReceived(const IPC::Message& message) {
- BrowserThread::ID thread = BrowserThread::IO;
- OverrideThreadForMessage(message, &thread);
+ virtual void OnChannelClosing() OVERRIDE {
+ filter_->channel_ = NULL;
+ filter_->OnChannelClosing();
+ }
- if (thread == BrowserThread::IO) {
- scoped_refptr<base::TaskRunner> runner =
- OverrideTaskRunnerForMessage(message);
- if (runner.get()) {
- runner->PostTask(
- FROM_HERE,
- base::Bind(base::IgnoreResult(&BrowserMessageFilter::DispatchMessage),
- this,
- message));
+ virtual void OnChannelConnected(int32 peer_pid) OVERRIDE {
+ filter_->peer_pid_ = peer_pid;
+ filter_->OnChannelConnected(peer_pid);
+ }
+
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
+ BrowserThread::ID thread = BrowserThread::IO;
+ filter_->OverrideThreadForMessage(message, &thread);
+
+ if (thread == BrowserThread::IO) {
+ scoped_refptr<base::TaskRunner> runner =
+ filter_->OverrideTaskRunnerForMessage(message);
+ if (runner.get()) {
+ runner->PostTask(
+ FROM_HERE,
+ base::Bind(
+ base::IgnoreResult(&Internal::DispatchMessage), this, message));
+ return true;
+ }
+ return DispatchMessage(message);
+ }
+
+ if (thread == BrowserThread::UI &&
+ !BrowserMessageFilter::CheckCanDispatchOnUI(message, filter_)) {
return true;
}
- return DispatchMessage(message);
- }
- if (thread == BrowserThread::UI && !CheckCanDispatchOnUI(message, this))
+ BrowserThread::PostTask(
+ thread, FROM_HERE,
+ base::Bind(
+ base::IgnoreResult(&Internal::DispatchMessage), this, message));
scherkus (not reviewing) 2013/09/26 19:57:37 indent
jam 2013/09/26 20:22:39 Done.
return true;
+ }
- BrowserThread::PostTask(
- thread, FROM_HERE,
- base::Bind(base::IgnoreResult(&BrowserMessageFilter::DispatchMessage),
- this, message));
- return true;
+ // Dispatches a message to the derived class.
+ bool DispatchMessage(const IPC::Message& message) {
+ bool message_was_ok = true;
+ bool rv = filter_->OnMessageReceived(message, &message_was_ok);
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) <<
+ "Must handle messages that were dispatched to another thread!";
+ if (!message_was_ok) {
+ content::RecordAction(UserMetricsAction("BadMessageTerminate_BMF"));
+ filter_->BadMessageReceived();
+ }
+
+ return rv;
+ }
+
+ scoped_refptr<BrowserMessageFilter> filter_;
+};
scherkus (not reviewing) 2013/09/26 19:57:37 DISALLOW ?
jam 2013/09/26 20:22:39 Done.
+
+BrowserMessageFilter::BrowserMessageFilter()
+ : internal_(new Internal(this)), channel_(NULL),
scherkus (not reviewing) 2013/09/26 19:57:37 I believe we'll leak internal_ if someone creates
jam 2013/09/26 20:22:39 good point, I didn't consider that.
+#if defined(OS_WIN)
+ peer_handle_(base::kNullProcessHandle),
+#endif
+ peer_pid_(base::kNullProcessId) {
}
base::ProcessHandle BrowserMessageFilter::PeerHandle() {
@@ -80,6 +116,11 @@
#endif
}
+
+void BrowserMessageFilter::OnDestruct() const {
+ delete this;
+}
+
bool BrowserMessageFilter::Send(IPC::Message* message) {
if (message->is_sync()) {
// We don't support sending synchronous messages from the browser. If we
@@ -106,10 +147,6 @@
return false;
}
-void BrowserMessageFilter::OverrideThreadForMessage(const IPC::Message& message,
- BrowserThread::ID* thread) {
-}
-
base::TaskRunner* BrowserMessageFilter::OverrideTaskRunnerForMessage(
const IPC::Message& message) {
return NULL;
@@ -152,17 +189,8 @@
#endif
}
-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) {
- content::RecordAction(UserMetricsAction("BadMessageTerminate_BMF"));
- BadMessageReceived();
- }
-
- return rv;
+IPC::ChannelProxy::MessageFilter* BrowserMessageFilter::GetFilter() {
+ return internal_;
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698