# 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("worker") {
  # Creates cycle with //cobalt/dom
  check_includes = false

  sources = [
    "abstract_worker.h",
    "client.cc",
    "client.h",
    "clients.cc",
    "clients.h",
    "dedicated_worker.cc",
    "dedicated_worker.h",
    "dedicated_worker_global_scope.cc",
    "dedicated_worker_global_scope.h",
    "extendable_event.h",
    "extendable_message_event.h",
    "navigation_preload_manager.cc",
    "navigation_preload_manager.h",
    "service_worker.cc",
    "service_worker.h",
    "service_worker_container.cc",
    "service_worker_container.h",
    "service_worker_global_scope.cc",
    "service_worker_global_scope.h",
    "service_worker_jobs.cc",
    "service_worker_jobs.h",
    "service_worker_object.cc",
    "service_worker_object.h",
    "service_worker_registration.cc",
    "service_worker_registration.h",
    "service_worker_registration_map.cc",
    "service_worker_registration_map.h",
    "service_worker_registration_object.cc",
    "service_worker_registration_object.h",
    "window_client.cc",
    "window_client.h",
    "worker.cc",
    "worker.h",
    "worker_global_scope.cc",
    "worker_global_scope.h",
    "worker_location.h",
    "worker_navigator.cc",
    "worker_navigator.h",
    "worker_settings.cc",
    "worker_settings.h",
  ]

  deps = [
    "//cobalt/browser:generated_bindings",
    "//cobalt/web",
    "//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.
    "//cobalt/browser:generated_types",
    "//cobalt/web:window_timers",
  ]
}

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

  sources = [
    "dedicated_worker_global_scope_test.cc",
    "service_worker_global_scope_test.cc",
    "worker_global_scope_test.cc",
    "worker_location_test.cc",
    "worker_navigator_test.cc",
  ]

  deps = [
    ":worker",
    "//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",
    "//cobalt/worker/testing:worker_testing",
    "//nb",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]
}
