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

import("//build/config/features.gni")
import("//build/config/jumbo.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/ui.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("//testing/test.gni")
import("//tools/json_schema_compiler/json_schema_api.gni")
import("//ui/base/ui_features.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

mojom("ax_enums_mojo") {
  sources = [
    "ax_enums.mojom",
  ]

  public_deps = [
    "//mojo/public/mojom/base",
    "//ui/gfx/geometry/mojo",
    "//ui/gfx/mojo",
  ]
}

jumbo_component("accessibility") {
  sources = [
    "accessibility_switches.cc",
    "accessibility_switches.h",
    "ax_action_data.cc",
    "ax_action_data.h",
    "ax_action_handler.cc",
    "ax_action_handler.h",
    "ax_enum_util.cc",
    "ax_enum_util.h",
    "ax_event.cc",
    "ax_event.h",
    "ax_event_bundle_sink.h",
    "ax_event_generator.cc",
    "ax_event_generator.h",
    "ax_export.h",
    "ax_language_info.h",
    "ax_mode.h",
    "ax_mode_observer.h",
    "ax_node.cc",
    "ax_node.h",
    "ax_node_data.cc",
    "ax_node_data.h",
    "ax_node_position.cc",
    "ax_node_position.h",
    "ax_position.h",
    "ax_range.h",
    "ax_relative_bounds.cc",
    "ax_relative_bounds.h",
    "ax_role_properties.cc",
    "ax_role_properties.h",
    "ax_serializable_tree.cc",
    "ax_serializable_tree.h",
    "ax_table_info.cc",
    "ax_table_info.h",
    "ax_text_utils.cc",
    "ax_text_utils.h",
    "ax_tree.cc",
    "ax_tree.h",
    "ax_tree_combiner.cc",
    "ax_tree_combiner.h",
    "ax_tree_data.cc",
    "ax_tree_data.h",
    "ax_tree_id.cc",
    "ax_tree_id.h",
    "ax_tree_id_registry.cc",
    "ax_tree_id_registry.h",
    "ax_tree_observer.cc",
    "ax_tree_observer.h",
    "ax_tree_serializer.cc",
    "ax_tree_serializer.h",
    "ax_tree_source.h",
    "ax_tree_update.h",
    "platform/ax_android_constants.cc",
    "platform/ax_android_constants.h",
    "platform/ax_platform_node.cc",
    "platform/ax_platform_node.h",
    "platform/ax_platform_node_base.cc",
    "platform/ax_platform_node_base.h",
    "platform/ax_platform_node_delegate.h",
    "platform/ax_platform_node_delegate_base.cc",
    "platform/ax_platform_node_delegate_base.h",
    "platform/ax_platform_node_test_helper.cc",
    "platform/ax_platform_node_test_helper.h",
    "platform/ax_unique_id.cc",
    "platform/ax_unique_id.h",
    "platform/compute_attributes.cc",
    "platform/compute_attributes.h",
  ]

  if (has_native_accessibility) {
    sources += [
      "platform/ax_platform_node_mac.h",
      "platform/ax_platform_node_mac.mm",
      "platform/ax_platform_node_win.cc",
      "platform/ax_platform_node_win.h",
      "platform/ax_platform_relation_win.cc",
      "platform/ax_platform_relation_win.h",
      "platform/ax_system_caret_win.cc",
      "platform/ax_system_caret_win.h",
    ]
  }

  defines = [ "ACCESSIBILITY_IMPLEMENTATION" ]

  public_deps = [
    ":ax_enums_mojo",
    "//base",
    "//base:i18n",
    "//ui/base",
    "//ui/display",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/strings",
  ]

  if (is_win) {
    public_deps += [ "//third_party/iaccessible2" ]
    libs = [ "oleacc.lib" ]
  }

  if (is_mac) {
    libs = [
      "AppKit.framework",
      "Foundation.framework",
    ]
  }

  if (use_atk) {
    sources += [
      "platform/atk_util_auralinux.cc",
      "platform/atk_util_auralinux.h",
      "platform/atk_util_auralinux_gtk.cc",
      "platform/ax_platform_atk_hyperlink.cc",
      "platform/ax_platform_atk_hyperlink.h",
      "platform/ax_platform_node_auralinux.cc",
      "platform/ax_platform_node_auralinux.h",
    ]

    configs += [ "//build/config/linux/atk" ]

    if (use_glib) {
      configs += [ "//build/config/linux:glib" ]
    }

    if (use_x11) {
      sources += [ "platform/atk_util_auralinux_x11.cc" ]

      configs += [ "//build/config/linux:x11" ]
      public_deps += [
        "//ui/events/x",
        "//ui/gfx/x",
      ]
    }
  }

  if (use_aura) {
    sources += [
      "platform/aura_window_properties.cc",
      "platform/aura_window_properties.h",
    ]

    public_deps += [ "//ui/aura" ]
  }
}

source_set("ax_assistant") {
  sources = [
    "ax_assistant_structure.cc",
    "ax_assistant_structure.h",
  ]
  deps = [
    ":accessibility",
  ]
}

service_manifest("manifest") {
  name = "ax_host_service"
  source = "ax_host_service_manifest.json"
}

static_library("test_support") {
  testonly = true
  sources = [
    "ax_tree_source_checker.h",
    "tree_generator.cc",
    "tree_generator.h",
  ]

  if (is_win || use_atk) {
    sources += [
      "platform/test_ax_node_wrapper.cc",
      "platform/test_ax_node_wrapper.h",
    ]
  }

  deps = [
    ":accessibility",
  ]
}

test("accessibility_unittests") {
  testonly = true
  sources = [
    "ax_event_generator_unittest.cc",
    "ax_generated_tree_unittest.cc",
    "ax_language_info_unittest.cc",
    "ax_node_data_unittest.cc",
    "ax_node_position_unittest.cc",
    "ax_table_info_unittest.cc",
    "ax_text_utils_unittest.cc",
    "ax_tree_combiner_unittest.cc",
    "ax_tree_serializer_unittest.cc",
    "ax_tree_unittest.cc",
    "mojom/ax_action_data_mojom_traits_unittest.cc",
    "mojom/ax_event_mojom_traits_unittest.cc",
    "mojom/ax_node_data_mojom_traits_unittest.cc",
    "mojom/ax_relative_bounds_mojom_traits_unittest.cc",
    "mojom/ax_tree_data_mojom_traits_unittest.cc",
    "mojom/ax_tree_id_mojom_traits_unittest.cc",
    "mojom/ax_tree_update_mojom_traits_unittest.cc",
    "platform/ax_platform_node_unittest.cc",
    "platform/ax_platform_node_unittest.h",
    "platform/ax_platform_node_win_unittest.cc",
    "platform/ax_unique_id_unittest.cc",
    "run_all_unittests.cc",
  ]

  deps = [
    ":accessibility",
    ":ax_enums_mojo",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//mojo/core/embedder",
    "//mojo/core/test:test_support",
    "//mojo/public/cpp/test_support:test_utils",
    "//skia",
    "//testing/gtest",
    "//ui/accessibility/mojom",
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx:test_support",
    "//ui/gfx/geometry",
  ]

  if (is_win) {
    deps += [ "//third_party/iaccessible2" ]
    libs = [ "oleacc.lib" ]
  }
  if (use_atk) {
    sources += [
      "platform/atk_util_auralinux_unittest.cc",
      "platform/ax_platform_node_auralinux_unittest.cc",
    ]
    configs += [ "//build/config/linux/atk" ]
  }
}

fuzzer_test("ax_tree_fuzzer") {
  sources = [
    "ax_tree_fuzzer.cc",
  ]

  deps = [
    ":accessibility",
  ]
}

fuzzer_test("ax_table_fuzzer") {
  sources = [
    "ax_table_fuzzer.cc",
  ]

  deps = [
    ":accessibility",
  ]

  seed_corpus = "fuzz_corpus"
}
