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); };