# 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("//testing/test.gni")
import("//v8/gni/v8.gni")

# This is depended upon from the browser DLL on Windows, where V8 is not used,
# but features are enabled. This cannot depend on V8.
source_set("gin_features") {
  sources = [
    "gin_export.h",
    "gin_features.cc",
    "public/gin_features.h",
  ]

  defines = [ "GIN_IMPLEMENTATION" ]

  deps = [
    "//base",
  ]

  assert_no_deps = [ "//v8" ]
}

component("gin") {
  sources = [
    "arguments.cc",
    "arguments.h",
    "array_buffer.cc",
    "array_buffer.h",
    "context_holder.cc",
    "converter.cc",
    "converter.h",
    "debug_impl.cc",
    "debug_impl.h",
    "dictionary.cc",
    "dictionary.h",
    "function_template.cc",
    "function_template.h",
    "gin_export.h",
    "handle.h",
    "interceptor.cc",
    "interceptor.h",
    "isolate_holder.cc",
    "modules/console.cc",
    "modules/console.h",
    "modules/file_module_provider.cc",
    "modules/file_module_provider.h",
    "modules/module_registry.cc",
    "modules/module_registry.h",
    "modules/module_registry_observer.h",
    "modules/module_runner_delegate.cc",
    "modules/module_runner_delegate.h",
    "modules/timer.cc",
    "modules/timer.h",
    "object_template_builder.cc",
    "object_template_builder.h",
    "per_context_data.cc",
    "per_context_data.h",
    "per_isolate_data.cc",
    "per_isolate_data.h",
    "public/context_holder.h",
    "public/debug.h",
    "public/gin_embedders.h",
    "public/isolate_holder.h",
    "public/v8_idle_task_runner.h",
    "public/v8_platform.h",
    "public/wrapper_info.h",
    "run_microtasks_observer.cc",
    "run_microtasks_observer.h",
    "runner.cc",
    "runner.h",
    "shell_runner.cc",
    "shell_runner.h",
    "try_catch.cc",
    "try_catch.h",
    "v8_initializer.cc",
    "v8_initializer.h",
    "v8_isolate_memory_dump_provider.cc",
    "v8_isolate_memory_dump_provider.h",
    "v8_platform.cc",
    "wrappable.cc",
    "wrappable.h",
    "wrapper_info.cc",
  ]

  if (v8_use_external_startup_data) {
    data = [
      "$root_out_dir/natives_blob.bin",
      "$root_out_dir/snapshot_blob.bin",
    ]
  }

  defines = [ "GIN_IMPLEMENTATION" ]

  public_deps = [
    "//base",
    "//v8",
  ]
  deps = [
    ":gin_features",
    "//base/third_party/dynamic_annotations",
    "//crypto",
  ]

  if (is_mac) {
    libs = [ "CoreFoundation.framework" ]
  }

  configs += [ "//v8:external_startup_data" ]
}

executable("gin_shell") {
  sources = [
    "shell/gin_main.cc",
  ]

  deps = [
    ":gin",
    "//base",
    "//base:i18n",
    "//build/config/sanitizers:deps",
    "//build/win:default_exe_manifest",
    "//v8",
  ]

  configs += [ "//v8:external_startup_data" ]
}

source_set("gin_test") {
  testonly = true
  sources = [
    "test/file.cc",
    "test/file.h",
    "test/file_runner.cc",
    "test/file_runner.h",
    "test/gc.cc",
    "test/gc.h",
    "test/gtest.cc",
    "test/gtest.h",
    "test/v8_test.cc",
    "test/v8_test.h",
  ]
  data = [
    "test/expect.js",
  ]

  public_deps = [
    ":gin",
    "//testing/gtest",
  ]
  deps = [
    "//v8",
  ]

  configs += [ "//v8:external_startup_data" ]
}

test("gin_unittests") {
  sources = [
    "converter_unittest.cc",
    "interceptor_unittest.cc",
    "modules/module_registry_unittest.cc",
    "modules/timer_unittest.cc",
    "per_context_data_unittest.cc",
    "shell/gin_shell_unittest.cc",
    "shell_runner_unittest.cc",
    "test/run_all_unittests.cc",
    "test/run_js_tests.cc",
    "v8_isolate_memory_dump_provider_unittest.cc",
    "v8_platform_unittest.cc",
    "wrappable_unittest.cc",
  ]

  deps = [
    ":gin_shell",
    ":gin_test",
    "//base/test:test_support",
    "//v8",
  ]

  configs += [ "//v8:external_startup_data" ]

  data = [
    "modules/module_registry_unittests.js",
    "shell/hello_world.js",
    "test/file_unittests.js",
    "test/gtest_unittests.js",
    "../OWNERS",
  ]

  data_deps = [
    ":gin_shell",
  ]
}
