# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//cobalt/bindings/bindings_templates.gni")
import("//cobalt/browser/idl_files.gni")
import("//cobalt/script/v8c/v8c_variables.gni")

##########################################################
# Configuration variables for bindings generation scripts.
##########################################################

_bindings_output_dir = "$root_gen_dir/bindings/browser"
_bindings_scripts_output_dir = "$_bindings_output_dir/scripts"

# Blink interface info is calculated in two stages. First at a per-component level
# (in Blink this is core or modules) and then these are combined. While Cobalt
# currently does not and may not need to distinguish between components, we adhere to
# Blink's process for simplicity.
_component_info_pickle = "$_bindings_scripts_output_dir/component_info.pickle"
_interfaces_info_individual_pickle =
    "$_bindings_scripts_output_dir/interfaces_info_individual.pickle"
_interfaces_info_combined_pickle =
    "$_bindings_scripts_output_dir/interfaces_info_overall.pickle"
_global_objects_pickle = "$_bindings_scripts_output_dir/GlobalObjects.pickle"

# Base directory into which generated bindings source files will be
# generated. Directory structure will mirror the directory structure
# that the .idl files came from.
_generated_source_output_dir = "$_bindings_output_dir/source"

# Directory containing generated IDL files.
_generated_idls_output_dir = "$_bindings_output_dir/idl"

target(final_executable_type, "cobalt") {
  sources = [ "main.cc" ]
  deps = [
    ":browser",
    ":browser_switches",
    "//cobalt/base",
    "//net",
  ]
  content_deps = [
    "//cobalt/dom:licenses",
    "//cobalt/network:copy_ssl_certificates",
    "//cobalt/speech:speech_testdata",
    "//cobalt/webdriver:copy_webdriver_data",
    "//third_party/icu:icudata",
  ]
  if (cobalt_font_package == "empty") {
    content_deps += [ "//cobalt/content/fonts:copy_font_data" ]
  } else {
    content_deps += [
      "//cobalt/content/fonts:copy_fonts",
      "//cobalt/content/fonts:fonts_xml",
    ]
  }
  if (!is_gold) {
    content_deps += [ "//cobalt/debug:copy_backend_web_files" ]
  }
}

##############################
# Bindings generation targets.
##############################

config("bindings_includes") {
  include_dirs = [ _generated_source_output_dir ]
}

source_set("browser_switches") {
  has_pedantic_warnings = true
  sources = [
    "switches.cc",
    "switches.h",
  ]
  public_deps = [ "//starboard:starboard_headers_only" ]
}

static_library("browser") {
  has_pedantic_warnings = true

  sources = [
    "application.cc",
    "application.h",
    "browser_module.cc",
    "browser_module.h",
    "device_authentication.cc",
    "device_authentication.h",
    "lifecycle_observer.h",
    "on_screen_keyboard_starboard_bridge.cc",
    "on_screen_keyboard_starboard_bridge.h",
    "render_tree_combiner.cc",
    "render_tree_combiner.h",
    "screen_shot_writer.cc",
    "screen_shot_writer.h",
    "splash_screen.cc",
    "splash_screen.h",
    "splash_screen_cache.cc",
    "splash_screen_cache.h",
    "suspend_fuzzer.cc",
    "suspend_fuzzer.h",
    "system_platform_error_handler.cc",
    "system_platform_error_handler.h",
    "url_handler.cc",
    "url_handler.h",
    "user_agent_platform_info.cc",
    "user_agent_platform_info.h",
    "user_agent_string.cc",
    "user_agent_string.h",
    "web_module.cc",
    "web_module.h",
    "web_module_stat_tracker.cc",
    "web_module_stat_tracker.h",
  ]

  public_deps = [ "//cobalt/dom" ]

  deps = [
    ":bindings",
    ":browser_switches",
    "//cobalt/account",
    "//cobalt/audio",
    "//cobalt/base",
    "//cobalt/browser/memory_settings:browser_memory_settings",
    "//cobalt/browser/memory_tracker:memory_tracker_tool",
    "//cobalt/build:cobalt_build_id",
    "//cobalt/configuration",
    "//cobalt/css_parser",
    "//cobalt/cssom",
    "//cobalt/dom_parser",
    "//cobalt/encoding:text_encoding",
    "//cobalt/fetch",
    "//cobalt/h5vcc",
    "//cobalt/input",
    "//cobalt/layout",
    "//cobalt/loader",
    "//cobalt/math",
    "//cobalt/media",
    "//cobalt/media_capture",
    "//cobalt/media_session",
    "//cobalt/network",
    "//cobalt/overlay_info",
    "//cobalt/render_tree",
    "//cobalt/renderer",
    "//cobalt/renderer/test/png_utils",
    "//cobalt/script",
    "//cobalt/script:engine",
    "//cobalt/speech",
    "//cobalt/sso",
    "//cobalt/storage",
    "//cobalt/subtlecrypto",
    "//cobalt/system_window",
    "//cobalt/trace_event",
    "//cobalt/ui_navigation",
    "//cobalt/webdriver",
    "//cobalt/websocket",
    "//cobalt/worker",
    "//cobalt/xhr",
    "//crypto",
    "//nb",
    "//net",
    "//starboard",
    "//third_party/icu:icui18n",
    "//third_party/protobuf:protobuf_lite",
    "//url",
  ]

  if (!is_gold) {
    sources += [
      "debug_console.cc",
      "debug_console.h",
      "lifecycle_console_commands.cc",
      "lifecycle_console_commands.h",
    ]
    defines = [ "ENABLE_ABOUT_SCHEME" ]
    deps += [
      "//cobalt/debug",
      "//cobalt/debug:console_command_manager",
    ]
  }

  if (sb_is_evergreen) {
    deps += [ "//cobalt/updater" ]
  } else {
    deps += cobalt_platform_dependencies
  }
}

target(gtest_target_type, "browser_test") {
  testonly = true
  has_pedantic_warnings = true

  sources = [
    "device_authentication_test.cc",
    "memory_settings/auto_mem_settings_test.cc",
    "memory_settings/auto_mem_test.cc",
    "memory_settings/calculations_test.cc",
    "memory_settings/memory_settings_test.cc",
    "memory_settings/pretty_print_test.cc",
    "memory_settings/table_printer_test.cc",
    "memory_settings/test_common.h",
    "memory_tracker/tool/tool_impl_test.cc",
    "memory_tracker/tool/util_test.cc",
    "user_agent_string_test.cc",
  ]

  deps = [
    ":browser",
    ":browser_switches",
    "//cobalt/base",
    "//cobalt/browser/memory_settings:browser_memory_settings",
    "//cobalt/browser/memory_tracker:memory_tracker_tool",
    "//cobalt/dom",
    "//cobalt/loader",
    "//cobalt/math",
    "//cobalt/network",
    "//cobalt/speech",
    "//cobalt/storage",
    "//cobalt/test:run_all_unittests",
    "//nb",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

group("bindings") {
  public_configs = [ ":bindings_includes" ]

  deps = [
    ":generated_bindings_sources",
    ":generated_types_sources",
    "//cobalt/h5vcc",
    "//cobalt/webdriver",
  ]
}

idl_compile("generated_bindings") {
  sources = source_idl_files

  cache_directory = _bindings_scripts_output_dir
  component_info = _component_info_pickle
  interfaces_info = _interfaces_info_combined_pickle
  output_directory = _generated_source_output_dir
  header_prefix = "${generated_bindings_prefix}"

  # TODO(b/211055528): Missing deps from generated sources.
  deps = [
    ":cached_jinja_templates",
    ":cached_lex_yacc_tables",
    ":generated_type_conversion",
    ":generated_types",
    ":global_constructors_idls",
    ":interfaces_info_individual",
    ":interfaces_info_overall",
    "//cobalt/script:engine",
  ]
  public_deps = engine_dependencies

  public_configs = [ ":bindings_includes" ]
}

source_set("generated_bindings_sources") {
  sources = get_target_outputs(":generated_bindings")
  public_deps = [ ":generated_bindings" ]
  deps = [
    # Ensure that all the files have been generated before trying to compile.
    ":generated_types",
    "//cobalt/webdriver",
  ]
}

idl_compile("generated_types") {
  sources = generated_header_idl_files

  cache_directory = _bindings_scripts_output_dir
  component_info = _component_info_pickle
  interfaces_info = _interfaces_info_combined_pickle
  output_directory = _generated_source_output_dir

  # TODO(b/211055528): Missing deps from generated sources.
  deps = [
    ":cached_jinja_templates",
    ":cached_lex_yacc_tables",
    ":global_constructors_idls",
    ":interfaces_info_individual",
    ":interfaces_info_overall",
  ]
  public_deps = engine_dependencies

  public_configs = [ ":bindings_includes" ]
}

source_set("generated_types_sources") {
  sources = get_target_outputs(":generated_types")
  public_deps = [ ":generated_types" ]
  deps = [
    # Ensure that all the files have been generated before trying to compile.
    ":generated_bindings",
  ]
}

generate_type_conversion("generated_type_conversion") {
  # TODO(b/211055528): Missing deps from generated sources.
  deps = [
    ":cached_jinja_templates",
    ":cached_lex_yacc_tables",
    ":global_constructors_idls",
    ":interfaces_info_overall",
  ]

  # Generated IDL file that will define all the constructors that should be
  # on the Window object.
  global_names_idl_file =
      "$_generated_idls_output_dir/dom/window_constructors.idl"

  inputs = [ _interfaces_info_combined_pickle ]
  inputs += source_idl_files
  inputs += generated_header_idl_files

  cache_directory = _bindings_scripts_output_dir
  output_dir = _generated_source_output_dir
  interfaces_info = _interfaces_info_combined_pickle
  component_info = _component_info_pickle
}

compute_global_objects("global_objects") {
  idl_files = source_idl_files + generated_header_idl_files

  global_objects_file = _global_objects_pickle
}

compute_global_constructors_idls("global_constructors_idls") {
  idl_files = source_idl_files

  global_objects_file = _global_objects_pickle

  # Generated IDL file that will define all the constructors that should be
  # on the Window object.
  global_names_idl_file =
      "$_generated_idls_output_dir/dom/window_constructors.idl"

  # Dummy header file which is generated because the idl compiler assumes
  # there is a header for each IDL.
  global_constructors_generated_header_file =
      "$_generated_idls_output_dir/dom/window_constructors.h"

  deps = [ ":global_objects" ]
}

compute_interfaces_info_individual("interfaces_info_individual") {
  idl_files =
      source_idl_files + generated_header_idl_files + dependency_idl_files

  # Generated IDL file that will define all the constructors that should be
  # on the Window object.
  generated_idl_files =
      "$_generated_idls_output_dir/dom/window_constructors.idl"
  component_info_file = _component_info_pickle
  interfaces_info_file = _interfaces_info_individual_pickle
  cache_directory = _bindings_scripts_output_dir

  deps = [
    ":cached_lex_yacc_tables",
    ":global_constructors_idls",
  ]
}

generate_interfaces_info_overall("interfaces_info_overall") {
  individual_interfaces_file = _interfaces_info_individual_pickle
  combined_interfaces_file = _interfaces_info_combined_pickle
  deps = [ ":interfaces_info_individual" ]
}

cache_lex_tables("cached_lex_yacc_tables") {
  output_dir = _bindings_scripts_output_dir
}

cache_templates("cached_jinja_templates") {
  output_dir = _bindings_scripts_output_dir
}
