chromium/pdf/BUILD.gn

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

import("//build/buildflag_header.gni")
import("//build/config/features.gni")
import("//pdf/features.gni")
import("//ppapi/buildflags/buildflags.gni")
import("//services/screen_ai/buildflags/features.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("//testing/test.gni")
import("//third_party/pdfium/pdfium.gni")
import("//tools/grit/repack.gni")
import("//v8/gni/v8.gni")

if (is_ios) {
  import("//build/config/ios/bundle_data_from_filelist.gni")
}

# Generate a buildflag header for compile-time checking of PDF support.
buildflag_header("buildflags") {
  header = "buildflags.h"
  flags = [
    "ENABLE_INK=$enable_ink",
    "ENABLE_PDF_INK2=$enable_pdf_ink2",
    "ENABLE_PDF=$enable_pdf",
  ]
}

if (enable_pdf) {
  config("strict") {
    configs = [ "//build/config/compiler:wexit_time_destructors" ]
  }

  config("pdfium_includes") {
    include_dirs = [ "//third_party/pdfium" ]
  }

  static_library("pdf") {
    sources = [ "pdf.cc" ]

    configs += [ ":strict" ]

    public = [ "pdf.h" ]

    public_deps = []

    deps = [
      ":features",
      ":internal",
      "//base",
      "//build:chromeos_buildflags",
      "//services/screen_ai/buildflags",
      "//ui/gfx/geometry",
    ]

    if (enable_screen_ai_service) {
      public_deps = [ ":pdf_progressive_searchifier" ]
    }
  }

  source_set("features") {
    sources = [ "pdf_features.cc" ]

    configs += [ ":strict" ]

    public = [ "pdf_features.h" ]

    public_deps = [ ":buildflags" ]

    deps = [
      "//base",
      "//build:chromeos_buildflags",
    ]
  }

  source_set("internal") {
    visibility = [ ":*" ]

    sources = [
      "accessibility.cc",
      "accessibility.h",
      "document_attachment_info.cc",
      "document_attachment_info.h",
      "document_layout.cc",
      "document_layout.h",
      "document_metadata.cc",
      "document_metadata.h",
      "draw_utils/coordinates.cc",
      "draw_utils/coordinates.h",
      "draw_utils/shadow.cc",
      "draw_utils/shadow.h",
      "input_utils.cc",
      "input_utils.h",
      "metrics_handler.cc",
      "metrics_handler.h",
      "page_orientation.cc",
      "page_orientation.h",
      "paint_aggregator.cc",
      "paint_aggregator.h",
      "paint_manager.cc",
      "paint_manager.h",
      "paint_ready_rect.cc",
      "paint_ready_rect.h",
      "parsed_params.cc",
      "parsed_params.h",
      "pdf_init.cc",
      "pdf_init.h",
      "pdf_transform.cc",
      "pdf_transform.h",
      "pdf_utils/dates.cc",
      "pdf_utils/dates.h",
      "pdfium/pdfium_api_string_buffer_adapter.cc",
      "pdfium/pdfium_api_string_buffer_adapter.h",
      "pdfium/pdfium_document.cc",
      "pdfium/pdfium_document.h",
      "pdfium/pdfium_document_metadata.cc",
      "pdfium/pdfium_document_metadata.h",
      "pdfium/pdfium_engine.cc",
      "pdfium/pdfium_engine.h",
      "pdfium/pdfium_engine_client.h",
      "pdfium/pdfium_engine_exports.cc",
      "pdfium/pdfium_engine_exports.h",
      "pdfium/pdfium_form_filler.cc",
      "pdfium/pdfium_form_filler.h",
      "pdfium/pdfium_mem_buffer_file_write.cc",
      "pdfium/pdfium_mem_buffer_file_write.h",
      "pdfium/pdfium_ocr.cc",
      "pdfium/pdfium_ocr.h",
      "pdfium/pdfium_page.cc",
      "pdfium/pdfium_page.h",
      "pdfium/pdfium_permissions.cc",
      "pdfium/pdfium_permissions.h",
      "pdfium/pdfium_print.cc",
      "pdfium/pdfium_print.h",
      "pdfium/pdfium_range.cc",
      "pdfium/pdfium_range.h",
      "pdfium/pdfium_unsupported_features.cc",
      "pdfium/pdfium_unsupported_features.h",
      "preview_mode_client.cc",
      "preview_mode_client.h",
      "ui/document_properties.cc",
      "ui/document_properties.h",
      "ui/file_name.cc",
      "ui/file_name.h",
      "ui/thumbnail.cc",
      "ui/thumbnail.h",
    ]

    public_configs = [ ":pdfium_includes" ]

    configs += [ ":strict" ]

    public_deps = [
      "//printing/mojom",
      "//skia",
      "//v8",
    ]

    deps = [
      ":accessibility",
      ":buildflags",
      ":content_restriction",
      ":features",
      "//base",
      "//base:i18n",
      "//build:chromeos_buildflags",
      "//components/strings",
      "//gin",
      "//pdf/loader",
      "//printing",
      "//services/screen_ai/buildflags",
      "//third_party/blink/public:blink_headers",
      "//third_party/blink/public/common:headers",
      "//third_party/icu",
      "//third_party/pdfium",
      "//ui/base",
      "//ui/base/cursor/mojom:cursor_type",
      "//ui/events:events_base",
      "//ui/events/blink",
      "//ui/gfx/codec",
      "//ui/gfx/range",
    ]

    if (is_linux || is_chromeos) {
      sources += [
        "pdfium/pdfium_font_helpers.cc",
        "pdfium/pdfium_font_helpers.h",
        "pdfium/pdfium_font_linux.cc",
        "pdfium/pdfium_font_linux.h",
      ]

      deps += [ "//components/services/font/public/cpp" ]
    }

    if (is_win) {
      sources += [
        "pdfium/pdfium_font_helpers.cc",
        "pdfium/pdfium_font_helpers.h",
        "pdfium/pdfium_font_win.cc",
        "pdfium/pdfium_font_win.h",
      ]
      deps += [ "//third_party/re2" ]
    }

    if (is_chromeos) {
      sources += [
        "flatten_pdf_result.cc",
        "flatten_pdf_result.h",
      ]
    }

    if (enable_pdf_ink2) {
      sources += [
        "draw_utils/page_boundary_intersect.cc",
        "draw_utils/page_boundary_intersect.h",
        "pdf_ink_brush.cc",
        "pdf_ink_brush.h",
        "pdf_ink_cursor.cc",
        "pdf_ink_cursor.h",
        "pdf_ink_module.cc",
        "pdf_ink_module.h",
        "pdf_ink_transform.cc",
        "pdf_ink_transform.h",
        "pdf_ink_undo_redo_model.cc",
        "pdf_ink_undo_redo_model.h",
      ]

      public_deps += [ "//pdf/ink" ]
    }

    if (enable_screen_ai_service) {
      sources += [
        "pdfium/pdfium_searchify.cc",
        "pdfium/pdfium_searchify.h",
        "pdfium/pdfium_searchify_font.cc",
        "pdfium/pdfium_searchify_font.h",
      ]

      public_deps += [ "//services/screen_ai/public/mojom" ]

      deps += [ ":pdf_progressive_searchifier" ]
    }
  }

  if (enable_screen_ai_service) {
    source_set("pdf_progressive_searchifier") {
      public = [ "pdf_progressive_searchifier.h" ]

      public_deps = [
        "//services/screen_ai/public/mojom",
        "//skia",
      ]
    }
  }

  source_set("assert_enums") {
    visibility = [ ":*" ]

    testonly = true

    sources = [ "pdfium/pdfium_assert_matching_enums.cc" ]

    deps = [
      ":accessibility",
      ":content_restriction",
      ":internal",
      ":pdf",
      "//third_party/blink/public/common:headers",
      "//third_party/pdfium",
      "//ui/base",
    ]
  }

  source_set("content_restriction") {
    # Exists separately to expose this header for testing.
    public = [ "content_restriction.h" ]
  }

  source_set("accessibility") {
    visibility = [
      ":*",
      "//components:components_browsertests${exec_target_suffix}",
      "//components/pdf/renderer",
      "//components/pdf/renderer:unit_tests",
    ]

    sources = [
      "accessibility_helper.cc",
      "accessibility_helper.h",
      "accessibility_structs.cc",
      "accessibility_structs.h",
      "pdf_accessibility_action_handler.h",
      "pdf_accessibility_data_handler.h",
      "pdf_accessibility_image_fetcher.h",
    ]

    configs += [ ":strict" ]

    deps = [
      "//base",
      "//skia",
      "//ui/gfx/geometry",
    ]
  }

  static_library("pdf_view_web_plugin") {
    assert(enable_plugins, "The PDF viewer relies on plugin infrastructure")

    visibility = [
      ":*",
      "//components/pdf/renderer",
    ]

    sources = [
      "pdf_view_web_plugin.cc",
      "post_message_receiver.cc",
      "post_message_receiver.h",
      "v8_value_converter.h",
    ]

    configs += [ ":strict" ]

    public = [ "pdf_view_web_plugin.h" ]

    public_deps = [ "//pdf/mojom" ]

    deps = [
      ":accessibility",
      ":buildflags",
      ":content_restriction",
      ":features",
      ":internal",
      "//base",
      "//base:i18n",
      "//cc/paint",
      "//gin",
      "//net",
      "//pdf/loader",
      "//printing",
      "//services/network/public/mojom:url_loader_base",
      "//skia",
      "//third_party/blink/public:blink_headers",
      "//third_party/blink/public/common:headers",
      "//ui/base/cursor",
      "//ui/base/cursor/mojom:cursor_type",
      "//ui/events/blink",
      "//ui/gfx/range",
      "//v8",
    ]

    if (enable_pdf_ink2) {
      deps += [ "//pdf/ink" ]
    }
  }

  source_set("pdf_test_utils") {
    visibility = [ "//pdf/*" ]

    testonly = true

    sources = [
      "test/mock_web_associated_url_loader.cc",
      "test/mock_web_associated_url_loader.h",
      "test/mouse_event_builder.cc",
      "test/mouse_event_builder.h",
      "test/test_client.cc",
      "test/test_client.h",
      "test/test_document_loader.cc",
      "test/test_document_loader.h",
      "test/test_helpers.cc",
      "test/test_helpers.h",
      "test/test_pdfium_engine.cc",
      "test/test_pdfium_engine.h",
    ]

    deps = [
      ":internal",
      "//base",
      "//cc:test_support",
      "//pdf/loader",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/blink/public:blink",
      "//ui/gfx/range",
      "//ui/latency:latency",
    ]
  }

  test("pdf_unittests") {
    testonly = true

    sources = [
      "document_layout_unittest.cc",
      "draw_utils/coordinates_unittest.cc",
      "input_utils_unittest.cc",
      "page_orientation_unittest.cc",
      "paint_manager_unittest.cc",
      "parsed_params_unittest.cc",
      "pdf_transform_unittest.cc",
      "pdf_utils/dates_unittest.cc",
      "pdf_view_web_plugin_unittest.cc",
      "pdfium/accessibility_unittest.cc",
      "pdfium/findtext_unittest.cc",
      "pdfium/pdfium_engine_exports_unittest.cc",
      "pdfium/pdfium_engine_unittest.cc",
      "pdfium/pdfium_form_filler_unittest.cc",
      "pdfium/pdfium_page_unittest.cc",
      "pdfium/pdfium_permissions_unittest.cc",
      "pdfium/pdfium_print_unittest.cc",
      "pdfium/pdfium_range_unittest.cc",
      "pdfium/pdfium_test_base.cc",
      "pdfium/pdfium_test_base.h",
      "test/run_all_unittests.cc",
      "ui/document_properties_unittest.cc",
      "ui/file_name_unittest.cc",
      "ui/thumbnail_unittest.cc",
    ]

    if (is_win) {
      sources += [ "pdfium/pdfium_font_win_unittest.cc" ]
    }

    data = [ "test/data/" ]

    deps = [
      ":accessibility",
      ":assert_enums",
      ":buildflags",
      ":content_restriction",
      ":features",
      ":internal",
      ":pdf",
      ":pdf_test_utils",
      ":pdf_view_web_plugin",
      "//base",
      "//base:i18n",
      "//base/test:test_support",
      "//cc:test_support",
      "//gin",
      "//mojo/core/embedder",
      "//mojo/public/cpp/bindings",
      "//net",
      "//pdf/loader",
      "//pdf/loader:unit_tests",
      "//printing",
      "//services/screen_ai/buildflags",
      "//skia",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/blink/public:blink",
      "//third_party/blink/public:test_support",
      "//third_party/blink/public/common:headers",
      "//third_party/pdfium",
      "//tools/v8_context_snapshot:buildflags",
      "//ui/base",
      "//ui/base/cursor",
      "//ui/events/blink:blink",
      "//ui/gfx:test_support",
      "//ui/gfx/geometry",
      "//ui/gfx/range",
      "//v8",
    ]

    data_deps = [
      ":pdf_unittests_pak",
      "//ui/resources:ui_test_pak_data",
    ]

    assert_no_deps = [
      "//ppapi/c/*",
      "//ppapi/cpp/*",
    ]

    if (enable_pdf_ink2) {
      sources += [
        "draw_utils/page_boundary_intersect_unittest.cc",
        "pdf_ink_brush_unittest.cc",
        "pdf_ink_cursor_unittest.cc",
        "pdf_ink_module_unittest.cc",
        "pdf_ink_transform_unittest.cc",
        "pdf_ink_undo_redo_model_unittest.cc",
        "test/pdf_ink_test_helpers.cc",
        "test/pdf_ink_test_helpers.h",
      ]
    }

    if (enable_screen_ai_service) {
      sources += [ "pdfium/pdfium_searchify_unittest.cc" ]
    }

    if (v8_use_external_startup_data) {
      deps += [
        "//tools/v8_context_snapshot",
        "//tools/v8_context_snapshot:buildflags",
      ]
      configs += [ "//v8:external_startup_data" ]
    }
  }

  repack("pdf_unittests_pak") {
    sources =
        [ "$root_gen_dir/components/strings/components_strings_en-US.pak" ]
    output = "$root_out_dir/pdf_tests_resources.pak"
    deps = [ "//components/strings" ]
  }

  fuzzer_test("pdf_dates_fuzzer") {
    sources = [ "pdf_utils/dates_fuzzer.cc" ]

    deps = [
      ":internal",
      "//base",
    ]
  }
} else {
  # Dummy groups when PDF support is disabled so targets can unconditionally
  # depend on it.
  group("features") {
  }
  group("pdf") {
  }
}

if (is_ios) {
  bundle_data_from_filelist("pdf_test_bundle_data") {
    testonly = true
    filelist_name = "test/pdf_test_bundle_data.filelist"
  }
}