| // 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. | 
 |  | 
 | #ifndef CONTENT_BROWSER_CONTENT_SERVICE_DELEGATE_IMPL_H_ | 
 | #define CONTENT_BROWSER_CONTENT_SERVICE_DELEGATE_IMPL_H_ | 
 |  | 
 | #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 { | 
 |  public: | 
 |   // 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); | 
 |  | 
 |  private: | 
 |   // 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_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ContentServiceDelegateImpl); | 
 | }; | 
 |  | 
 | }  // namespace content | 
 |  | 
 | #endif  // CONTENT_BROWSER_CONTENT_SERVICE_DELEGATE_IMPL_H_ |