# Copyright 2018 The PDFium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("../../pdfium.gni")
import("../../testing/test.gni")

source_set("unowned_ptr") {
  sources = [ "unowned_ptr.h" ]
  deps = [ "../../third_party:pdfium_compiler_specific" ]
  configs += [ "../../:pdfium_strict_config" ]
}

source_set("fxcrt") {
  sources = [
    "autonuller.h",
    "autorestorer.h",
    "binary_buffer.cpp",
    "binary_buffer.h",
    "byteorder.h",
    "bytestring.cpp",
    "bytestring.h",
    "cfx_bitstream.cpp",
    "cfx_bitstream.h",
    "cfx_datetime.cpp",
    "cfx_datetime.h",
    "cfx_read_only_span_stream.cpp",
    "cfx_read_only_span_stream.h",
    "cfx_read_only_string_stream.cpp",
    "cfx_read_only_string_stream.h",
    "cfx_read_only_vector_stream.cpp",
    "cfx_read_only_vector_stream.h",
    "cfx_seekablestreamproxy.cpp",
    "cfx_seekablestreamproxy.h",
    "cfx_timer.cpp",
    "cfx_timer.h",
    "cfx_utf8decoder.cpp",
    "cfx_utf8decoder.h",
    "cfx_utf8encoder.cpp",
    "cfx_utf8encoder.h",
    "data_vector.h",
    "fileaccess_iface.h",
    "fixed_size_data_vector.h",
    "fixed_try_alloc_zeroed_data_vector.h",
    "fixed_uninit_data_vector.h",
    "fixed_zeroed_data_vector.h",
    "fx_bidi.cpp",
    "fx_bidi.h",
    "fx_codepage.cpp",
    "fx_codepage.h",
    "fx_codepage_forward.h",
    "fx_coordinates.cpp",
    "fx_coordinates.h",
    "fx_extension.cpp",
    "fx_extension.h",
    "fx_folder.h",
    "fx_memory.cpp",
    "fx_memory.h",
    "fx_memory_wrappers.h",
    "fx_number.cpp",
    "fx_number.h",
    "fx_random.cpp",
    "fx_random.h",
    "fx_safe_types.h",
    "fx_stream.cpp",
    "fx_stream.h",
    "fx_string.cpp",
    "fx_string.h",
    "fx_string_wrappers.h",
    "fx_system.cpp",
    "fx_system.h",
    "fx_types.h",
    "fx_unicode.cpp",
    "fx_unicode.h",
    "mask.h",
    "maybe_owned.h",
    "observed_ptr.cpp",
    "observed_ptr.h",
    "pauseindicator_iface.h",
    "retain_ptr.h",
    "scoped_set_insertion.h",
    "shared_copy_on_write.h",
    "small_buffer.h",
    "span_util.h",
    "stl_util.h",
    "string_data_template.cpp",
    "string_data_template.h",
    "string_pool_template.h",
    "string_view_template.h",
    "tree_node.h",
    "weak_ptr.h",
    "widestring.cpp",
    "widestring.h",
    "widetext_buffer.cpp",
    "widetext_buffer.h",
    "xml/cfx_xmlchardata.cpp",
    "xml/cfx_xmlchardata.h",
    "xml/cfx_xmldocument.cpp",
    "xml/cfx_xmldocument.h",
    "xml/cfx_xmlelement.cpp",
    "xml/cfx_xmlelement.h",
    "xml/cfx_xmlinstruction.cpp",
    "xml/cfx_xmlinstruction.h",
    "xml/cfx_xmlnode.cpp",
    "xml/cfx_xmlnode.h",
    "xml/cfx_xmlparser.cpp",
    "xml/cfx_xmlparser.h",
    "xml/cfx_xmltext.cpp",
    "xml/cfx_xmltext.h",
  ]
  configs += [
    "../../:pdfium_strict_config",
    "../../:pdfium_noshorten_config",
  ]
  visibility = [
    "../*",
    "../../:*",
    "../../fpdfsdk/*",
    "../../fxbarcode:*",
    "../../fxjs:*",
    "../../testing:*",
    "../../testing/fuzzers/*",
    "../../third_party:fx_agg",
    "../../third_party:fx_lcms2",
    "../../third_party:fx_libopenjpeg",
    "../../third_party:fx_tiff",
    "../../xfa/*",
  ]
  deps = [ "../../third_party:pdfium_base" ]
  public_deps = [
    ":unowned_ptr",
    "../../:freetype_common",
    "../../third_party:pdfium_base",
    "//third_party/icu:icuuc",
  ]
  if (pdf_use_partition_alloc) {
    sources += [ "fx_memory_pa.cpp" ]
    deps += [ "//base/allocator/partition_allocator:partition_alloc" ]
  } else {
    sources += [ "fx_memory_malloc.cpp" ]
  }
  if (is_posix || is_fuchsia) {
    sources += [
      "cfx_fileaccess_posix.cpp",
      "cfx_fileaccess_posix.h",
      "fx_folder_posix.cpp",
    ]
  }
  if (is_win) {
    sources += [
      "cfx_fileaccess_windows.cpp",
      "cfx_fileaccess_windows.h",
      "fx_folder_windows.cpp",
    ]
  }
  if (pdf_enable_xfa) {
    sources += [
      "cfx_memorystream.cpp",
      "cfx_memorystream.h",
    ]
  }
}

pdfium_unittest_source_set("unittests") {
  sources = [
    "autonuller_unittest.cpp",
    "autorestorer_unittest.cpp",
    "binary_buffer_unittest.cpp",
    "byteorder_unittest.cpp",
    "bytestring_unittest.cpp",
    "cfx_bitstream_unittest.cpp",
    "cfx_datetime_unittest.cpp",
    "cfx_seekablestreamproxy_unittest.cpp",
    "cfx_timer_unittest.cpp",
    "fixed_try_alloc_zeroed_data_vector_unittest.cpp",
    "fixed_uninit_data_vector_unittest.cpp",
    "fixed_zeroed_data_vector_unittest.cpp",
    "fx_bidi_unittest.cpp",
    "fx_coordinates_unittest.cpp",
    "fx_extension_unittest.cpp",
    "fx_memory_unittest.cpp",
    "fx_memory_wrappers_unittest.cpp",
    "fx_number_unittest.cpp",
    "fx_random_unittest.cpp",
    "fx_safe_types_unittest.cpp",
    "fx_string_unittest.cpp",
    "fx_string_wrappers_unittest.cpp",
    "fx_system_unittest.cpp",
    "mask_unittest.cpp",
    "maybe_owned_unittest.cpp",
    "observed_ptr_unittest.cpp",
    "pdfium_span_unittest.cpp",
    "retain_ptr_unittest.cpp",
    "scoped_set_insertion_unittest.cpp",
    "shared_copy_on_write_unittest.cpp",
    "small_buffer_unittest.cpp",
    "span_util_unittest.cpp",
    "string_pool_template_unittest.cpp",
    "tree_node_unittest.cpp",
    "unowned_ptr_unittest.cpp",
    "weak_ptr_unittest.cpp",
    "widestring_unittest.cpp",
    "widetext_buffer_unittest.cpp",
    "xml/cfx_xmlchardata_unittest.cpp",
    "xml/cfx_xmldocument_unittest.cpp",
    "xml/cfx_xmlelement_unittest.cpp",
    "xml/cfx_xmlinstruction_unittest.cpp",
    "xml/cfx_xmlnode_unittest.cpp",
    "xml/cfx_xmlparser_unittest.cpp",
    "xml/cfx_xmltext_unittest.cpp",
  ]
  deps = []
  pdfium_root_dir = "../../"

  if (pdf_enable_xfa) {
    sources += [ "cfx_memorystream_unittest.cpp" ]
    deps += [ "../fpdfapi/parser" ]
  }
}
