# 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",
    "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",
    "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",
    "//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 = [
    ":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",
  ]

  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" ]
}
