| Index: services/service_manager/tests/connect/connect_test_package.cc
 | 
| diff --git a/services/service_manager/tests/connect/connect_test_package.cc b/services/service_manager/tests/connect/connect_test_package.cc
 | 
| index 9d4a3d22775a7b9fea6cdd6ed3a720e99878c200..e55bdb3c435f7a9faea0cc80e167553ab294297d 100644
 | 
| --- a/services/service_manager/tests/connect/connect_test_package.cc
 | 
| +++ b/services/service_manager/tests/connect/connect_test_package.cc
 | 
| @@ -30,6 +30,14 @@
 | 
|  
 | 
|  namespace service_manager {
 | 
|  
 | 
| +namespace {
 | 
| +
 | 
| +void QuitLoop(base::RunLoop* loop) {
 | 
| +  loop->Quit();
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
|  using GetTitleCallback = test::mojom::ConnectTestService::GetTitleCallback;
 | 
|  
 | 
|  class ProvidedService
 | 
| @@ -48,36 +56,11 @@
 | 
|          request_(std::move(request)) {
 | 
|      Start();
 | 
|    }
 | 
| -
 | 
|    ~ProvidedService() override {
 | 
|      Join();
 | 
|    }
 | 
|  
 | 
|   private:
 | 
| -  class ForwardingServiceImpl : public Service {
 | 
| -   public:
 | 
| -    explicit ForwardingServiceImpl(Service* service)
 | 
| -        : service_(service) {}
 | 
| -    ~ForwardingServiceImpl() override {}
 | 
| -
 | 
| -    // Service:
 | 
| -    void OnStart(ServiceContext* context) override {
 | 
| -      service_->OnStart(context);
 | 
| -    }
 | 
| -
 | 
| -    bool OnConnect(const ServiceInfo& remote_info,
 | 
| -                   InterfaceRegistry* registry) override {
 | 
| -      return service_->OnConnect(remote_info, registry);
 | 
| -    }
 | 
| -
 | 
| -    bool OnStop() override { return service_->OnStop(); }
 | 
| -
 | 
| -   private:
 | 
| -    Service* const service_;
 | 
| -
 | 
| -    DISALLOW_COPY_AND_ASSIGN(ForwardingServiceImpl);
 | 
| -  };
 | 
| -
 | 
|    // service_manager::Service:
 | 
|    void OnStart(ServiceContext* context) override {
 | 
|      context_ = context;
 | 
| @@ -126,7 +109,6 @@
 | 
|    void GetTitle(const GetTitleCallback& callback) override {
 | 
|      callback.Run(title_);
 | 
|    }
 | 
| -
 | 
|    void GetInstance(const GetInstanceCallback& callback) override {
 | 
|      callback.Run(context_->identity().instance());
 | 
|    }
 | 
| @@ -145,7 +127,7 @@
 | 
|          context_->connector()->Connect(¶ms);
 | 
|      {
 | 
|        base::RunLoop loop;
 | 
| -      connection->AddConnectionCompletedClosure(loop.QuitClosure());
 | 
| +      connection->AddConnectionCompletedClosure(base::Bind(&QuitLoop, &loop));
 | 
|        base::MessageLoop::ScopedNestableTaskAllower allow(
 | 
|            base::MessageLoop::current());
 | 
|        loop.Run();
 | 
| @@ -156,12 +138,9 @@
 | 
|  
 | 
|    // base::SimpleThread:
 | 
|    void Run() override {
 | 
| -    ServiceRunner(new ForwardingServiceImpl(this)).Run(
 | 
| -        request_.PassMessagePipe().release().value(), false);
 | 
| -    caller_.reset();
 | 
| -    bindings_.CloseAllBindings();
 | 
| -    blocked_bindings_.CloseAllBindings();
 | 
| -    user_id_test_bindings_.CloseAllBindings();
 | 
| +    ServiceRunner(this).Run(request_.PassMessagePipe().release().value(),
 | 
| +                            false);
 | 
| +    delete this;
 | 
|    }
 | 
|  
 | 
|    void OnConnectionError() {
 | 
| @@ -193,15 +172,11 @@
 | 
|   private:
 | 
|    // service_manager::Service:
 | 
|    void OnStart(ServiceContext* context) override {
 | 
| -    context_ = context;
 | 
| -
 | 
| -    base::Closure error_handler =
 | 
| +    identity_ = context->identity();
 | 
| +    bindings_.set_connection_error_handler(
 | 
|          base::Bind(&ConnectTestService::OnConnectionError,
 | 
| -                   base::Unretained(this));
 | 
| -    bindings_.set_connection_error_handler(error_handler);
 | 
| -    service_factory_bindings_.set_connection_error_handler(error_handler);
 | 
| -  }
 | 
| -
 | 
| +                   base::Unretained(this)));
 | 
| +  }
 | 
|    bool OnConnect(const ServiceInfo& remote_info,
 | 
|                   InterfaceRegistry* registry) override {
 | 
|      registry->AddInterface<ServiceFactory>(this);
 | 
| @@ -209,11 +184,6 @@
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
| -  bool OnStop() override {
 | 
| -    provided_services_.clear();
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
|    // InterfaceFactory<mojom::ServiceFactory>:
 | 
|    void Create(const Identity& remote_identity,
 | 
|                mojom::ServiceFactoryRequest request) override {
 | 
| @@ -228,35 +198,30 @@
 | 
|  
 | 
|    // mojom::ServiceFactory:
 | 
|    void CreateService(mojom::ServiceRequest request,
 | 
| -                     const std::string& name) override {
 | 
| -    if (name == "service:connect_test_a") {
 | 
| -      provided_services_.emplace_back(
 | 
| -          base::MakeUnique<ProvidedService>("A", std::move(request)));
 | 
| -    } else if (name == "service:connect_test_b") {
 | 
| -      provided_services_.emplace_back(
 | 
| -          base::MakeUnique<ProvidedService>("B", std::move(request)));
 | 
| -    }
 | 
| +                         const std::string& name) override {
 | 
| +    if (name == "service:connect_test_a")
 | 
| +      new ProvidedService("A", std::move(request));
 | 
| +    else if (name == "service:connect_test_b")
 | 
| +      new ProvidedService("B", std::move(request));
 | 
|    }
 | 
|  
 | 
|    // test::mojom::ConnectTestService:
 | 
|    void GetTitle(const GetTitleCallback& callback) override {
 | 
|      callback.Run("ROOT");
 | 
|    }
 | 
| -
 | 
|    void GetInstance(const GetInstanceCallback& callback) override {
 | 
| -    callback.Run(context_->identity().instance());
 | 
| +    callback.Run(identity_.instance());
 | 
|    }
 | 
|  
 | 
|    void OnConnectionError() {
 | 
| -    if (bindings_.empty() && service_factory_bindings_.empty())
 | 
| -      context_->RequestQuit();
 | 
| -  }
 | 
| -
 | 
| -  ServiceContext* context_ = nullptr;
 | 
| +    if (bindings_.empty())
 | 
| +      base::MessageLoop::current()->QuitWhenIdle();
 | 
| +  }
 | 
| +
 | 
| +  Identity identity_;
 | 
|    std::vector<std::unique_ptr<Service>> delegates_;
 | 
|    mojo::BindingSet<mojom::ServiceFactory> service_factory_bindings_;
 | 
|    mojo::BindingSet<test::mojom::ConnectTestService> bindings_;
 | 
| -  std::list<std::unique_ptr<ProvidedService>> provided_services_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(ConnectTestService);
 | 
|  };
 | 
| 
 |