// Copyright 2019 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 "chromecast/browser/cast_overlay_manifests.h"

#include "base/no_destructor.h"
#include "build/build_config.h"
#include "chromecast/chromecast_buildflags.h"
#include "chromecast/common/mojom/application_media_capabilities.mojom.h"
#include "chromecast/common/mojom/feature_manager.mojom.h"
#include "chromecast/common/mojom/media_caps.mojom.h"
#include "chromecast/common/mojom/media_playback_options.mojom.h"
#include "chromecast/common/mojom/memory_pressure.mojom.h"
#include "chromecast/common/mojom/queryable_data_store.mojom.h"
#include "media/mojo/services/media_manifest.h"
#include "services/service_manager/public/cpp/manifest_builder.h"

#if BUILDFLAG(ENABLE_EXTERNAL_MOJO_SERVICES)
#include "chromecast/external_mojo/broker_service/broker_service.h"
#endif

#if defined(USE_INTERNAL_OVERLAY_MANIFESTS)
#include "chromecast/internal/shell/browser/cast_content_browser_internal_manifest_overlay.h"
#include "chromecast/internal/shell/browser/cast_content_packaged_services_internal_manifest_overlay.h"
#include "chromecast/internal/shell/browser/cast_content_renderer_internal_manifest_overlay.h"
#endif

#if !defined(OS_FUCHSIA)
#include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h"  // nogncheck
#endif  // !defined(OS_FUCHSIA)

namespace chromecast {
namespace shell {

const service_manager::Manifest& GetCastContentBrowserOverlayManifest() {
  static base::NoDestructor<service_manager::Manifest> manifest {
    service_manager::ManifestBuilder()
#if !defined(OS_FUCHSIA)
        .RequireCapability("heap_profiling", "heap_profiler")
        .RequireCapability("heap_profiling", "profiling")
#endif  // !defined(OS_FUCHSIA)
        .ExposeCapability("renderer",
                          service_manager::Manifest::InterfaceList<
                              chromecast::media::mojom::MediaCaps,
                              chromecast::mojom::MemoryPressureController>())
        .ExposeInterfaceFilterCapability_Deprecated(
            "navigation:frame", "renderer",
            service_manager::Manifest::InterfaceList<
                mojom::ApplicationMediaCapabilities>())
        .Build()
#if defined(USE_INTERNAL_OVERLAY_MANIFESTS)
        .Amend(cast_content_browser_internal_manifest_overlay::GetManifest())
#endif
  };
  return *manifest;
}

const service_manager::Manifest& GetCastContentRendererOverlayManifest() {
  static base::NoDestructor<service_manager::Manifest> manifest {
    service_manager::ManifestBuilder()
#if !defined(OS_FUCHSIA)
        .ExposeCapability("browser",
                          service_manager::Manifest::InterfaceList<
                              heap_profiling::mojom::ProfilingClient>())
#endif  // !defined(OS_FUCHSIA)
        .ExposeInterfaceFilterCapability_Deprecated(
            "navigation:frame", "browser",
            service_manager::Manifest::InterfaceList<
                mojom::FeatureManager, mojom::MediaPlaybackOptions,
                mojom::QueryableDataStore>())
        .Build()
#if defined(USE_INTERNAL_OVERLAY_MANIFESTS)
        .Amend(cast_content_renderer_internal_manifest_overlay::GetManifest())
#endif
  };
  return *manifest;
}

const service_manager::Manifest&
GetCastContentPackagedServicesOverlayManifest() {
  static base::NoDestructor<service_manager::Manifest> manifest {
    service_manager::ManifestBuilder()
        .PackageService(::media::GetMediaManifest())
#if BUILDFLAG(ENABLE_EXTERNAL_MOJO_SERVICES)
        .PackageService(chromecast::external_mojo::BrokerService::GetManifest())
#endif
        .Build()
#if defined(USE_INTERNAL_OVERLAY_MANIFESTS)
        .Amend(cast_content_packaged_services_internal_manifest_overlay::
                   GetManifest())
#endif
  };
  return *manifest;
}

}  // namespace shell
}  // namespace chromecast
