Merge AppChildProcessHost into ChildProcessHost.

Simplify! (The same needs to be done on the child process side, i.e.,
AppChildProcess into ChildProcess.)

More refactoring/cleanup to be done later (various TODOs added).

R=davemoore@chromium.org

Review URL: https://codereview.chromium.org/1056593002
diff --git a/shell/child_process_host.h b/shell/child_process_host.h
index f7eb65e..a6a0fb8 100644
--- a/shell/child_process_host.h
+++ b/shell/child_process_host.h
@@ -5,25 +5,28 @@
 #ifndef SHELL_CHILD_PROCESS_HOST_H_
 #define SHELL_CHILD_PROCESS_HOST_H_
 
+#include <stdint.h>
+
 #include "base/macros.h"
 #include "base/process/process.h"
+#include "mojo/edk/embedder/channel_info_forward.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
+#include "mojo/public/cpp/bindings/error_handler.h"
+#include "shell/app_child_process.mojom.h"
 
 namespace mojo {
 namespace shell {
 
 class Context;
 
-// (Base) class for a "child process host". Handles launching and connecting a
-// platform-specific "pipe" to the child, and supports joining the child
-// process.
+// Child process host: parent-process representation of a child process, which
+// hosts/runs a native Mojo application loaded from the file system. This class
+// handles launching and communicating with the child process.
 //
 // This class is not thread-safe. It should be created/used/destroyed on a
 // single thread.
-//
-// Note: Does not currently work on Windows before Vista.
-class ChildProcessHost {
+class ChildProcessHost : public ErrorHandler {
  public:
   explicit ChildProcessHost(Context* context);
   virtual ~ChildProcessHost();
@@ -33,6 +36,8 @@
   // After calling |Start()|, this object must not be destroyed until
   // |DidStart()| has been called.
   // TODO(vtl): Consider using weak pointers and removing this requirement.
+  // TODO(vtl): This should probably take a callback instead.
+  // TODO(vtl): Consider merging this with |StartApp()|.
   void Start();
 
   // Waits for the child process to terminate, and returns its exit code.
@@ -40,28 +45,42 @@
   // callback has been called.
   int Join();
 
-  embedder::ScopedPlatformHandle* platform_channel() {
-    return &platform_channel_;
-  }
+  // Methods relayed to the |AppChildController|. These methods may be only be
+  // called after |Start()|, but may be called immediately (without waiting for
+  // |DidStart()|).
 
-  virtual void WillStart() = 0;
-  virtual void DidStart(bool success) = 0;
+  // Like |AppChildController::StartApp()|, but with one difference:
+  // |on_app_complete| will *always* get called, even on connection error (or
+  // even if the child process failed to start at all).
+  void StartApp(const String& app_path,
+                bool clean_app_path,
+                InterfaceRequest<Application> application_request,
+                const AppChildController::StartAppCallback& on_app_complete);
+  void ExitNow(int32_t exit_code);
 
- protected:
-  Context* context() const { return context_; }
+  // TODO(vtl): This is virtual, so tests can override it, but really |Start()|
+  // should take a callback (see above) and this should be private.
+  virtual void DidStart(bool success);
 
  private:
+  // Callback for |embedder::CreateChannel()|.
+  void DidCreateChannel(embedder::ChannelInfo* channel_info);
+
   bool DoLaunch();
 
+  void AppCompleted(int32_t result);
+
+  // |ErrorHandler| methods:
+  void OnConnectionError() override;
+
   Context* const context_;
-
-  base::Process child_process_;
-
   embedder::PlatformChannelPair platform_channel_pair_;
 
-  // Platform-specific "pipe" to the child process. Valid immediately after
-  // creation.
-  embedder::ScopedPlatformHandle platform_channel_;
+  AppChildControllerPtr controller_;
+  embedder::ChannelInfo* channel_info_;
+  AppChildController::StartAppCallback on_app_complete_;
+
+  base::Process child_process_;
 
   DISALLOW_COPY_AND_ASSIGN(ChildProcessHost);
 };