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

static_library("loader") {
  has_pedantic_warnings = true

  sources = [
    "blob_fetcher.cc",
    "blob_fetcher.h",
    "cache_fetcher.cc",
    "cache_fetcher.h",
    "cors_preflight.cc",
    "cors_preflight.h",
    "cors_preflight_cache.cc",
    "cors_preflight_cache.h",
    "decoder.h",
    "embedded_fetcher.cc",
    "embedded_fetcher.h",
    "error_fetcher.cc",
    "error_fetcher.h",
    "fetch_interceptor_coordinator.cc",
    "fetch_interceptor_coordinator.h",
    "fetcher.cc",
    "fetcher.h",
    "fetcher_cache.cc",
    "fetcher_cache.h",
    "fetcher_factory.cc",
    "fetcher_factory.h",
    "file_fetcher.cc",
    "file_fetcher.h",
    "font/remote_typeface_cache.h",
    "font/typeface_decoder.cc",
    "font/typeface_decoder.h",
    "image/animated_image_tracker.cc",
    "image/animated_image_tracker.h",
    "image/animated_webp_image.cc",
    "image/animated_webp_image.h",
    "image/dummy_gif_image_decoder.cc",
    "image/dummy_gif_image_decoder.h",
    "image/failure_image_decoder.h",
    "image/image.h",
    "image/image_cache.h",
    "image/image_data_decoder.cc",
    "image/image_data_decoder.h",
    "image/image_decoder.cc",
    "image/image_decoder.h",
    "image/image_encoder.cc",
    "image/image_encoder.h",
    "image/jpeg_image_decoder.cc",
    "image/jpeg_image_decoder.h",
    "image/lottie_animation.cc",
    "image/lottie_animation.h",
    "image/lottie_animation_decoder.cc",
    "image/lottie_animation_decoder.h",
    "image/png_image_decoder.cc",
    "image/png_image_decoder.h",
    "image/stub_image_decoder.h",
    "image/threaded_image_decoder_proxy.cc",
    "image/threaded_image_decoder_proxy.h",
    "image/webp_image_decoder.cc",
    "image/webp_image_decoder.h",
    "loader.cc",
    "loader.h",
    "loader_factory.cc",
    "loader_factory.h",
    "loader_types.h",
    "mesh/mesh_cache.h",
    "mesh/mesh_decoder.cc",
    "mesh/mesh_decoder.h",
    "mesh/mesh_projection.h",
    "mesh/projection_codec/constants.h",
    "mesh/projection_codec/indexed_vert.cc",
    "mesh/projection_codec/indexed_vert.h",
    "mesh/projection_codec/projection_decoder.cc",
    "mesh/projection_codec/projection_decoder.h",
    "net_fetcher.cc",
    "net_fetcher.h",
    "resource_cache.cc",
    "resource_cache.h",
    "script_loader_factory.cc",
    "script_loader_factory.h",
    "switches.cc",
    "switches.h",
    "sync_loader.cc",
    "sync_loader.h",
    "text_decoder.h",
    "url_fetcher_string_writer.cc",
    "url_fetcher_string_writer.h",
  ]

  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]

  deps = [
    ":embed_loader_resources_as_header_files",
    ":origin",
    "//cobalt/base",
    "//cobalt/configuration",
    "//cobalt/csp",
    "//cobalt/math",
    "//cobalt/network",
    "//cobalt/render_tree",
    "//cobalt/renderer/test/png_utils",
    "//cobalt/web",
    "//net",
    "//third_party/libjpeg-turbo:libjpeg",
    "//third_party/libpng",
    "//third_party/libwebp",
    "//third_party/protobuf:protobuf_lite",
    "//url",
  ]

  if (!is_gold) {
    sources += [
      "about_fetcher.cc",
      "about_fetcher.h",
    ]
    defines = [ "ENABLE_ABOUT_SCHEME" ]
    deps += [ "//cobalt/renderer/test/jpeg_utils" ]
  }
}

static_library("origin") {
  sources = [
    "origin.cc",
    "origin.h",
  ]

  deps = [
    "//base",
    "//url",
  ]
}

action("embed_loader_resources_as_header_files") {
  script = "//cobalt/build/generate_data_header.py"

  inputs = [
    "embedded_resources/black_splash_screen.html",
    "embedded_resources/cobalt_splash_screen.css",
    "embedded_resources/cobalt_splash_screen.html",
    "embedded_resources/cobalt_word_logo_356.png",
    "embedded_resources/dialog.css",
    "embedded_resources/dialog.js",
    "embedded_resources/equirectangular_40_40.msh",
    "embedded_resources/splash_screen.js",
    "embedded_resources/unable_message.html.template",
    "embedded_resources/update_message.html.template",
    "embedded_resources/black_splash_screen.html",
    "embedded_resources/cobalt_splash_screen.html",
  ]
  outputs = [ "$target_gen_dir/embedded_resources.h" ]

  args = [
    "LoaderEmbeddedResources",
    rebase_path(outputs[0], root_build_dir),
    rebase_path("embedded_resources", root_build_dir),
  ]
}

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

  sources = [
    "blob_fetcher_test.cc",
    "fetcher_factory_test.cc",
    "fetcher_test.h",
    "file_fetcher_test.cc",
    "font/typeface_decoder_test.cc",
    "image/image_decoder_test.cc",
    "image/image_decoder_unit_test.cc",
    "loader_test.cc",
    "mesh/mesh_decoder_test.cc",
    "text_decoder_test.cc",
  ]

  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]

  deps = [
    ":loader",
    "//cobalt/base:base",
    "//cobalt/browser:test_dependencies_on_browser",
    "//cobalt/dom",
    "//cobalt/dom_parser",
    "//cobalt/math:math",
    "//cobalt/render_tree",
    "//cobalt/test:run_all_unittests",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/ots:ots",
  ]

  data_deps = [ ":copy_loader_test_data" ]
}

copy("copy_loader_test_data") {
  install_content = true

  sources = [
    "testdata/baseline_jpeg.jpg",
    "testdata/empty.txt",
    "testdata/icons.ttf",
    "testdata/icons.woff",
    "testdata/icons.woff2",
    "testdata/interlaced_png.png",
    "testdata/non_interlaced_png.png",
    "testdata/performance-spike.html",
    "testdata/progressive_jpeg.jpg",
    "testdata/projection.box",
    "testdata/sandbox01.jpg",
    "testdata/sandbox01.png",
    "testdata/sandbox01.webp",
    "testdata/sandbox02.jpg",
    "testdata/sandbox02.png",
    "testdata/sandbox02.webp",
    "testdata/sandbox03.jpg",
    "testdata/sandbox03.png",
    "testdata/sandbox03.webp",
    "testdata/sandbox04.jpg",
    "testdata/sandbox04.webp",
    "testdata/sandbox05.jpg",
    "testdata/sandbox05.webp",
    "testdata/sandbox06.jpg",
    "testdata/sandbox06.webp",
    "testdata/sandbox07.jpg",
    "testdata/sandbox07.webp",
    "testdata/sandbox08.jpg",
    "testdata/sandbox08.webp",
    "testdata/sandbox09.jpg",
    "testdata/sandbox09.webp",
    "testdata/sandbox10.jpg",
    "testdata/sandbox10.webp",
    "testdata/sandbox11.jpg",
    "testdata/sandbox11.webp",
    "testdata/sandbox12.jpg",
    "testdata/sandbox12.webp",
    "testdata/sandbox13.jpg",
    "testdata/sandbox14.jpg",
    "testdata/sandbox14.webp",
    "testdata/sandbox15.jpg",
    "testdata/sandbox15.webp",
    "testdata/sandbox16.jpg",
    "testdata/sandbox16.webp",
    "testdata/sandbox17.jpg",
    "testdata/sandbox18.jpg",
    "testdata/vsauce_sm.webp",
    "testdata/webp_image.webp",
  ]

  file_path = "{{source_root_relative_dir}}/{{source_file_part}}"
  outputs = [ "$sb_static_contents_output_data_dir/test/$file_path" ]
}
