# 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 (v8_use_external_startup_data && is_win) {
    public_deps += [ ":gin_v8_snapshot_fingerprint" ]
    sources += [ "$target_gen_dir/v8_snapshot_fingerprint.cc" ]
    defines += [ "V8_VERIFY_EXTERNAL_STARTUP_DATA" ]
  }

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

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

if (v8_use_external_startup_data) {
  action("gin_v8_snapshot_fingerprint") {
    script = "//gin/fingerprint/fingerprint_v8_snapshot.py"

    snapshot_file = "$root_out_dir/snapshot_blob.bin"
    natives_file = "$root_out_dir/natives_blob.bin"
    output_file = "$target_gen_dir/v8_snapshot_fingerprint.cc"

    args = [
      "--snapshot_file",
      rebase_path(snapshot_file, root_build_dir),
      "--natives_file",
      rebase_path(natives_file, root_build_dir),
      "--output_file",
      rebase_path(output_file, root_build_dir),
    ]
    inputs = [
      snapshot_file,
      natives_file,
    ]
    outputs = [
      output_file,
    ]

    deps = [
      "//v8",
    ]
  }
}

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",
    "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",
  ]
}
