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