# 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.

import("//build/buildflag_header.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/features.gni")
import("//testing/test.gni")
import("//third_party/protobuf/proto_library.gni")

# Public common API headers, mojom and libraries that can be linked and
# referenced both by browser-side and renderer-side components.
component("common") {
  output_name = "blink_common"

  public_deps = [
    "//third_party/blink/public/common:headers",
    "//third_party/blink/public/mojom:mojom_modules",
  ]
  deps = [
    "//third_party/blink/common",
  ]
}

source_set("headers") {
  visibility = [
    "//chrome/*",
    "//content/*",
    "//third_party/blink/*",
    "//components/*",
    "//storage/*",
    ":*",
  ]

  sources = [
    "associated_interfaces/associated_interface_provider.h",
    "associated_interfaces/associated_interface_registry.h",
    "blob/blob_utils.h",
    "cache_storage/cache_storage_utils.h",
    "client_hints/client_hints.h",
    "common_export.h",
    "device_memory/approximated_device_memory.h",
    "dom_storage/session_storage_namespace_id.h",
    "download/download_stats.h",
    "experiments/memory_ablation_experiment.h",
    "feature_policy/feature_policy.h",
    "features.h",
    "fetch/fetch_api_request_headers_map.h",
    "fetch/fetch_api_request_headers_mojom_traits.h",
    "frame/frame_owner_element_type.h",
    "frame/frame_policy.h",
    "frame/from_ad_state.h",
    "frame/sandbox_flags.h",
    "frame/user_activation_state.h",
    "frame/user_activation_update_source.h",
    "frame/user_activation_update_type.h",
    "indexeddb/indexed_db_default_mojom_traits.h",
    "indexeddb/indexeddb_key.h",
    "indexeddb/indexeddb_key_path.h",
    "indexeddb/indexeddb_key_range.h",
    "indexeddb/indexeddb_metadata.h",
    "indexeddb/web_idb_types.h",
    "loader/url_loader_factory_bundle.h",
    "loader/url_loader_factory_bundle_mojom_traits.h",
    "manifest/manifest.h",
    "manifest/manifest_icon_selector.h",
    "manifest/web_display_mode.h",
    "media/video_capture.h",
    "mediastream/media_devices.h",
    "mediastream/media_devices_mojom_traits.h",
    "mediastream/media_stream_controls.h",
    "mediastream/media_stream_mojom_traits.h",
    "mediastream/media_stream_request.h",
    "messaging/cloneable_message.h",
    "messaging/cloneable_message_struct_traits.h",
    "messaging/message_port_channel.h",
    "messaging/string_message_codec.h",
    "messaging/transferable_message.h",
    "messaging/transferable_message_struct_traits.h",
    "mime_util/mime_util.h",
    "notifications/notification_resources.h",
    "notifications/notification_struct_traits.h",
    "notifications/platform_notification_data.h",
    "oom_intervention/oom_intervention_types.h",
    "origin_policy/origin_policy.h",
    "origin_trials/origin_trial_policy.h",
    "origin_trials/trial_token.h",
    "origin_trials/trial_token_validator.h",
    "page/launching_process_state.h",
    "picture_in_picture/picture_in_picture_control_info.h",
    "privacy_preferences.h",
    "screen_orientation/web_screen_orientation_lock_type.h",
    "screen_orientation/web_screen_orientation_type.h",
    "service_worker/service_worker_status_code.h",
    "service_worker/service_worker_type_converters.h",
    "service_worker/service_worker_utils.h",
  ]

  public_deps = [
    "//services/network/public/cpp:cpp",
    "//skia",
    "//third_party/blink/public/mojom:mojom_modules_headers",
  ]

  deps = [
    "//base",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
    "//mojo/public/mojom/base",
    "//net",
  ]

  # iOS doesn't use and must not depend on //media
  if (!is_ios) {
    deps += [
      "//media",
      "//media/capture:capture_base",
      "//media/capture:capture_lib",
    ]
  }

  if (is_android || is_win) {
    sources += [
      "font_unique_name_lookup/font_table_matcher.h",
      "font_unique_name_lookup/icu_fold_case_util.h",
    ]
    deps += [ ":font_unique_name_table_proto" ]
  }

  if (is_mac) {
    sources += [ "sandbox_support/sandbox_support_mac.h" ]
  }

  if (is_win) {
    sources += [ "dwrite_rasterizer_support/dwrite_rasterizer_support.h" ]
  }

  # common_export.h is an implementation detail of component builds,
  # not part of the public API.
  public = sources - [ "common_export.h" ]
}

if (is_android || is_win) {
  proto_library("font_unique_name_table_proto") {
    sources = [
      "font_unique_name_lookup/font_unique_name_table.proto",
    ]
  }
}
