blob: f8be88652533447ad0589976f3b82b579a5fcac4 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/content/service.h"
#include <utility>
#include "base/bind.h"
#include "base/macros.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "services/content/navigable_contents_factory_impl.h"
#include "services/content/navigable_contents_impl.h"
#include "services/content/public/mojom/navigable_contents_factory.mojom.h"
#include "services/content/service_delegate.h"
#include "services/service_manager/public/cpp/service_context.h"
namespace content {
Service::Service(ServiceDelegate* delegate) : delegate_(delegate) {
binders_.AddInterface(base::BindRepeating(
[](Service* service, mojom::NavigableContentsFactoryRequest request) {
service->AddNavigableContentsFactory(
std::make_unique<NavigableContentsFactoryImpl>(service,
std::move(request)));
},
this));
}
Service::~Service() {
delegate_->WillDestroyServiceInstance(this);
}
void Service::ForceQuit() {
// Ensure that all bound interfaces are disconnected and no further interface
// requests will be handled.
navigable_contents_factories_.clear();
navigable_contents_.clear();
binders_.RemoveInterface<mojom::NavigableContentsFactory>();
// Force-disconnect from the Service Mangager. Under normal circumstances
// (i.e. in non-test code), the call below destroys |this|.
context()->QuitNow();
}
void Service::AddNavigableContentsFactory(
std::unique_ptr<NavigableContentsFactoryImpl> factory) {
auto* raw_factory = factory.get();
navigable_contents_factories_.emplace(raw_factory, std::move(factory));
}
void Service::RemoveNavigableContentsFactory(
NavigableContentsFactoryImpl* factory) {
navigable_contents_factories_.erase(factory);
}
void Service::AddNavigableContents(
std::unique_ptr<NavigableContentsImpl> contents) {
auto* raw_contents = contents.get();
navigable_contents_.emplace(raw_contents, std::move(contents));
}
void Service::RemoveNavigableContents(NavigableContentsImpl* contents) {
navigable_contents_.erase(contents);
}
void Service::OnBindInterface(const service_manager::BindSourceInfo& source,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle pipe) {
binders_.BindInterface(interface_name, std::move(pipe));
}
} // namespace content