# 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_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",
    "//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/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" ]
}
