# 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",
    "dedicated_worker.cc",
    "dedicated_worker.h",
    "dedicated_worker_global_scope.cc",
    "dedicated_worker_global_scope.h",
    "message_port.cc",
    "message_port.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",
    "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 = [ "//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/dom:window_timers",
  ]
}

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

  sources = [ "worker_location_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",
    "//nb",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]
}
