Migrate remaining services to ServiceBinding

This completes the migration from ServiceContext to ServiceBinding, with
the exception of internal Service Manager code and tests which will be
migrated in a follow-up CL.

This also eliminates the last usage of EmbeddedServiceInfo and
EmbeddedServiceRunner, so all that code is deleted here too. Yaaay.

Bug: 891780
Change-Id: Ide3c84d8e1cd60757418f98c0e0cbcdfaf2c45f5
Reviewed-on: https://chromium-review.googlesource.com/c/1357721
Reviewed-by: John Abd-El-Malek <[email protected]>
Reviewed-by: Marijn Kruisselbrink <[email protected]>
Reviewed-by: Becca Hughes <[email protected]>
Commit-Queue: Ken Rockot <[email protected]>
Cr-Commit-Position: refs/heads/master@{#613448}
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index 10fde11..8d2a83f 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -100,6 +100,52 @@
   DISALLOW_COPY_AND_ASSIGN(ServiceInstanceGroupHolder);
 };
 
+// The file service runs on the IO thread but we want to limit its lifetime to
+// that of the BrowserContext which creates it. This provides thread-safe access
+// to the relevant state on the IO thread.
+class FileServiceIOThreadState
+    : public base::RefCountedThreadSafe<FileServiceIOThreadState> {
+ public:
+  explicit FileServiceIOThreadState(
+      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
+      : io_task_runner_(std::move(io_task_runner)) {}
+
+  void StartOnIOThread(service_manager::mojom::ServiceRequest request) {
+    DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
+    file_service_ = std::make_unique<file::FileService>(std::move(request));
+  }
+
+  void ShutDown() {
+    io_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&FileServiceIOThreadState::ShutDownOnIOThread, this));
+  }
+
+ private:
+  friend class base::RefCountedThreadSafe<FileServiceIOThreadState>;
+
+  ~FileServiceIOThreadState() { DCHECK(!file_service_); }
+
+  void ShutDownOnIOThread() { file_service_.reset(); }
+
+  const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
+  std::unique_ptr<file::FileService> file_service_;
+
+  DISALLOW_COPY_AND_ASSIGN(FileServiceIOThreadState);
+};
+
+class FileServiceHolder : public base::SupportsUserData::Data {
+ public:
+  explicit FileServiceHolder(scoped_refptr<FileServiceIOThreadState> state)
+      : state_(std::move(state)) {}
+  ~FileServiceHolder() override { state_->ShutDown(); }
+
+ private:
+  const scoped_refptr<FileServiceIOThreadState> state_;
+
+  DISALLOW_COPY_AND_ASSIGN(FileServiceHolder);
+};
+
 class ContentServiceDelegateHolder : public base::SupportsUserData::Data {
  public:
   explicit ContentServiceDelegateHolder(BrowserContext* browser_context)
@@ -163,6 +209,7 @@
 // Key names on BrowserContext.
 const char kBrowsingDataRemoverKey[] = "browsing-data-remover";
 const char kContentServiceDelegateKey[] = "content-service-delegate";
+const char kFileServiceKey[] = "file-service";
 const char kDownloadManagerKeyName[] = "download_manager";
 const char kPermissionControllerKey[] = "permission-controller";
 const char kServiceManagerConnection[] = "service-manager-connection";
@@ -248,13 +295,34 @@
   context->SetUserData(kDownloadManagerKeyName, std::move(download_manager));
 }
 
+std::unique_ptr<service_manager::Service>
+CreateMainThreadServiceForBrowserContext(
+    BrowserContext* browser_context,
+    const std::string& service_name,
+    service_manager::mojom::ServiceRequest request) {
+  if (service_name == content::mojom::kServiceName) {
+    auto* delegate_holder = static_cast<ContentServiceDelegateHolder*>(
+        browser_context->GetUserData(kContentServiceDelegateKey));
+    auto* delegate = delegate_holder->delegate();
+    auto service =
+        std::make_unique<content::Service>(delegate, std::move(request));
+    delegate->AddService(service.get());
+    return service;
+  }
+
+  return browser_context->HandleServiceRequest(service_name,
+                                               std::move(request));
+}
+
 class BrowserContextServiceManagerConnectionHolder
     : public base::SupportsUserData::Data {
  public:
   explicit BrowserContextServiceManagerConnectionHolder(
       BrowserContext* browser_context,
-      service_manager::mojom::ServiceRequest request)
+      service_manager::mojom::ServiceRequest request,
+      scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner)
       : browser_context_(browser_context),
+        main_thread_task_runner_(std::move(main_thread_task_runner)),
         service_manager_connection_(ServiceManagerConnection::Create(
             std::move(request),
             base::CreateSingleThreadTaskRunnerWithTraits(
@@ -274,8 +342,8 @@
   void OnServiceRequest(const std::string& service_name,
                         service_manager::mojom::ServiceRequest request) {
     std::unique_ptr<service_manager::Service> service =
-        browser_context_->HandleServiceRequest(service_name,
-                                               std::move(request));
+        CreateMainThreadServiceForBrowserContext(browser_context_, service_name,
+                                                 std::move(request));
     if (!service) {
       LOG(ERROR) << "Ignoring request for unknown per-browser-context service:"
                  << service_name;
@@ -294,6 +362,7 @@
   }
 
   BrowserContext* const browser_context_;
+  const scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner_;
   std::unique_ptr<ServiceManagerConnection> service_manager_connection_;
   std::map<service_manager::Service*, std::unique_ptr<service_manager::Service>>
       running_services_;
@@ -633,41 +702,32 @@
 
     BrowserContextServiceManagerConnectionHolder* connection_holder =
         new BrowserContextServiceManagerConnectionHolder(
-            browser_context, std::move(service_request));
+            browser_context, std::move(service_request),
+            base::SequencedTaskRunnerHandle::Get());
     browser_context->SetUserData(kServiceManagerConnection,
                                  base::WrapUnique(connection_holder));
-
     ServiceManagerConnection* connection =
         connection_holder->service_manager_connection();
 
-    // New embedded service factories should be added to |connection| here.
-
-    {
-      service_manager::EmbeddedServiceInfo info;
-      info.factory = base::BindRepeating(&file::CreateFileService);
-      connection->AddEmbeddedService(file::mojom::kServiceName, info);
-    }
-
     browser_context->SetUserData(
         kContentServiceDelegateKey,
         std::make_unique<ContentServiceDelegateHolder>(browser_context));
 
-    {
-      service_manager::EmbeddedServiceInfo info;
-      info.task_runner = base::SequencedTaskRunnerHandle::Get();
-      info.factory = base::BindRepeating(
-          [](BrowserContext* context)
-              -> std::unique_ptr<service_manager::Service> {
-            auto* holder = static_cast<ContentServiceDelegateHolder*>(
-                context->GetUserData(kContentServiceDelegateKey));
-            auto* delegate = holder->delegate();
-            auto service = std::make_unique<content::Service>(delegate);
-            delegate->AddService(service.get());
-            return service;
-          },
-          browser_context);
-      connection->AddEmbeddedService(content::mojom::kServiceName, info);
-    }
+    scoped_refptr<FileServiceIOThreadState> file_service_io_thread_state =
+        base::MakeRefCounted<FileServiceIOThreadState>(
+            base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO}));
+    connection->AddServiceRequestHandler(
+        file::mojom::kServiceName,
+        base::BindRepeating(
+            [](scoped_refptr<FileServiceIOThreadState> io_thread_state,
+               service_manager::mojom::ServiceRequest request) {
+              io_thread_state->StartOnIOThread(std::move(request));
+            },
+            file_service_io_thread_state));
+
+    browser_context->SetUserData(kFileServiceKey,
+                                 std::make_unique<FileServiceHolder>(
+                                     std::move(file_service_io_thread_state)));
 
     RegisterCommonBrowserInterfaces(connection);
     connection->Start();
diff --git a/content/browser/dom_storage/local_storage_context_mojo_unittest.cc b/content/browser/dom_storage/local_storage_context_mojo_unittest.cc
index 4200f63..f121bf59 100644
--- a/content/browser/dom_storage/local_storage_context_mojo_unittest.cc
+++ b/content/browser/dom_storage/local_storage_context_mojo_unittest.cc
@@ -33,11 +33,8 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
-#include "services/file/file_service.h"
 #include "services/file/public/mojom/constants.mojom.h"
 #include "services/file/user_id_map.h"
-#include "services/service_manager/public/cpp/service_context.h"
-#include "services/service_manager/public/cpp/test/test_service_decorator.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "storage/browser/test/mock_special_storage_policy.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -1038,13 +1035,10 @@
 
 TEST_F(LocalStorageContextMojoTestWithService, RecreateOnCommitFailure) {
   FakeLevelDBService mock_leveldb_service;
-  ResetFileServiceAndConnector(
-      service_manager::TestServiceDecorator::CreateServiceWithUniqueOverride(
-          file::CreateFileService(),
-
-          leveldb::mojom::LevelDBService::Name_,
-          base::BindRepeating(&test::FakeLevelDBService::Bind,
-                              base::Unretained(&mock_leveldb_service))));
+  file_service()->GetBinderRegistryForTesting()->AddInterface(
+      leveldb::mojom::LevelDBService::Name_,
+      base::BindRepeating(&test::FakeLevelDBService::Bind,
+                          base::Unretained(&mock_leveldb_service)));
 
   std::map<std::vector<uint8_t>, std::vector<uint8_t>> test_data;
 
@@ -1190,11 +1184,10 @@
 TEST_F(LocalStorageContextMojoTestWithService,
        DontRecreateOnRepeatedCommitFailure) {
   FakeLevelDBService mock_leveldb_service;
-  ResetFileServiceAndConnector(
-      service_manager::TestServiceDecorator::CreateServiceWithUniqueOverride(
-          file::CreateFileService(), leveldb::mojom::LevelDBService::Name_,
-          base::BindRepeating(&test::FakeLevelDBService::Bind,
-                              base::Unretained(&mock_leveldb_service))));
+  file_service()->GetBinderRegistryForTesting()->AddInterface(
+      leveldb::mojom::LevelDBService::Name_,
+      base::BindRepeating(&test::FakeLevelDBService::Bind,
+                          base::Unretained(&mock_leveldb_service)));
 
   std::map<std::vector<uint8_t>, std::vector<uint8_t>> test_data;
 
diff --git a/content/browser/dom_storage/session_storage_context_mojo_unittest.cc b/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
index c883b73..c701b61 100644
--- a/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
+++ b/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
@@ -27,10 +27,7 @@
 #include "content/public/test/test_utils.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
-#include "services/file/file_service.h"
 #include "services/file/public/mojom/constants.mojom.h"
-#include "services/service_manager/public/cpp/service_context.h"
-#include "services/service_manager/public/cpp/test/test_service_decorator.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 
@@ -623,11 +620,10 @@
   url::Origin origin3 = url::Origin::Create(GURL("http://example.com"));
 
   test::FakeLevelDBService fake_leveldb_service;
-  ResetFileServiceAndConnector(
-      service_manager::TestServiceDecorator::CreateServiceWithUniqueOverride(
-          file::CreateFileService(), leveldb::mojom::LevelDBService::Name_,
-          base::BindRepeating(&test::FakeLevelDBService::Bind,
-                              base::Unretained(&fake_leveldb_service))));
+  file_service()->GetBinderRegistryForTesting()->AddInterface(
+      leveldb::mojom::LevelDBService::Name_,
+      base::BindRepeating(&test::FakeLevelDBService::Bind,
+                          base::Unretained(&fake_leveldb_service)));
 
   // Open three connections to the database.
   blink::mojom::StorageAreaAssociatedPtr area1;
@@ -760,11 +756,10 @@
   url::Origin origin1 = url::Origin::Create(GURL("http://foobar.com"));
 
   test::FakeLevelDBService fake_leveldb_service;
-  ResetFileServiceAndConnector(
-      service_manager::TestServiceDecorator::CreateServiceWithUniqueOverride(
-          file::CreateFileService(), leveldb::mojom::LevelDBService::Name_,
-          base::BindRepeating(&test::FakeLevelDBService::Bind,
-                              base::Unretained(&fake_leveldb_service))));
+  file_service()->GetBinderRegistryForTesting()->AddInterface(
+      leveldb::mojom::LevelDBService::Name_,
+      base::BindRepeating(&test::FakeLevelDBService::Bind,
+                          base::Unretained(&fake_leveldb_service)));
 
   std::map<std::vector<uint8_t>, std::vector<uint8_t>> test_data;
 
diff --git a/content/browser/dom_storage/test/mojo_test_with_file_service.cc b/content/browser/dom_storage/test/mojo_test_with_file_service.cc
index 45af64b..624e698 100644
--- a/content/browser/dom_storage/test/mojo_test_with_file_service.cc
+++ b/content/browser/dom_storage/test/mojo_test_with_file_service.cc
@@ -4,29 +4,21 @@
 
 #include "content/browser/dom_storage/test/mojo_test_with_file_service.h"
 
-#include "services/file/file_service.h"
 #include "services/file/public/mojom/constants.mojom.h"
 #include "services/file/user_id_map.h"
 
 namespace content {
 namespace test {
 
-MojoTestWithFileService::MojoTestWithFileService() {
-  ResetFileServiceAndConnector(file::CreateFileService());
-}
-MojoTestWithFileService::~MojoTestWithFileService() = default;
-
-void MojoTestWithFileService::ResetFileServiceAndConnector(
-    std::unique_ptr<service_manager::Service> service) {
-  if (!temp_path_.IsValid())
-    CHECK(temp_path_.CreateUniqueTempDir());
-  test_connector_ =
-      service_manager::TestConnectorFactory::CreateForUniqueService(
-          std::move(service));
-  connector_ = test_connector_->CreateConnector();
+MojoTestWithFileService::MojoTestWithFileService()
+    : file_service_(
+          test_connector_factory_.RegisterInstance(file::mojom::kServiceName)) {
+  CHECK(temp_path_.CreateUniqueTempDir());
   file::AssociateServiceInstanceGroupWithUserDir(
-      test_connector_->test_instance_group(), temp_path_.GetPath());
+      test_connector_factory_.test_instance_group(), temp_path_.GetPath());
 }
 
+MojoTestWithFileService::~MojoTestWithFileService() = default;
+
 }  // namespace test
 }  // namespace content
diff --git a/content/browser/dom_storage/test/mojo_test_with_file_service.h b/content/browser/dom_storage/test/mojo_test_with_file_service.h
index baff122c..77d6eae 100644
--- a/content/browser/dom_storage/test/mojo_test_with_file_service.h
+++ b/content/browser/dom_storage/test/mojo_test_with_file_service.h
@@ -11,9 +11,8 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/test/scoped_task_environment.h"
-#include "services/service_manager/public/cpp/connector.h"
+#include "services/file/file_service.h"
 #include "services/service_manager/public/cpp/test/test_connector_factory.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace content {
@@ -27,19 +26,20 @@
   ~MojoTestWithFileService() override;
 
  protected:
-  void ResetFileServiceAndConnector(
-      std::unique_ptr<service_manager::Service> service);
-
   const base::FilePath& temp_path() { return temp_path_.GetPath(); }
 
-  service_manager::Connector* connector() const { return connector_.get(); }
+  file::FileService* file_service() { return &file_service_; }
+
+  service_manager::Connector* connector() {
+    return test_connector_factory_.GetDefaultConnector();
+  }
 
   void RunUntilIdle() { scoped_task_environment_.RunUntilIdle(); }
 
  private:
   base::test::ScopedTaskEnvironment scoped_task_environment_;
-  std::unique_ptr<service_manager::TestConnectorFactory> test_connector_;
-  std::unique_ptr<service_manager::Connector> connector_;
+  service_manager::TestConnectorFactory test_connector_factory_;
+  file::FileService file_service_;
   base::ScopedTempDir temp_path_;
 
   DISALLOW_COPY_AND_ASSIGN(MojoTestWithFileService);
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc
index 12692ad..b3ea530 100644
--- a/content/browser/service_manager/service_manager_context.cc
+++ b/content/browser/service_manager/service_manager_context.cc
@@ -387,9 +387,8 @@
 void LaunchInProcessServiceOnSequence(
     const InProcessServiceFactory& factory,
     service_manager::mojom::ServiceRequest request) {
-  auto* raw_service_impl = factory.Run(std::move(request)).release();
-  raw_service_impl->set_termination_closure(base::BindOnce(
-      [](service_manager::Service* impl) { delete impl; }, raw_service_impl));
+  service_manager::Service::RunAsyncUntilTermination(
+      factory.Run(std::move(request)));
 }
 
 void LaunchInProcessService(
@@ -432,19 +431,29 @@
 }
 
 #if defined(OS_LINUX)
-void CreateFontService(service_manager::mojom::ServiceRequest request) {
-  // The font service owns itself here, deleting on self-termination.
-  auto service =
-      std::make_unique<font_service::FontServiceApp>(std::move(request));
-  auto* raw_service = service.get();
-  raw_service->set_termination_closure(base::BindOnce(
-      [](std::unique_ptr<font_service::FontServiceApp> service) {
-        // Nothing to do but let |service| go out of scope.
-      },
-      std::move(service)));
+std::unique_ptr<service_manager::Service> CreateFontService(
+    service_manager::mojom::ServiceRequest request) {
+  return std::make_unique<font_service::FontServiceApp>(std::move(request));
 }
 #endif  // defined(OS_LINUX)
 
+std::unique_ptr<service_manager::Service> CreateResourceCoordinatorService(
+    service_manager::mojom::ServiceRequest request) {
+  return std::make_unique<resource_coordinator::ResourceCoordinatorService>(
+      std::move(request));
+}
+
+std::unique_ptr<service_manager::Service> CreateTracingService(
+    service_manager::mojom::ServiceRequest request) {
+  return std::make_unique<tracing::TracingService>(std::move(request));
+}
+
+std::unique_ptr<service_manager::Service> CreateMediaSessionService(
+    service_manager::mojom::ServiceRequest request) {
+  return std::make_unique<media_session::MediaSessionService>(
+      std::move(request));
+}
+
 }  // namespace
 
 // State which lives on the IO thread and drives the ServiceManager.
@@ -631,29 +640,29 @@
       std::move(root_browser_service), mojo::MakeRequest(&pid_receiver));
   pid_receiver->SetPID(base::GetCurrentProcId());
 
-  packaged_services_connection_->AddServiceRequestHandler(
+  RegisterInProcessService(
+      packaged_services_connection_.get(),
       resource_coordinator::mojom::kServiceName,
-      base::BindRepeating([](service_manager::mojom::ServiceRequest request) {
-        service_manager::Service::RunAsyncUntilTermination(
-            std::make_unique<resource_coordinator::ResourceCoordinatorService>(
-                std::move(request)));
-      }));
+      service_manager_thread_task_runner_,
+      base::BindRepeating(&CreateResourceCoordinatorService));
+
+  RegisterInProcessService(packaged_services_connection_.get(),
+                           tracing::mojom::kServiceName,
+                           service_manager_thread_task_runner_,
+                           base::BindRepeating(&CreateTracingService));
+
+  RegisterInProcessService(packaged_services_connection_.get(),
+                           metrics::mojom::kMetricsServiceName,
+                           service_manager_thread_task_runner_,
+                           base::BindRepeating(&metrics::CreateMetricsService));
 
   if (media_session::IsMediaSessionEnabled()) {
-    service_manager::EmbeddedServiceInfo media_session_info;
-    media_session_info.factory =
-        base::BindRepeating(&media_session::MediaSessionService::Create);
-    packaged_services_connection_->AddEmbeddedService(
-        media_session::mojom::kServiceName, media_session_info);
+    RegisterInProcessService(packaged_services_connection_.get(),
+                             media_session::mojom::kServiceName,
+                             base::SequencedTaskRunnerHandle::Get(),
+                             base::BindRepeating(&CreateMediaSessionService));
   }
 
-  packaged_services_connection_->AddServiceRequestHandler(
-      tracing::mojom::kServiceName,
-      base::BindRepeating([](service_manager::mojom::ServiceRequest request) {
-        service_manager::Service::RunAsyncUntilTermination(
-            std::make_unique<tracing::TracingService>(std::move(request)));
-      }));
-
   if (features::IsVideoCaptureServiceEnabledForBrowserProcess()) {
     RegisterInProcessService(
         packaged_services_connection_.get(), video_capture::mojom::kServiceName,
@@ -668,12 +677,14 @@
         base::BindRepeating(&CreateVideoCaptureService));
   }
 
-  {
-    service_manager::EmbeddedServiceInfo info;
-    info.factory = base::BindRepeating(&metrics::CreateMetricsService);
-    packaged_services_connection_->AddEmbeddedService(
-        metrics::mojom::kMetricsServiceName, info);
-  }
+#if defined(OS_LINUX)
+  RegisterInProcessService(
+      packaged_services_connection_.get(), font_service::mojom::kServiceName,
+      base::CreateSequencedTaskRunnerWithTraits(
+          base::TaskTraits({base::MayBlock(), base::WithBaseSyncPrimitives(),
+                            base::TaskPriority::USER_BLOCKING})),
+      base::BindRepeating(&CreateFontService));
+#endif
 
   GetContentClient()->browser()->RegisterIOThreadServiceHandlers(
       packaged_services_connection_.get());
@@ -690,30 +701,14 @@
   out_of_process_services[data_decoder::mojom::kServiceName] =
       base::BindRepeating(&base::ASCIIToUTF16, "Data Decoder Service");
 
-#if defined(OS_LINUX)
-  packaged_services_connection_->AddServiceRequestHandler(
-      font_service::mojom::kServiceName,
-      base::BindRepeating([](service_manager::mojom::ServiceRequest request) {
-        auto task_runner =
-            base::CreateSequencedTaskRunnerWithTraits(base::TaskTraits(
-                {base::MayBlock(), base::WithBaseSyncPrimitives(),
-                 base::TaskPriority::USER_BLOCKING}));
-        task_runner->PostTask(FROM_HERE, base::BindOnce(&CreateFontService,
-                                                        std::move(request)));
-      }));
-#endif
-
   bool network_service_enabled =
       base::FeatureList::IsEnabled(network::features::kNetworkService);
   if (network_service_enabled) {
     if (IsInProcessNetworkService()) {
-      packaged_services_connection_->AddServiceRequestHandler(
-          mojom::kNetworkServiceName,
-          base::BindRepeating(
-              [](service_manager::mojom::ServiceRequest request) {
-                service_manager::Service::RunAsyncUntilTermination(
-                    CreateNetworkService(std::move(request)));
-              }));
+      RegisterInProcessService(packaged_services_connection_.get(),
+                               mojom::kNetworkServiceName,
+                               service_manager_thread_task_runner_,
+                               base::BindRepeating(&CreateNetworkService));
     } else {
       out_of_process_services[mojom::kNetworkServiceName] =
           base::BindRepeating(&base::ASCIIToUTF16, "Network Service");
diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc
index 73da791..1226556 100644
--- a/content/common/service_manager/service_manager_connection_impl.cc
+++ b/content/common/service_manager/service_manager_connection_impl.cc
@@ -23,7 +23,6 @@
 #include "content/public/common/service_names.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/system/message_pipe.h"
-#include "services/service_manager/public/cpp/embedded_service_runner.h"
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/mojom/constants.mojom.h"
@@ -118,15 +117,6 @@
                        filter_id));
   }
 
-  void AddEmbeddedService(const std::string& name,
-                          const service_manager::EmbeddedServiceInfo& info) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&ServiceManagerConnectionImpl::IOThreadContext::
-                           AddEmbeddedServiceRequestHandlerOnIoThread,
-                       this, name, info));
-  }
-
   void AddServiceRequestHandler(const std::string& name,
                                 const ServiceRequestHandler& handler) {
     AddServiceRequestHandlerWithPID(
@@ -229,7 +219,6 @@
     ClearConnectionFiltersOnIOThread();
 
     request_handlers_.clear();
-    embedded_services_.clear();
     child_binding_.Close();
   }
 
@@ -247,24 +236,6 @@
       connection_filters_.erase(it);
   }
 
-  void AddEmbeddedServiceRequestHandlerOnIoThread(
-      const std::string& name,
-      const service_manager::EmbeddedServiceInfo& info) {
-    DCHECK(io_thread_checker_.CalledOnValidThread());
-    std::unique_ptr<service_manager::EmbeddedServiceRunner> service(
-        new service_manager::EmbeddedServiceRunner(name, info));
-    AddServiceRequestHandlerOnIoThread(
-        name,
-        base::BindRepeating(
-            &WrapServiceRequestHandlerNoPID,
-            base::BindRepeating(
-                &service_manager::EmbeddedServiceRunner::BindServiceRequest,
-                base::Unretained(service.get()))));
-    auto result =
-        embedded_services_.insert(std::make_pair(name, std::move(service)));
-    DCHECK(result.second);
-  }
-
   void AddServiceRequestHandlerOnIoThread(
       const std::string& name,
       const ServiceRequestHandlerWithPID& handler) {
@@ -361,8 +332,6 @@
       GUARDED_BY(lock_);
   int next_filter_id_ GUARDED_BY(lock_) = kInvalidConnectionFilterId;
 
-  std::map<std::string, std::unique_ptr<service_manager::EmbeddedServiceRunner>>
-      embedded_services_;
   std::map<std::string, ServiceRequestHandlerWithPID> request_handlers_;
 
   mojo::Binding<mojom::Child> child_binding_;
@@ -471,12 +440,6 @@
   context_->RemoveConnectionFilter(filter_id);
 }
 
-void ServiceManagerConnectionImpl::AddEmbeddedService(
-    const std::string& name,
-    const service_manager::EmbeddedServiceInfo& info) {
-  context_->AddEmbeddedService(name, info);
-}
-
 void ServiceManagerConnectionImpl::AddServiceRequestHandler(
     const std::string& name,
     const ServiceRequestHandler& handler) {
diff --git a/content/common/service_manager/service_manager_connection_impl.h b/content/common/service_manager/service_manager_connection_impl.h
index 52a4b28..3d785cbd 100644
--- a/content/common/service_manager/service_manager_connection_impl.h
+++ b/content/common/service_manager/service_manager_connection_impl.h
@@ -40,9 +40,6 @@
   void SetConnectionLostClosure(const base::Closure& closure) override;
   int AddConnectionFilter(std::unique_ptr<ConnectionFilter> filter) override;
   void RemoveConnectionFilter(int filter_id) override;
-  void AddEmbeddedService(
-      const std::string& name,
-      const service_manager::EmbeddedServiceInfo& info) override;
   void AddServiceRequestHandler(
       const std::string& name,
       const ServiceRequestHandler& handler) override;
diff --git a/content/common/service_manager/service_manager_connection_impl_unittest.cc b/content/common/service_manager/service_manager_connection_impl_unittest.cc
index 8fef0f6a..57dff5c 100644
--- a/content/common/service_manager/service_manager_connection_impl_unittest.cc
+++ b/content/common/service_manager/service_manager_connection_impl_unittest.cc
@@ -5,6 +5,7 @@
 #include "content/common/service_manager/service_manager_connection_impl.h"
 
 #include "base/synchronization/waitable_event.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
 #include "services/service_manager/public/cpp/constants.h"
@@ -18,12 +19,6 @@
 
 constexpr char kTestServiceName[] = "test service";
 
-std::unique_ptr<service_manager::Service> LaunchService(
-    base::WaitableEvent* event) {
-  event->Signal();
-  return std::make_unique<service_manager::Service>();
-}
-
 }  // namespace
 
 TEST(ServiceManagerConnectionImplTest, ServiceLaunchThreading) {
@@ -34,12 +29,14 @@
   ServiceManagerConnectionImpl connection_impl(mojo::MakeRequest(&service),
                                                io_thread.task_runner());
   ServiceManagerConnection& connection = connection_impl;
-  service_manager::EmbeddedServiceInfo info;
   base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
                             base::WaitableEvent::InitialState::NOT_SIGNALED);
-  info.factory = base::Bind(&LaunchService, &event);
-  info.task_runner = io_thread.task_runner();
-  connection.AddEmbeddedService(kTestServiceName, info);
+  connection.AddServiceRequestHandler(
+      kTestServiceName, base::BindLambdaForTesting(
+                            [&event](service_manager::mojom::ServiceRequest) {
+                              event.Signal();
+                            }));
+
   connection.Start();
   service_manager::BindSourceInfo source_info(
       service_manager::Identity(service_manager::mojom::kServiceName,
diff --git a/content/public/common/service_manager_connection.h b/content/public/common/service_manager_connection.h
index a2a3e8e..0e88d902 100644
--- a/content/public/common/service_manager_connection.h
+++ b/content/public/common/service_manager_connection.h
@@ -10,7 +10,6 @@
 #include "base/callback_forward.h"
 #include "base/sequenced_task_runner.h"
 #include "content/common/content_export.h"
-#include "services/service_manager/public/cpp/embedded_service_info.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
 
@@ -103,19 +102,9 @@
   // Removal (and destruction) happens asynchronously on the IO thread.
   virtual void RemoveConnectionFilter(int filter_id) = 0;
 
-  // Adds an embedded service to this connection's ServiceFactory.
-  // |info| provides details on how to construct new instances of the
-  // service when an incoming connection is made to |name|.
-  virtual void AddEmbeddedService(
-      const std::string& name,
-      const service_manager::EmbeddedServiceInfo& info) = 0;
-
   // Adds a generic ServiceRequestHandler for a given service name. This
   // will be used to satisfy any incoming calls to CreateService() which
   // reference the given name.
-  //
-  // For in-process services, it is preferable to use |AddEmbeddedService()| as
-  // defined above.
   virtual void AddServiceRequestHandler(
       const std::string& name,
       const ServiceRequestHandler& handler) = 0;