blob: 4515c7f44aa18669a53c4105ac849dc5a031ee30 [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 <memory>
#include <set>
#include "base/macros.h"
#include "services/content/service_delegate.h"
namespace content {
class BrowserContext;
// Implementation of the main delegate interface for the Content Service. This
// is used to support the Content Service implementation with content/browser
// details, without the Content Service having any build dependencies on
// src/content. There is one instance of this delegate per BrowserContext,
// shared by any ContentService instance instantiated on behalf of that
// BrowserContext.
class ContentServiceDelegateImpl : public content::ServiceDelegate {
// Constructs a new ContentServiceDelegateImpl for |browser_context|.
// |browser_context| must outlive |this|.
explicit ContentServiceDelegateImpl(BrowserContext* browser_context);
~ContentServiceDelegateImpl() override;
// Registers |service| with this delegate. Must be called for any |service|
// using |this| as its ContentServiceDelegate. Automatically balanced by
// |WillDestroyServiceInstance()|.
void AddService(content::Service* service);
// content::ContentServiceDelegate:
void WillDestroyServiceInstance(content::Service* service) override;
std::unique_ptr<NavigableContentsDelegate> CreateNavigableContentsDelegate(
const mojom::NavigableContentsParams& params,
mojom::NavigableContentsClient* client) override;
BrowserContext* const browser_context_;
// Tracks ContentService instances currently using this delegate. Necessary
// because the lifetime of |this| is tied to the lifetime of
// |browser_context_|; on destruction of |this|, we need to force all of these
// ContentService instances to terminate, since they cannot operate without
// their delegate.
std::set<content::Service*> service_instances_;
} // namespace content