# 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"

# Array of all interfaces that need global constructors.
_global_constructor_interfaces = [
  "Window",
  "DedicatedWorkerGlobalScope",
  "ServiceWorkerGlobalScope",
]

target(final_executable_type, "cobalt") {
  sources = [ "main.cc" ]
  deps = [
    ":browser",
    ":browser_switches",
    "//cobalt/base",
    "//cobalt/css_parser",
    "//net",
  ]
  data_deps = [
    "//cobalt/network:copy_ssl_certificates",
    "//third_party/icu:icudata",
  ]
  if (cobalt_font_package == "empty") {
    data_deps += [ "//cobalt/content/fonts:copy_font_data" ]
  } else {
    data_deps += [
      "//cobalt/content/fonts:copy_fonts",
      "//cobalt/content/fonts:fonts_xml",
    ]
  }
  if (sb_is_evergreen) {
    data_deps += [ "//cobalt/updater/version_manifest:copy_version_manifest" ]
  }
  if (!is_gold) {
    data_deps += [
      "//cobalt/debug/backend/content:copy_backend_web_files",
      "//cobalt/debug/console/content:copy_console_web_files",
      "//cobalt/debug/remote/content:copy_remote_web_files",
      "//cobalt/speech:speech_testdata",
      "//cobalt/webdriver:copy_webdriver_data",
      "//third_party/devtools:build_release_devtools",
      "//third_party/devtools:copy_devtools_modules",
      "//third_party/devtools:copy_inspector_images",
      "//third_party/devtools:frontend_protocol_sources",
      "//third_party/devtools:supported_css_properties",
    ]
  }
}

##############################
# 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",
    "client_hint_headers.cc",
    "client_hint_headers.h",
    "device_authentication.cc",
    "device_authentication.h",
    "loader_app_metrics.cc",
    "loader_app_metrics.h",
    "on_screen_keyboard_extension_bridge.cc",
    "on_screen_keyboard_extension_bridge.h",
    "render_tree_combiner.cc",
    "render_tree_combiner.h",
    "screen_shot_writer.cc",
    "screen_shot_writer.h",
    "service_worker_registry.cc",
    "service_worker_registry.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",
    ":generated_bindings",
    ":generated_types",
    "//cobalt/audio",
    "//cobalt/base",
    "//cobalt/browser/memory_settings:browser_memory_settings",
    "//cobalt/browser/metrics",
    "//cobalt/build:cobalt_build_id",
    "//cobalt/build:cobalt_build_info",
    "//cobalt/cache",
    "//cobalt/configuration",
    "//cobalt/css_parser",
    "//cobalt/cssom",
    "//cobalt/dom_parser",
    "//cobalt/encoding:text_encoding",
    "//cobalt/fetch",
    "//cobalt/h5vcc",
    "//cobalt/input",
    "//cobalt/js_profiler",
    "//cobalt/layout",
    "//cobalt/loader",
    "//cobalt/math",
    "//cobalt/media",
    "//cobalt/media_capture",
    "//cobalt/media_session",
    "//cobalt/network",
    "//cobalt/overlay_info",
    "//cobalt/persistent_storage:persistent_settings",
    "//cobalt/render_tree",
    "//cobalt/renderer",
    "//cobalt/renderer/test/png_utils",
    "//cobalt/script",
    "//cobalt/script:engine",
    "//cobalt/speech",
    "//cobalt/storage",
    "//cobalt/subtlecrypto",
    "//cobalt/system_window",
    "//cobalt/trace_event",
    "//cobalt/ui_navigation",
    "//cobalt/ui_navigation/scroll_engine",
    "//cobalt/watchdog",
    "//cobalt/web",
    "//cobalt/webdriver",
    "//cobalt/websocket",
    "//cobalt/worker",
    "//cobalt/xhr",
    "//components/metrics",
    "//components/metrics_services_manager",
    "//crypto",
    "//net",
    "//starboard:starboard_group",
    "//starboard/common",
    "//third_party/icu:icui18n",
    "//third_party/protobuf:protobuf_lite",
    "//url",
  ]

  if (is_gold) {
    defines = [ "COBALT_FORCE_HTTPS" ]
  } else {
    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 = [
    "client_hint_headers_test.cc",
    "device_authentication_test.cc",
    "loader_app_metrics_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",
    "user_agent_string_test.cc",
  ]

  deps = [
    ":browser",
    ":browser_switches",
    "//cobalt/base",
    "//cobalt/browser/memory_settings:browser_memory_settings",
    "//cobalt/dom",
    "//cobalt/loader",
    "//cobalt/math",
    "//cobalt/network",
    "//cobalt/speech",
    "//cobalt/storage",
    "//cobalt/test:run_all_unittests",
    "//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/h5vcc",
    "//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 files that define all the constructors that are on the global
  # scope objects.
  global_names_idl_path = _generated_idls_output_dir
  interfaces = _global_constructor_interfaces

  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 files that will define all the constructors that should be
  # on the global scope objects.
  global_names_idl_path = _generated_idls_output_dir
  interfaces = _global_constructor_interfaces
  deps = [ ":global_objects" ]
}

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

  # Generated IDL files that define all the constructors that are on the global
  # scope objects.
  global_names_idl_path = _generated_idls_output_dir
  interfaces = _global_constructor_interfaces
  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
}

group("test_dependencies_on_browser") {
  testonly = true

  # TODO: 297087147 - Depend on smaller targets than browser.
  deps = [ "//cobalt/browser" ]
}
