# Copyright 2022 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.

static_library("web_events") {
  sources = [
    "custom_event.h",
    "environment_settings.h",
    "error_event.h",
    "event.cc",
    "event.h",
    "event_target.cc",
    "event_target.h",
    "event_target_listener_info.cc",
    "event_target_listener_info.h",
    "global_stats.cc",
    "global_stats.h",
    "on_error_event_listener.cc",
    "on_error_event_listener.h",
  ]

  deps = [
    ":dom_exception",
    "//cobalt/base",
    "//cobalt/browser:generated_bindings",
    "//cobalt/script",
    "//cobalt/script:engine",
    "//cobalt/script/v8c:engine",
    "//nb",
    "//url",
  ]

  public_deps = [
    # Additionally, ensure that the include directories for generated
    # headers are put on the include directories for targets that depend
    # on this one.
    ":dom_exception",
    "//cobalt/browser:generated_types",
  ]
}

static_library("web") {
  # Creates cycle with //cobalt/dom
  check_includes = false

  sources = [
    "agent.cc",
    "agent.h",
    "blob.cc",
    "blob.h",
    "buffer_source.cc",
    "buffer_source.h",
    "cache.cc",
    "cache.h",
    "cache_request.h",
    "cache_storage.cc",
    "cache_storage.h",
    "cache_utils.cc",
    "cache_utils.h",
    "cobalt_ua_data_values_interface.cc",
    "cobalt_ua_data_values_interface.h",
    "context.h",
    "crypto.cc",
    "crypto.h",
    "csp_delegate.cc",
    "csp_delegate.h",
    "csp_delegate_factory.cc",
    "csp_delegate_factory.h",
    "csp_violation_reporter.cc",
    "csp_violation_reporter.h",
    "environment_settings_helper.cc",
    "environment_settings_helper.h",
    "location_base.h",
    "message_event.cc",
    "message_event.h",
    "message_port.cc",
    "message_port.h",
    "navigator_base.cc",
    "navigator_base.h",
    "navigator_ua_data.cc",
    "navigator_ua_data.h",
    "security_policy_violation_event.cc",
    "security_policy_violation_event.h",
    "url.cc",
    "url.h",
    "url_registry.h",
    "url_utils.cc",
    "url_utils.h",
    "user_agent_platform_info.h",
    "window_or_worker_global_scope.cc",
    "window_or_worker_global_scope.h",
  ]

  deps = [
    ":web_events",
    "//cobalt/base",
    "//cobalt/browser:generated_bindings",
    "//cobalt/cache",
    "//cobalt/csp",
    "//cobalt/network",
    "//cobalt/network_bridge",
    "//cobalt/script",
    "//cobalt/script:engine",
    "//cobalt/script/v8c:engine",
    "//net",
    "//url",
  ]

  public_deps = [
    # Additionally, ensure that the include directories for generated
    # headers are put on the include directories for targets that depend
    # on this one.
    ":web_events",
    "//cobalt/browser:generated_types",
  ]
}

static_library("window_timers") {
  has_pedantic_warnings = true

  sources = [
    "window_timers.cc",
    "window_timers.h",
  ]

  deps = [
    ":stat_tracker",
    ":web_events",
    "//cobalt/base",
    "//cobalt/script",
    "//nb",
  ]
}

static_library("stat_tracker") {
  has_pedantic_warnings = true

  sources = [
    "stat_tracker.cc",
    "stat_tracker.h",
  ]

  deps = [ "//cobalt/base" ]
}

static_library("dom_exception") {
  has_pedantic_warnings = true

  sources = [
    "dom_exception.cc",
    "dom_exception.h",
  ]

  deps = [ "//cobalt/script" ]
}

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

  sources = [
    "blob_test.cc",
    "crypto_test.cc",
    "csp_delegate_test.cc",
    "custom_event_test.cc",
    "error_event_test.cc",
    "event_target_test.cc",
    "event_test.cc",
    "message_event_test.cc",
    "url_test.cc",
    "url_utils_test.cc",
    "window_timers_test.cc",
  ]

  deps = [
    ":stat_tracker",
    ":web",
    ":window_timers",
    "//cobalt/base",
    "//cobalt/browser:browser",
    "//cobalt/browser:generated_bindings",
    "//cobalt/browser:generated_types",
    "//cobalt/css_parser",
    "//cobalt/cssom",
    "//cobalt/dom/testing:dom_testing",
    "//cobalt/dom_parser",
    "//cobalt/loader",
    "//cobalt/script",
    "//cobalt/script/v8c:engine",
    "//cobalt/test:run_all_unittests",
    "//cobalt/web/testing:web_testing",
    "//nb",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]
}
