Mojo C++ Bindings: Eliminiate unbound ThreadSafeInterfacePtr

Changes ThreadSafeInterfacePtr such that it is no longer possible
to create one which is unbound. Instead, it is now possible to
create one which will imminently be bound on a specific TaskRunner
but which is usable immediately.

Also introduces ThreadSafeForwarder as a reduced encapsulation of
thread-safe serialization and forwarding logic. This is used
to implement ThreadSafeInterfacePtrBase, as well as to support
immediate associated request forwarding on IPC::ChannelProxy in
a thread-safe manner, where the underlying AssociatedInterfacePtr
must remain owned by the channel's IPC::MessagePipeReader.

Finally, in order to facilitate IPC::Channel exposing ipc.mojom
types through its public interface, the //ipc:mojom target has
been folded into //ipc's component exports. Any prior dependents
on //ipc:mojom have been updated accordingly.

BUG=682334
R=yzshen@chromium.org
TEST=ipc_tests, mojo_public_bindings_unittests

Review-Url: https://codereview.chromium.org/2668153003
Cr-Commit-Position: refs/heads/master@{#449239}


CrOS-Libchrome-Original-Commit: a628d0b45d5ce49a035020d8d67e9cc9a562ecac
diff --git a/ipc/ipc_channel_mojo.h b/ipc/ipc_channel_mojo.h
index 215b198..d2d6880 100644
--- a/ipc/ipc_channel_mojo.h
+++ b/ipc/ipc_channel_mojo.h
@@ -21,11 +21,13 @@
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
+#include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel.h"
 #include "ipc/ipc_channel_factory.h"
 #include "ipc/ipc_export.h"
 #include "ipc/ipc_message_pipe_reader.h"
 #include "ipc/ipc_mojo_bootstrap.h"
+#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
 #include "mojo/public/cpp/system/core.h"
 
 namespace IPC {
@@ -42,7 +44,6 @@
 class IPC_EXPORT ChannelMojo
     : public Channel,
       public Channel::AssociatedInterfaceSupport,
-      public NON_EXPORTED_BASE(MojoBootstrap::Delegate),
       public NON_EXPORTED_BASE(internal::MessagePipeReader::Delegate) {
  public:
   // Creates a ChannelMojo.
@@ -84,10 +85,6 @@
       Message* message,
       base::Optional<std::vector<mojom::SerializedHandlePtr>>* handles);
 
-  // MojoBootstrapDelegate implementation
-  void OnPipesAvailable(mojom::ChannelAssociatedPtr sender,
-                        mojom::ChannelAssociatedRequest receiver) override;
-
   // MessagePipeReader::Delegate
   void OnPeerPidReceived(int32_t peer_pid) override;
   void OnMessageReceived(const Message& message) override;
@@ -103,8 +100,15 @@
       Listener* listener,
       const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner);
 
+  void ForwardMessageFromThreadSafePtr(mojo::Message message);
+  void ForwardMessageWithResponderFromThreadSafePtr(
+      mojo::Message message,
+      std::unique_ptr<mojo::MessageReceiver> responder);
+
   // Channel::AssociatedInterfaceSupport:
   mojo::AssociatedGroup* GetAssociatedGroup() override;
+  std::unique_ptr<mojo::ThreadSafeForwarder<mojom::Channel>>
+  CreateThreadSafeChannel() override;
   void AddGenericAssociatedInterface(
       const std::string& name,
       const GenericAssociatedInterfaceFactory& factory) override;
@@ -113,7 +117,7 @@
       mojo::ScopedInterfaceEndpointHandle handle) override;
 
   // A TaskRunner which runs tasks on the ChannelMojo's owning thread.
-  scoped_refptr<base::TaskRunner> task_runner_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
   const mojo::MessagePipeHandle pipe_;
   std::unique_ptr<MojoBootstrap> bootstrap_;