# 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

  # Includes cobalt/dom/url_utils.h from dom that depends on this target.
  check_includes = false

  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",
    "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_decoder_starboard.cc",
    "image/image_decoder_starboard.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",
    "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",
    "//nb",
    "//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 = [
    ":copy_loader_test_data",
    ":loader",
    "//cobalt/base:base",
    "//cobalt/dom",
    "//cobalt/dom_parser",
    "//cobalt/math:math",
    "//cobalt/render_tree",
    "//cobalt/test:run_all_unittests",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/ots:ots",
  ]

  deps += cobalt_platform_dependencies
}

copy("copy_loader_test_data") {
  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" ]
}
