# 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",
    "//net",
  ]
  data_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") {
    data_deps += [ "//cobalt/content/fonts:copy_font_data" ]
  } else {
    data_deps += [
      "//cobalt/content/fonts:copy_fonts",
      "//cobalt/content/fonts:fonts_xml",
    ]
  }
  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",
      "//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",
    "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",
    "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/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/persistent_storage:persistent_settings",
    "//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/watchdog",
    "//cobalt/web",
    "//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) {
    defines = [ "COBALT_FORCE_HTTPS" ]
  } else {
    sources += [
      "debug_console.cc",
      "debug_console.h",
      "lifecycle_console_commands.cc",
      "lifecycle_console_commands.h",
    ]
    defines = [
      "ENABLE_ABOUT_SCHEME",
      "COBALT_ENABLE_JAVASCRIPT_ERROR_LOGGING",
    ]
    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/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
}

target(final_executable_type, "snapshot_app_stats") {
  sources = [ "snapshot_app_stats.cc" ]
  deps = [
    ":browser",
    ":browser_switches",
    ":cobalt",
    "//cobalt/base",
    "//third_party/protobuf:protobuf_lite",
  ]
}
