Use Binding<> instead of InterfaceImpl in ViewManagerClientImpl

This way we can set up the service_ connection in the constructor
instead of in a separate function.

R=sky@chromium.org

Review URL: https://codereview.chromium.org/713313002
diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc
index 84fa87d..7175423 100644
--- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc
+++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_factory.cc
@@ -24,10 +24,9 @@
     ScopedMessagePipeHandle handle,
     Shell* shell,
     ViewManagerDelegate* delegate) {
-  scoped_ptr<ViewManagerClientImpl> client(
-      new ViewManagerClientImpl(delegate, shell));
-  WeakBindToPipe(client.get(), handle.Pass());
-  client->OnConnectionEstablished();
+  const bool delete_on_error = false;
+  scoped_ptr<ViewManagerClientImpl> client(new ViewManagerClientImpl(
+      delegate, shell, handle.Pass(), delete_on_error));
   return client.Pass();
 }
 
@@ -35,9 +34,9 @@
 void ViewManagerClientFactory::Create(
     ApplicationConnection* connection,
     InterfaceRequest<ViewManagerClient> request) {
-  ViewManagerClientImpl* impl =
-      BindToRequest(new ViewManagerClientImpl(delegate_, shell_), &request);
-  impl->OnConnectionEstablished();
+  const bool delete_on_error = true;
+  new ViewManagerClientImpl(delegate_, shell_, request.PassMessagePipe(),
+                            delete_on_error);
 }
 
 }  // namespace mojo
diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
index cc04f04..9421e18 100644
--- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
+++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc
@@ -92,8 +92,16 @@
 };
 
 ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate,
-                                             Shell* shell)
-    : connected_(false), connection_id_(0), next_id_(1), delegate_(delegate) {
+                                             Shell* shell,
+                                             ScopedMessagePipeHandle handle,
+                                             bool delete_on_error)
+    : connected_(false),
+      connection_id_(0),
+      next_id_(1),
+      delegate_(delegate),
+      binding_(this, handle.Pass()),
+      service_(binding_.client()),
+      delete_on_error_(delete_on_error) {
 }
 
 ViewManagerClientImpl::~ViewManagerClientImpl() {
@@ -232,13 +240,6 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// ViewManagerClientImpl, InterfaceImpl overrides:
-
-void ViewManagerClientImpl::OnConnectionEstablished() {
-  service_ = client();
-}
-
-////////////////////////////////////////////////////////////////////////////////
 // ViewManagerClientImpl, ViewManagerClient implementation:
 
 void ViewManagerClientImpl::OnEmbed(
@@ -396,6 +397,13 @@
                                                   Id new_focused_window) {}
 
 ////////////////////////////////////////////////////////////////////////////////
+// OnConnectionError, private:
+void ViewManagerClientImpl::OnConnectionError() {
+  if (delete_on_error_)
+    delete this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // ViewManagerClientImpl, private:
 
 void ViewManagerClientImpl::RemoveRoot(View* root) {
diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h
index 47f08cd..2c941da 100644
--- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h
+++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h
@@ -9,6 +9,7 @@
 #include "base/callback.h"
 #include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/services/public/cpp/view_manager/types.h"
 #include "mojo/services/public/cpp/view_manager/view.h"
 #include "mojo/services/public/cpp/view_manager/view_manager.h"
@@ -23,10 +24,14 @@
 
 // Manages the connection with the View Manager service.
 class ViewManagerClientImpl : public ViewManager,
-                              public InterfaceImpl<ViewManagerClient>,
-                              public WindowManagerClient {
+                              public ViewManagerClient,
+                              public WindowManagerClient,
+                              public ErrorHandler {
  public:
-  ViewManagerClientImpl(ViewManagerDelegate* delegate, Shell* shell);
+  ViewManagerClientImpl(ViewManagerDelegate* delegate,
+                        Shell* shell,
+                        ScopedMessagePipeHandle handle,
+                        bool delete_on_error);
   ~ViewManagerClientImpl() override;
 
   bool connected() const { return connected_; }
@@ -73,8 +78,6 @@
   void AddView(View* view);
   void RemoveView(Id view_id);
 
-  void OnConnectionEstablished();
-
  private:
   friend class RootObserver;
 
@@ -119,6 +122,9 @@
   void OnActiveWindowChanged(Id old_focused_window,
                              Id new_focused_window) override;
 
+  // ErrorHandler implementation.
+  void OnConnectionError() override;
+
   void RemoveRoot(View* root);
 
   void OnActionCompleted(bool success);
@@ -141,10 +147,12 @@
 
   IdToViewMap views_;
 
-  ViewManagerService* service_;
-
   WindowManagerPtr window_manager_;
 
+  Binding<ViewManagerClient> binding_;
+  ViewManagerService* service_;
+  const bool delete_on_error_;
+
   DISALLOW_COPY_AND_ASSIGN(ViewManagerClientImpl);
 };