# Copyright 2014 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/config/features.gni")
import("//build/config/ui.gni")
import("//ppapi/buildflags/buildflags.gni")
import("//third_party/blink/public/public_features.gni")

if (is_component_build) {
  link_target_type = "source_set"
} else {
  link_target_type = "static_library"
}
target(link_target_type, "child") {
  # Targets external to content should always link to the public API.
  # Internal targets can link to this but only if they're child processes
  # (i.e. not content/browser or content/common) and only if they're inside the
  # content component (i.e. not content/test or content/shell).
  visibility = [
    ":*",
    "//content/gpu/*",
    "//content/ppapi_plugin/*",
    "//content/public/child:child_sources",
    "//content/renderer/*",
    "//content/utility/*",
    "//tools/ipc_fuzzer/*",
  ]
  if (is_android) {
    # See comment in content/app/BUILD.gn above content_app_deps.
    visibility += [ "//content/app:*" ]
  }

  sources = [
    "assert_matching_enums.cc",
    "blink_platform_impl.cc",
    "blink_platform_impl.h",
    "browser_font_resource_trusted.cc",
    "browser_font_resource_trusted.h",
    "child_histogram_fetcher_impl.cc",
    "child_histogram_fetcher_impl.h",
    "child_process.cc",
    "child_process.h",
    "child_process_sandbox_support_impl_linux.cc",
    "child_process_sandbox_support_impl_linux.h",
    "child_process_sandbox_support_impl_mac.cc",
    "child_process_sandbox_support_impl_mac.h",
    "child_thread_impl.cc",
    "child_thread_impl.h",
    "dwrite_font_proxy/dwrite_font_proxy_init_impl_win.cc",
    "dwrite_font_proxy/dwrite_font_proxy_init_impl_win.h",
    "dwrite_font_proxy/dwrite_font_proxy_win.cc",
    "dwrite_font_proxy/dwrite_font_proxy_win.h",
    "dwrite_font_proxy/dwrite_localized_strings_win.cc",
    "dwrite_font_proxy/dwrite_localized_strings_win.h",
    "dwrite_font_proxy/font_fallback_win.cc",
    "dwrite_font_proxy/font_fallback_win.h",
    "field_trial.cc",
    "field_trial.h",
    "font_warmup_win.cc",
    "font_warmup_win.h",
    "image_decoder.cc",
    "image_decoder.h",
    "runtime_features.cc",
    "runtime_features.h",
    "scoped_child_process_reference.cc",
    "scoped_child_process_reference.h",
    "service_factory.cc",
    "service_factory.h",
    "thread_safe_sender.cc",
    "thread_safe_sender.h",
    "webthemeengine_impl_android.cc",
    "webthemeengine_impl_android.h",
    "webthemeengine_impl_default.cc",
    "webthemeengine_impl_default.h",
    "webthemeengine_impl_mac.h",
  ]

  configs += [ "//build/config:precompiled_headers" ]

  public_deps = [
    "//gpu/ipc/client:client",
    "//ipc",
    "//services/service_manager/public/mojom:mojom_blink",
  ]

  deps = [
    "//base",
    "//cc/paint",
    "//components/discardable_memory/client",
    "//components/discardable_memory/public/interfaces",
    "//components/tracing",
    "//components/tracing:startup_tracing",
    "//components/variations",
    "//components/webcrypto",
    "//content/app/resources",
    "//content/app/strings",
    "//content/common",
    "//content/public/common:common_sources",
    "//crypto:platform",
    "//gpu/command_buffer/client",
    "//media",
    "//media/blink",
    "//mojo/core/embedder",
    "//net",
    "//services/device/public/cpp:device_features",
    "//services/device/public/cpp/power_monitor",
    "//services/device/public/mojom:constants",
    "//services/resource_coordinator/public/cpp/memory_instrumentation",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/mojom",
    "//services/service_manager/runner/common",
    "//services/tracing/public/cpp",
    "//skia",
    "//storage/common",
    "//third_party/blink/public:blink_headers",
    "//third_party/blink/public:buildflags",
    "//third_party/blink/public:mojo_bindings",
    "//third_party/blink/public:resources",
    "//third_party/blink/public:scaled_resources",
    "//third_party/blink/public/common",
    "//third_party/ced",
    "//third_party/zlib/google:compression_utils",
    "//ui/base",
    "//ui/events/blink",
    "//ui/events/gestures/blink",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
    "//ui/native_theme",
    "//url",
    "//v8",
  ]

  if (!use_default_render_theme) {
    sources -= [
      "webthemeengine_impl_default.cc",
      "webthemeengine_impl_default.h",
    ]
  }

  if (is_android) {
    deps += [ "//third_party/android_tools:cpu_features" ]
  }

  if (is_linux) {
    deps += [
      "//components/services/font/public/cpp",
      "//components/services/font/public/interfaces",
      "//services/service_manager/zygote",
    ]
  }

  if (is_win) {
    libs = [ "dwrite.lib" ]
  }

  if (enable_plugins) {
    deps += [
      "//ppapi/proxy",
      "//ppapi/shared_impl",
    ]
  } else {
    sources -= [
      "browser_font_resource_trusted.cc",
      "browser_font_resource_trusted.h",
    ]
  }

  configs += [
    "//content:content_implementation",
    "//build/config/compiler:no_size_t_to_int_warning",
  ]
}

# See comment at the top of //content/BUILD.gn for how this works.
group("for_content_tests") {
  visibility = [ "//content/test/*" ]
  if (!is_component_build) {
    public_deps = [
      ":child",
    ]
  }
}
