Make IPC::ChannelMojo's proxy task runner changeable

This CL adds an argument for listener task runner to IPC::ChannelMojo::
Create{Server,Client} so that we can have more flexible task scheduling.
Now all arguments are base::ThreadTaskRunnerHandle::Get() and this CL
doesn't change the behavior. This CL is just a preparation.

Doc: https://docs.google.com/document/d/1yOhE6-1HLb3aeNWmoa9O2LlnegWjd4awYUn2OhUL4vk/edit#
Change-Id: I2f5c70ff3af499766e7b42de8e33f13dafcefbff
Reviewed-on: https://chromium-review.googlesource.com/756821
Reviewed-by: Yuzhu Shen <[email protected]>
Reviewed-by: Ken Rockot <[email protected]>
Reviewed-by: John Abd-El-Malek <[email protected]>
Reviewed-by: Alexander Timin <[email protected]>
Commit-Queue: Hajime Hoshi <[email protected]>
Cr-Commit-Position: refs/heads/master@{#517764}
diff --git a/ipc/ipc_channel_mojo.cc b/ipc/ipc_channel_mojo.cc
index 83327ec..2dafc7b 100644
--- a/ipc/ipc_channel_mojo.cc
+++ b/ipc/ipc_channel_mojo.cc
@@ -38,14 +38,16 @@
   MojoChannelFactory(
       mojo::ScopedMessagePipeHandle handle,
       Channel::Mode mode,
-      const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner)
+      const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
+      const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner)
       : handle_(std::move(handle)),
         mode_(mode),
-        ipc_task_runner_(ipc_task_runner) {}
+        ipc_task_runner_(ipc_task_runner),
+        proxy_task_runner_(proxy_task_runner) {}
 
   std::unique_ptr<Channel> BuildChannel(Listener* listener) override {
-    return ChannelMojo::Create(
-        std::move(handle_), mode_, listener, ipc_task_runner_);
+    return ChannelMojo::Create(std::move(handle_), mode_, listener,
+                               ipc_task_runner_, proxy_task_runner_);
   }
 
   scoped_refptr<base::SingleThreadTaskRunner> GetIPCTaskRunner() override {
@@ -56,6 +58,7 @@
   mojo::ScopedMessagePipeHandle handle_;
   const Channel::Mode mode_;
   scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_;
+  scoped_refptr<base::SingleThreadTaskRunner> proxy_task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(MojoChannelFactory);
 };
@@ -81,38 +84,45 @@
     mojo::ScopedMessagePipeHandle handle,
     Mode mode,
     Listener* listener,
-    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) {
-  return base::WrapUnique(
-      new ChannelMojo(std::move(handle), mode, listener, ipc_task_runner));
+    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
+    const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner) {
+  return base::WrapUnique(new ChannelMojo(std::move(handle), mode, listener,
+                                          ipc_task_runner, proxy_task_runner));
 }
 
 // static
 std::unique_ptr<ChannelFactory> ChannelMojo::CreateServerFactory(
     mojo::ScopedMessagePipeHandle handle,
-    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) {
+    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
+    const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner) {
   return std::make_unique<MojoChannelFactory>(
-      std::move(handle), Channel::MODE_SERVER, ipc_task_runner);
+      std::move(handle), Channel::MODE_SERVER, ipc_task_runner,
+      proxy_task_runner);
 }
 
 // static
 std::unique_ptr<ChannelFactory> ChannelMojo::CreateClientFactory(
     mojo::ScopedMessagePipeHandle handle,
-    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) {
+    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
+    const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner) {
   return std::make_unique<MojoChannelFactory>(
-      std::move(handle), Channel::MODE_CLIENT, ipc_task_runner);
+      std::move(handle), Channel::MODE_CLIENT, ipc_task_runner,
+      proxy_task_runner);
 }
 
 ChannelMojo::ChannelMojo(
     mojo::ScopedMessagePipeHandle handle,
     Mode mode,
     Listener* listener,
-    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner)
+    const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
+    const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner)
     : task_runner_(ipc_task_runner),
       pipe_(handle.get()),
       listener_(listener),
       weak_factory_(this) {
   weak_ptr_ = weak_factory_.GetWeakPtr();
-  bootstrap_ = MojoBootstrap::Create(std::move(handle), mode, ipc_task_runner);
+  bootstrap_ = MojoBootstrap::Create(std::move(handle), mode, ipc_task_runner,
+                                     proxy_task_runner);
 }
 
 void ChannelMojo::ForwardMessageFromThreadSafePtr(mojo::Message message) {