# Copyright 2017 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/ui.gni")
import("//testing/test.gni")
import("//third_party/blink/renderer/bindings/bindings.gni")
import("//third_party/blink/renderer/config.gni")
import("//third_party/blink/renderer/core/core.gni")
import("//third_party/blink/renderer/modules/modules.gni")

visibility = [
  "//:gn_all",
  "//third_party/blink/*",
]

component("controller") {
  output_name = "blink_controller"

  deps = [
    "//components/performance_manager/public/mojom:mojom_blink",
    "//skia",
    "//third_party/blink/renderer/core",
    "//third_party/blink/renderer/modules",
    "//third_party/blink/renderer/platform",
    "//v8",
  ]

  configs += [
    "//build/config/compiler:noshadowing",
    "//build/config/compiler:wexit_time_destructors",
    "//third_party/blink/renderer:config",
    "//third_party/blink/renderer:inside_blink",
    "//third_party/blink/renderer:non_test_config",
    "//third_party/blink/renderer/core:blink_core_pch",
  ]

  defines = [ "BLINK_CONTROLLER_IMPLEMENTATION=1" ]

  sources = [
    "blink_initializer.cc",
    "blink_initializer.h",
    "blink_leak_detector.cc",
    "blink_leak_detector.h",
    "controller_export.h",
    "dev_tools_frontend_impl.cc",
    "dev_tools_frontend_impl.h",
    "memory_usage_monitor.cc",
    "memory_usage_monitor.h",
    "performance_manager/renderer_resource_coordinator_impl.cc",
    "performance_manager/renderer_resource_coordinator_impl.h",
    "performance_manager/v8_detailed_memory_reporter_impl.cc",
    "performance_manager/v8_detailed_memory_reporter_impl.h",
    "performance_manager/v8_worker_memory_reporter.cc",
    "performance_manager/v8_worker_memory_reporter.h",
  ]

  if (is_linux || is_chromeos) {
    sources += [
      "memory_usage_monitor_posix.cc",
      "memory_usage_monitor_posix.h",
    ]
    deps += [ "//third_party/blink/public/mojom:memory_usage_monitor_linux_mojo_bindings_blink" ]
  }
  if (is_android) {
    sources += [
      "crash_memory_metrics_reporter_impl.cc",
      "crash_memory_metrics_reporter_impl.h",
      "memory_usage_monitor_posix.cc",
      "memory_usage_monitor_posix.h",
      "oom_intervention_impl.cc",
      "oom_intervention_impl.h",
    ]
    public_deps = [ "//third_party/blink/public/mojom:memory_usage_monitor_linux_mojo_bindings_blink" ]
  }
  if (is_win) {
    sources += [
      "memory_usage_monitor_win.cc",
      "memory_usage_monitor_win.h",
    ]
  }
  if (is_mac) {
    sources += [
      "memory_usage_monitor_mac.cc",
      "memory_usage_monitor_mac.h",
    ]
    frameworks = [
      "AppKit.framework",
      "Foundation.framework",
    ]
  }

  # HighestPmfReporter depends on MemoryUsageMonitor and MemoryUsageMonitor
  # depends on platform specific code. Explicitly specify supported platforms.
  if (is_linux || is_chromeos || is_win || is_android || is_mac) {
    sources += [
      "highest_pmf_reporter.cc",
      "highest_pmf_reporter.h",
      "user_level_memory_pressure_signal_generator.cc",
      "user_level_memory_pressure_signal_generator.h",
    ]
  }

  configs -= [ "//build/config/compiler:default_symbols" ]
  configs += blink_symbols_config
}

group("blink_unittests_data") {
  data = [
    "../core/testing/data/",
    "../core/paint/test_data/",
    "../core/animation/test_data/",
  ]
}

# Old name of blink_unittests.
# TODO(tkent): Remove this after removing external dependency.
group("webkit_unit_tests") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "*" ]
  testonly = true
  deps = [ ":blink_unittests" ]
}

test("blink_unittests") {
  deps = [ ":blink_unittests_sources" ]

  data_deps = [
    ":blink_unittests_data",
    "//content/shell:pak",
  ]

  if (is_android) {
    deps += [
      "//base:base_java",
      "//content/public/android:content_java",
      "//content/shell/android:content_shell_assets",
      "//net/android:net_java",
    ]

    if (enable_chrome_android_internal) {
      data_deps += [ "//clank/build/bot/filters:blink_unittests_filters" ]
    }
  }
}

test("blink_perf_tests") {
  deps = [ ":blink_perf_tests_sources" ]
}

source_set("blink_perf_tests_sources") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "*" ]
  testonly = true

  sources = [ "tests/run_all_tests.cc" ]

  deps = [
    ":controller",
    "//base",
    "//base/test:test_support",
    "//content/test:test_support",
    "//third_party/blink/renderer/core:core",
    "//third_party/blink/renderer/core:perf_tests",
  ]

  configs += [
    "//third_party/blink/renderer:config",
    "//third_party/blink/renderer:inside_blink",
    "//third_party/blink/renderer/core:blink_core_pch",
  ]
}

source_set("blink_bindings_test_sources") {
  testonly = true
  sources = bindings_unittest_files
  deps = [
    "//base/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/blink/public:test_headers",
    "//third_party/blink/renderer/core:testing",
    "//third_party/blink/renderer/core:unit_test_support",
    "//third_party/blink/renderer/modules:modules",
    "//third_party/blink/renderer/platform:platform",
    "//third_party/blink/renderer/platform:test_support",
  ]
  configs += [
    "//third_party/blink/renderer:config",
    "//third_party/blink/renderer:inside_blink",
    "//third_party/blink/renderer/core:blink_core_pch",
  ]
}

source_set("blink_unittests_sources") {
  visibility = []  # Allow re-assignment of list.
  visibility = [ "*" ]
  testonly = true

  sources = [
    "performance_manager/renderer_resource_coordinator_impl_test.cc",
    "performance_manager/v8_detailed_memory_reporter_impl_test.cc",
    "performance_manager/v8_worker_memory_reporter_test.cc",
    "tests/run_all_tests.cc",
  ]
  if (is_linux || is_chromeos) {
    sources += [ "memory_usage_monitor_posix_test.cc" ]
  }
  if (is_android) {
    sources += [
      "memory_usage_monitor_posix_test.cc",
      "oom_intervention_impl_test.cc",
      "user_level_memory_pressure_signal_generator_test.cc",
    ]
  }

  if (is_linux || is_chromeos || is_android || is_mac || is_win) {
    sources += [
      "highest_pmf_reporter_test.cc",
      "memory_usage_monitor_test.cc",
    ]
  }

  deps = [
    ":blink_bindings_test_sources",
    ":controller",
    "//base",
    "//base:i18n",
    "//base/test:test_support",
    "//components/payments/mojom:mojom_blink",
    "//components/performance_manager/public/mojom:mojom_blink",
    "//content/test:test_support",
    "//gpu:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/blink/renderer/core:testing",
    "//third_party/blink/renderer/core:unit_test_support",
    "//third_party/blink/renderer/core:unit_tests",
    "//third_party/blink/renderer/modules:modules",
    "//third_party/blink/renderer/modules:unit_tests",
    "//third_party/blink/renderer/modules/exported:test_support",
    "//third_party/blink/renderer/platform",
    "//third_party/blink/renderer/platform:test_support",
    "//third_party/blink/renderer/platform:unit_tests",
    "//third_party/blink/renderer/platform/wtf",
    "//third_party/libwebp",
    "//third_party/zlib",
    "//url",
    "//v8",
  ]

  configs += [
    "//third_party/blink/renderer:config",
    "//third_party/blink/renderer:inside_blink",
    "//third_party/blink/renderer/core:blink_core_pch",
  ]
}
