# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/chrome_build.gni")
import("//build/config/ui.gni")
import("//content/public/common/features.gni")
import("//extensions/buildflags/buildflags.gni")
import("//media/media_options.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//rlz/buildflags/buildflags.gni")
import("//third_party/protobuf/proto_library.gni")

source_set("access_handler") {
  sources = [ "media_access_handler.h" ]
  public_deps = [
    "//base",
    "//content/public/browser",
  ]
}

source_set("access_handler_impl") {
  sources = [ "media_access_handler.cc" ]
  deps = [
    ":access_handler",
    "//chrome/browser/media/webrtc",
    "//third_party/blink/public/common",
  ]
}

source_set("audio_process_ml_model_forwarder") {
  sources = [
    "audio_process_ml_model_forwarder.cc",
    "audio_process_ml_model_forwarder.h",
  ]
  public_deps = [
    "//base",
    "//components/optimization_guide/core:prediction",
    "//components/optimization_guide/proto:optimization_guide_proto",
    "//mojo/public/cpp/bindings",
    "//services/audio/public/mojom",
  ]
  deps = [
    "//chrome/browser/media/webrtc",
    "//chrome/common:constants",
    "//components/prefs",
    "//content/public/browser",
  ]
}

source_set("unittests") {
  testonly = true

  # Several media unit tests have file-scope statics of non-trivial-destructor
  # types, which -Wexit-time-destructors rejects.
  configs += [ "//build/config/compiler:no_exit_time_destructors" ]

  sources = [
    "audio_process_ml_model_forwarder_unittest.cc",
    "autoplay_policy_status_observer_unittest.cc",
    "media_engagement_contents_observer_unittest.cc",
    "media_engagement_preloaded_list_unittest.cc",
    "media_engagement_score_unittest.cc",
    "media_engagement_service_unittest.cc",
    "media_engagement_session_unittest.cc",
    "media_storage_id_salt_unittest.cc",
    "unified_autoplay_config_unittest.cc",
  ]
  deps = [
    ":audio_process_ml_model_forwarder",
    ":impl",
    "//base",
    "//base/test:test_support",
    "//chrome/browser/content_settings",
    "//chrome/browser/content_settings:content_settings_factory",
    "//chrome/browser/media/webrtc",
    "//chrome/browser/profiles:profile",
    "//chrome/browser/ui:recently_audible_helper",
    "//chrome/common:constants",
    "//chrome/test:test_support",
    "//components/content_settings/core/browser",
    "//components/content_settings/core/common",
    "//components/history/core/browser",
    "//components/history/core/test",
    "//components/optimization_guide/core",
    "//components/optimization_guide/core:test_support",
    "//components/optimization_guide/proto:optimization_guide_proto",
    "//components/prefs:test_support",
    "//components/site_engagement/content",
    "//components/ukm:test_support",
    "//content/public/browser",
    "//content/test:test_support",
    "//media",
    "//mojo/core/embedder",
    "//mojo/public/cpp/bindings",
    "//services/audio/public/mojom",
    "//services/metrics/public/cpp:ukm_builders",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/blink/public/common",
  ]

  if (is_win) {
    sources += [
      "cdm_document_service_impl_test.cc",
      "media_foundation_service_monitor_unittest.cc",
    ]
    deps += [
      ":impl",
      "//chrome/browser/profiles:profile",
      "//components/sync_preferences:test_support",
      "//components/user_prefs",
      "//content/test:test_support",
      "//media",
    ]
  }

  if (is_chromeos) {
    sources += [ "platform_verification_chromeos_unittest.cc" ]
    deps += [
      ":impl",
      "//chrome/browser/content_settings:content_settings_factory",
      "//components/content_settings/core/browser",
      "//components/permissions:test_support",
      "//content/test:test_support",
    ]
  }

  if (enable_extensions) {
    sources += [ "cast_mirroring_service_host_unittest.cc" ]
    deps += [ ":impl" ]
  }

  if (enable_media_remoting && !is_android) {
    sources += [ "cast_remoting_connector_unittest.cc" ]
    deps += [
      ":impl",
      "//components/media_router/common",
      "//components/sync_preferences:test_support",
      "//content/public/browser",
      "//content/test:test_support",
      "//media/mojo/mojom:remoting",
    ]
  }

  if (is_android || is_chromeos || is_win) {
    sources += [ "protected_media_identifier_permission_context_unittest.cc" ]
    deps += [
      ":impl",
      "//chrome/browser/profiles:test_support",
      "//chrome/common:constants",
      "//chrome/test:test_support",
      "//components/policy/core/common",
      "//components/prefs:test_support",
      "//media",
    ]
    if (is_chromeos) {
      deps += [
        "//ash/constants",
        "//chromeos/dbus/constants",
      ]
    }
  }
}

source_set("browser_tests") {
  testonly = true

  # Several media browser tests have file-scope statics of non-trivial-
  # destructor types, which -Wexit-time-destructors rejects.
  configs += [ "//build/config/compiler:no_exit_time_destructors" ]

  sources = [ "audio_process_ml_model_forwarder_browsertest.cc" ]
  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
  deps = [
    ":audio_process_ml_model_forwarder",
    "//base/test:test_support",
    "//chrome/browser:global_features",
    "//chrome/browser/optimization_guide",
    "//chrome/test:test_support",
    "//components/optimization_guide/core:test_support",
    "//components/optimization_guide/proto:optimization_guide_proto",
    "//content/public/browser",
    "//content/test:browsertest_support",
    "//media",
    "//testing/gtest",
  ]

  if (!is_android) {
    sources += [
      "audio_ducker_browsertest.cc",
      "autoplay_metrics_browsertest.cc",
      "cast_mirroring_service_host_browsertest.cc",
      "defer_background_media_browsertest.cc",
      "encrypted_media_supported_types_browsertest.cc",
      "media_browsertest.cc",
      "media_browsertest.h",
      "media_engagement_autoplay_browsertest.cc",
      "media_engagement_browsertest.cc",
      "media_session_browsertest.cc",
      "unified_autoplay_browsertest.cc",
    ]

    # TODO(crbug.com/40553979): encrypted_media_browsertest is flaky on the
    # Linux Asan Lsan bot.
    if (!((is_linux || is_chromeos) && is_asan && is_lsan)) {
      sources += [ "encrypted_media_browsertest.cc" ]
    }
    deps += [
      ":impl",
      "//chrome/browser:chrome_content_browser_client",
      "//chrome/browser/component_updater",
      "//chrome/browser/content_settings:content_settings_factory",
      "//chrome/browser/content_settings:content_settings_util",
      "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
      "//chrome/browser/prefs:util",
      "//chrome/browser/preloading/prefetch/no_state_prefetch",
      "//chrome/browser/preloading/prefetch/no_state_prefetch:test_support",
      "//chrome/browser/profiles:profile",
      "//chrome/browser/speech",
      "//chrome/browser/tab_group_sync",
      "//chrome/browser/ui",
      "//chrome/browser/ui:recently_audible_helper",
      "//chrome/browser/ui/tabs:tab_strip",
      "//chrome/test:test_support_ui",
      "//components/cdm/common:buildflags",
      "//components/no_state_prefetch/browser",
      "//components/no_state_prefetch/common",
      "//components/prefs",
      "//media:test_support",
      "//media/capture/mojom:video_capture",
      "//media/mojo/mojom",
      "//services/media_session/public/cpp/test:test_support",
      "//services/metrics/public/cpp:ukm_builders",
      "//third_party/widevine/cdm:headers",
    ]
  }
}

source_set("media") {
  public = [
    "audio_service_util.h",
    "autoplay_policy_status_observer.h",
    "chrome_media_session_client.h",
    "media_engagement_contents_observer.h",
    "media_engagement_preloaded_list.h",
    "media_engagement_score.h",
    "media_engagement_service.h",
    "media_engagement_service_factory.h",
    "media_engagement_session.h",
    "media_storage_id_salt.h",
    "output_protection_proxy.h",
    "unified_autoplay_config.h",
  ]

  public_deps = [
    ":access_handler",
    ":mojo_bindings",
    "//base",
    "//chrome/browser/profiles",
    "//components/content_settings/core/browser",
    "//components/history/core/browser",
    "//components/keyed_service/core",
    "//components/pref_registry",
    "//content/public/browser",
    "//extensions/buildflags",
    "//services/metrics/public/cpp:ukm_builders",
    "//url",
  ]

  if (is_chromeos) {
    public += [
      "chromeos_login_and_lock_media_access_handler.h",
      "platform_verification_chromeos.h",
    ]
    public_deps += [ "//ash" ]
  }

  if (!is_android) {
    public += [
      "audio_ducker.h",
      "cast_mirroring_service_host.h",
      "cast_mirroring_service_host_factory.h",
      "mirroring_service_host.h",
      "offscreen_tab.h",
    ]
    public_deps += [
      "//components/mirroring/mojom:service",
      "//media/capture/mojom:video_capture",
      "//media/mojo/mojom",
      "//mojo/public/cpp/bindings",
      "//services/media_session/public/mojom",
      "//ui/gfx/geometry",
    ]
  }

  if (is_android) {
    public += [
      "android/cdm/media_drm_origin_id_manager.h",
      "android/cdm/media_drm_origin_id_manager_factory.h",
      "android/cdm/media_drm_storage_factory.h",
      "android/cdm/per_device_provisioning_permission.h",
      "android/router/chrome_media_router_client.h",
    ]
    public_deps += [
      "//media",
      "//media/mojo/mojom",
      "//mojo/public/cpp/bindings",
    ]
  }

  if (is_android || is_chromeos || is_win) {
    public += [ "protected_media_identifier_permission_context.h" ]
    public_deps += [ "//components/permissions" ]
  }

  if (is_win) {
    public += [
      "cdm_pref_service_helper.h",
      "media_foundation_service_monitor.h",
    ]
    public_deps += [ "//ui/display" ]
  }

  if (enable_media_remoting) {
    public += [
      "cast_remoting_connector.h",
      "remoting_bridge.h",
    ]
    public_deps += [
      "//components/prefs",
      "//components/sessions:session_id",
      "//media/mojo/mojom:remoting",
      "//mojo/public/cpp/bindings",
    ]
  }

  if (enable_extensions) {
    public += [ "extension_media_access_handler.h" ]
  }

  if (enable_library_cdms) {
    public += [ "output_protection_impl.h" ]
    public_deps += [
      "//media/mojo/mojom",
      "//mojo/public/cpp/bindings",
    ]

    if (enable_cdm_storage_id) {
      public += [
        "cdm_storage_id.h",
        "cdm_storage_id_key.h",
      ]
    }
  }

  if (enable_library_cdms || is_win) {
    public += [ "cdm_document_service_impl.h" ]
    public_deps += [ "//media/mojo/mojom" ]

    if (is_chromeos) {
      public_deps += [ "//chrome/browser/ash/attestation" ]
    }
  }
}

source_set("impl") {
  sources = [
    "audio_service_util.cc",
    "autoplay_policy_status_observer.cc",
    "chrome_media_session_client.cc",
    "media_engagement_contents_observer.cc",
    "media_engagement_preloaded_list.cc",
    "media_engagement_score.cc",
    "media_engagement_service.cc",
    "media_engagement_service_factory.cc",
    "media_engagement_session.cc",
    "media_storage_id_salt.cc",
    "output_protection_proxy.cc",
    "unified_autoplay_config.cc",
  ]

  public_deps = [
    ":media",
    "//chrome/browser:browser_public_dependencies",
  ]

  deps = [
    ":media_engagement_preload_proto",
    "//chrome/browser:browser_process",
    "//chrome/browser/content_settings:content_settings_factory",
    "//chrome/browser/history",
    "//chrome/browser/media/webrtc",
    "//chrome/browser/preloading/prefetch/no_state_prefetch",
    "//chrome/browser/ui:recently_audible_helper",
    "//chrome/browser/ui:ui_features",
    "//chrome/browser/ui/browser_window",
    "//components/content_settings/browser",
    "//components/content_settings/core/common",
    "//components/no_state_prefetch/browser",
    "//components/prefs",
    "//components/sessions",
    "//components/site_engagement/content",
    "//components/user_prefs",
    "//crypto",
    "//media",
    "//services/metrics/public/cpp:ukm_builders",
    "//third_party/blink/public/common",
  ]

  if (is_chromeos) {
    sources += [
      "chromeos_login_and_lock_media_access_handler.cc",
      "platform_verification_chromeos.cc",
    ]
    deps += [
      "//chrome/browser/ui/ash/login",
      "//chrome/browser/ui/webui/ash/lock_screen_reauth",
      "//chromeos/ash/components/settings",
      "//chromeos/dbus/constants",
      "//components/guest_view/browser",
    ]
  }

  if (!is_android) {
    sources += [
      "audio_ducker.cc",
      "cast_mirroring_service_host.cc",
      "cast_mirroring_service_host_factory.cc",
      "mirroring_service_host.cc",
      "offscreen_tab.cc",
    ]
    deps += [
      "//chrome/browser/media/router:media_router_feature",
      "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
      "//chrome/browser/net",
      "//chrome/browser/ui/tab_sharing",
      "//chrome/browser/ui/tabs:tab_strip",
      "//components/media_router/browser",
      "//components/mirroring/browser",
      "//media/mojo/services",
    ]
  }

  if (is_android) {
    sources += [
      "android/cdm/media_drm_origin_id_manager.cc",
      "android/cdm/media_drm_origin_id_manager_factory.cc",
      "android/cdm/media_drm_storage_factory.cc",
      "android/cdm/per_device_provisioning_permission.cc",
      "android/router/chrome_media_router_client.cc",
    ]
    deps += [
      "//chrome/android:chrome_jni_headers",
      "//chrome/browser/net",
      "//components/cdm/browser",
      "//third_party/widevine/cdm:headers",
    ]
  }

  if (is_android || is_chromeos || is_win) {
    sources += [ "protected_media_identifier_permission_context.cc" ]
  }

  if (is_win) {
    sources += [
      "cdm_pref_service_helper.cc",
      "media_foundation_service_monitor.cc",
    ]
  }

  if (enable_media_remoting) {
    sources += [
      "cast_remoting_connector.cc",
      "remoting_bridge.cc",
    ]
    deps += [
      "//chrome/browser/media/router:media_router_feature",
      "//media/mojo/mojom:remoting",
    ]

    if (toolkit_views) {
      deps += [ "//chrome/browser/ui/views/media_router" ]
    }
  }

  if (enable_extensions) {
    sources += [ "extension_media_access_handler.cc" ]
  }

  if (enable_library_cdms) {
    sources += [ "output_protection_impl.cc" ]
    deps += [ "//media/mojo/mojom" ]

    if (enable_cdm_storage_id) {
      sources += [
        "cdm_storage_id.cc",
        "cdm_storage_id_key.cc",
      ]
      if (is_chrome_branded) {
        sources +=
            [ "//chrome/browser/internal/google_chrome_cdm_storage_id_key.h" ]
      }
      if (enable_rlz) {
        deps += [ "//rlz:rlz_lib" ]
      }
    }

    if (mojo_media_host == "browser") {
      deps += [ "//media/mojo/services" ]
    }
  }

  if (enable_library_cdms || is_win) {
    sources += [ "cdm_document_service_impl.cc" ]
  }
}

mojom("mojo_bindings") {
  sources = [ "media_engagement_score_details.mojom" ]

  public_deps = [
    "//services/media_session/public/mojom",
    "//url/mojom:url_mojom_origin",
  ]
  webui_module_path = "/"
}

proto_library("media_engagement_preload_proto") {
  sources = [ "media_engagement_preload.proto" ]
  generate_py_runtime = true
}
