Make ServiceRegistry (which implements) ApplicationConnection just wrap a ServiceProviderImpl.

At this point, I could make ApplicationConnection not an interface, and
just rename ServiceRegistry to ApplicationConnection (basically). I
won't bother, because I plan on deleting
ApplicationConnection/ServiceRegistry ASAP.

I also added a ServiceProviderImpl getter to ApplicationConnection. My
plan of action is:
* Make everyone currently using ApplicationConnection just use stuff via
  the getter. (In particular, this means converting all the current uses
  of ApplicationConnection::AddService<I>()/InterfaceFactory<I>.)
* At that point, replacing ApplicationConnection with just
  ServiceProviderImpl will be easy.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/1977033002 .
diff --git a/mojo/public/cpp/application/application_connection.h b/mojo/public/cpp/application/application_connection.h
index 8979d0c..e665cd4 100644
--- a/mojo/public/cpp/application/application_connection.h
+++ b/mojo/public/cpp/application/application_connection.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "mojo/public/cpp/application/lib/interface_factory_connector.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
 
 namespace mojo {
@@ -50,6 +51,8 @@
         Interface::Name_);
   }
 
+  virtual ServiceProviderImpl& GetServiceProviderImpl() = 0;
+
   virtual const ConnectionContext& GetConnectionContext() const = 0;
 
   // Returns the URL that was used by the source application to establish a
diff --git a/mojo/public/cpp/application/lib/service_provider_impl.cc b/mojo/public/cpp/application/lib/service_provider_impl.cc
index 70821e5..a3245b4 100644
--- a/mojo/public/cpp/application/lib/service_provider_impl.cc
+++ b/mojo/public/cpp/application/lib/service_provider_impl.cc
@@ -16,9 +16,10 @@
 ServiceProviderImpl::ServiceProviderImpl(
     const ConnectionContext& connection_context,
     InterfaceRequest<ServiceProvider> service_provider_request)
-    : connection_context_(connection_context),
-      binding_(this, service_provider_request.Pass()),
-      fallback_service_provider_(nullptr) {}
+    : binding_(this), fallback_service_provider_(nullptr) {
+  if (service_provider_request.is_pending())
+    Bind(connection_context, service_provider_request.Pass());
+}
 
 ServiceProviderImpl::~ServiceProviderImpl() {}
 
diff --git a/mojo/public/cpp/application/lib/service_registry.cc b/mojo/public/cpp/application/lib/service_registry.cc
index d48f161..74372d3 100644
--- a/mojo/public/cpp/application/lib/service_registry.cc
+++ b/mojo/public/cpp/application/lib/service_registry.cc
@@ -10,46 +10,41 @@
 namespace mojo {
 namespace internal {
 
-ServiceRegistry::ServiceRegistry() : local_binding_(this) {}
+ServiceRegistry::ServiceRegistry() {}
 
 ServiceRegistry::ServiceRegistry(
     const ConnectionContext& connection_context,
     InterfaceRequest<ServiceProvider> local_services)
-    : connection_context_(connection_context), local_binding_(this) {
-  if (local_services.is_pending())
-    local_binding_.Bind(local_services.Pass());
-}
+    : service_provider_impl_(connection_context, local_services.Pass()) {}
 
 ServiceRegistry::~ServiceRegistry() {}
 
 void ServiceRegistry::SetServiceConnectorForName(
     ServiceConnector* service_connector,
     const std::string& interface_name) {
-  service_connector_registry_.SetServiceConnectorForName(
+  service_provider_impl_.AddServiceForName(
       std::unique_ptr<ServiceConnector>(service_connector), interface_name);
 }
 
 void ServiceRegistry::RemoveServiceConnectorForName(
     const std::string& interface_name) {
-  service_connector_registry_.RemoveServiceConnectorForName(interface_name);
+  service_provider_impl_.RemoveServiceForName(interface_name);
+}
+
+ServiceProviderImpl& ServiceRegistry::GetServiceProviderImpl() {
+  return service_provider_impl_;
 }
 
 const ConnectionContext& ServiceRegistry::GetConnectionContext() const {
-  return connection_context_;
+  return service_provider_impl_.connection_context();
 }
 
 const std::string& ServiceRegistry::GetConnectionURL() {
-  return connection_context_.connection_url;
+  return service_provider_impl_.connection_context().connection_url;
 }
 
 const std::string& ServiceRegistry::GetRemoteApplicationURL() {
-  return connection_context_.remote_url;
-}
-
-void ServiceRegistry::ConnectToService(const String& service_name,
-                                       ScopedMessagePipeHandle client_handle) {
-  service_connector_registry_.ConnectToService(connection_context_,
-                                               service_name, &client_handle);
+  return service_provider_impl_.connection_context().remote_url;
 }
 
 }  // namespace internal
diff --git a/mojo/public/cpp/application/lib/service_registry.h b/mojo/public/cpp/application/lib/service_registry.h
index 1389d37..26027f4 100644
--- a/mojo/public/cpp/application/lib/service_registry.h
+++ b/mojo/public/cpp/application/lib/service_registry.h
@@ -8,10 +8,7 @@
 #include <string>
 
 #include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/connection_context.h"
-#include "mojo/public/cpp/application/lib/service_connector_registry.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/interfaces/application/service_provider.mojom.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 
 namespace mojo {
 namespace internal {
@@ -19,7 +16,7 @@
 // A ServiceRegistry represents each half of a connection between two
 // applications, allowing customization of which services are published to the
 // other.
-class ServiceRegistry : public ServiceProvider, public ApplicationConnection {
+class ServiceRegistry : public ApplicationConnection {
  public:
   ServiceRegistry();
   ServiceRegistry(const ConnectionContext& connection_context,
@@ -29,6 +26,7 @@
   // ApplicationConnection overrides.
   void SetServiceConnectorForName(ServiceConnector* service_connector,
                                   const std::string& interface_name) override;
+  ServiceProviderImpl& GetServiceProviderImpl() override;
   const ConnectionContext& GetConnectionContext() const override;
   const std::string& GetConnectionURL() override;
   const std::string& GetRemoteApplicationURL() override;
@@ -36,13 +34,7 @@
   void RemoveServiceConnectorForName(const std::string& interface_name);
 
  private:
-  // ServiceProvider method.
-  void ConnectToService(const String& service_name,
-                        ScopedMessagePipeHandle client_handle) override;
-
-  ConnectionContext connection_context_;
-  Binding<ServiceProvider> local_binding_;
-  ServiceConnectorRegistry service_connector_registry_;
+  ServiceProviderImpl service_provider_impl_;
 
   MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceRegistry);
 };
diff --git a/mojo/public/cpp/application/service_provider_impl.h b/mojo/public/cpp/application/service_provider_impl.h
index 54adac7..77a7644 100644
--- a/mojo/public/cpp/application/service_provider_impl.h
+++ b/mojo/public/cpp/application/service_provider_impl.h
@@ -35,7 +35,8 @@
   ServiceProviderImpl();
 
   // Constructs this service provider implementation, binding it to the given
-  // interface request.
+  // interface request. Note: If |service_provider_request| is not valid
+  // ("pending"), then the object will be put into an unbound state.
   explicit ServiceProviderImpl(
       const ConnectionContext& connection_context,
       InterfaceRequest<ServiceProvider> service_provider_request);
diff --git a/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc b/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc
index 2483fc3..f676767 100644
--- a/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc
+++ b/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc
@@ -338,6 +338,16 @@
   EXPECT_FALSE(was_run);
 }
 
+TEST_F(ServiceProviderImplTest, ConstructRequestNotPending) {
+  ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING,
+                                             "https://example.com/remote.mojo",
+                                             "https://example.com/me.mojo"),
+                           InterfaceRequest<ServiceProvider>());
+  EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type);
+  EXPECT_EQ(std::string(), impl.connection_context().remote_url);
+  EXPECT_EQ(std::string(), impl.connection_context().connection_url);
+}
+
 // TODO(vtl): Explicitly test |AddServiceForName()|?
 
 }  // namespace