Home | History | Annotate | Download | only in child
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/child/child_message_filter.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/location.h"
     10 #include "base/task_runner.h"
     11 #include "content/child/child_thread.h"
     12 #include "content/child/thread_safe_sender.h"
     13 #include "ipc/message_filter.h"
     14 
     15 namespace content {
     16 
     17 class ChildMessageFilter::Internal : public IPC::MessageFilter {
     18  public:
     19   explicit Internal(ChildMessageFilter* filter) : filter_(filter) {}
     20 
     21   virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE {
     22     scoped_refptr<base::TaskRunner> runner =
     23         filter_->OverrideTaskRunnerForMessage(msg);
     24     if (runner.get() && !runner->RunsTasksOnCurrentThread()) {
     25       if (!runner->PostTask(
     26               FROM_HERE,
     27               base::Bind(
     28                   base::IgnoreResult(&ChildMessageFilter::OnMessageReceived),
     29                   filter_, msg)))
     30         filter_->OnStaleMessageReceived(msg);
     31       return true;
     32     }
     33 
     34     return filter_->OnMessageReceived(msg);
     35   }
     36 
     37  private:
     38   virtual ~Internal() {}
     39   scoped_refptr<ChildMessageFilter> filter_;
     40 
     41   DISALLOW_COPY_AND_ASSIGN(Internal);
     42 };
     43 
     44 bool ChildMessageFilter::Send(IPC::Message* message) {
     45   return thread_safe_sender_->Send(message);
     46 }
     47 
     48 base::TaskRunner* ChildMessageFilter::OverrideTaskRunnerForMessage(
     49     const IPC::Message& msg) {
     50   return NULL;
     51 }
     52 
     53 ChildMessageFilter::ChildMessageFilter()
     54     : internal_(NULL),
     55       thread_safe_sender_(ChildThread::current()->thread_safe_sender()) {}
     56 
     57 ChildMessageFilter::~ChildMessageFilter() {}
     58 
     59 IPC::MessageFilter* ChildMessageFilter::GetFilter() {
     60   if (!internal_)
     61     internal_ = new Internal(this);
     62   return internal_;
     63 }
     64 
     65 }  // namespace content
     66