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

component("gin") {
  sources = [
    "arguments.cc",
    "arguments.h",
    "array_buffer.cc",
    "array_buffer.h",
    "context_holder.cc",
    "converter.cc",
    "converter.h",
    "data_object_builder.cc",
    "data_object_builder.h",
    "debug_impl.cc",
    "debug_impl.h",
    "dictionary.cc",
    "dictionary.h",
    "function_template.cc",
    "function_template.h",
    "gin_export.h",
    "gin_features.cc",
    "gin_features.h",
    "handle.h",
    "interceptor.cc",
    "interceptor.h",
    "isolate_holder.cc",
    "modules/console.cc",
    "modules/console.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",
    "runner.cc",
    "runner.h",
    "shell_runner.cc",
    "shell_runner.h",
    "try_catch.cc",
    "try_catch.h",
    "v8_foreground_task_runner.cc",
    "v8_foreground_task_runner.h",
    "v8_foreground_task_runner_base.cc",
    "v8_foreground_task_runner_base.h",
    "v8_foreground_task_runner_with_locker.cc",
    "v8_foreground_task_runner_with_locker.h",
    "v8_initializer.cc",
    "v8_initializer.h",
    "v8_isolate_memory_dump_provider.cc",
    "v8_isolate_memory_dump_provider.h",
    "v8_platform.cc",
    "v8_shared_memory_dump_provider.cc",
    "v8_shared_memory_dump_provider.h",
    "wrappable.cc",
    "wrappable.h",
    "wrapper_info.cc",
  ]

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

  defines = [ "GIN_IMPLEMENTATION" ]

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

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

  configs += [
    "//tools/v8_context_snapshot:use_v8_context_snapshot",
    "//v8:external_startup_data",
  ]
}

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

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

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

source_set("gin_test") {
  testonly = true
  sources = [
    "test/v8_test.cc",
    "test/v8_test.h",
  ]

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

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

test("gin_unittests") {
  sources = [
    "arguments_unittest.cc",
    "array_buffer_unittest.cc",
    "converter_unittest.cc",
    "data_object_builder_unittest.cc",
    "interceptor_unittest.cc",
    "per_context_data_unittest.cc",
    "shell_runner_unittest.cc",
    "test/run_all_unittests.cc",
    "v8_isolate_memory_dump_provider_unittest.cc",
    "v8_platform_unittest.cc",
    "v8_shared_memory_dump_provider_unittest.cc",
    "wrappable_unittest.cc",
  ]

  deps = [
    ":gin_test",
    "//base/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//v8",
  ]

  configs += [
    "//tools/v8_context_snapshot:use_v8_context_snapshot",
    "//v8:external_startup_data",
  ]

  data_deps = [ "//tools/v8_context_snapshot:v8_context_snapshot" ]
  data = []

  # gin_shell is not an Android app.
  if (!is_android) {
    sources += [ "shell/gin_shell_unittest.cc" ]
    deps += [ ":gin_shell" ]
    data_deps += [ ":gin_shell" ]
    data += [ "shell/hello_world.js" ]
  }

  # On Android, the APK must bundle the startup data.
  if (is_android) {
    if (use_v8_context_snapshot) {
      deps += [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ]
    } else {
      deps += [ "//v8:v8_external_startup_data_assets" ]
    }
  }
}
