# 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/linux/gtk/gtk.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/features.gni")
import("//build/config/ui.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")
}

component("accessibility") {
  sources = [
    "ax_action_data.cc",
    "ax_action_data.h",
    "ax_event_generator.cc",
    "ax_event_generator.h",
    "ax_export.h",
    "ax_host_delegate.cc",
    "ax_host_delegate.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_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_registry.cc",
    "ax_tree_id_registry.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_snapshot_node_android_platform.cc",
    "platform/ax_snapshot_node_android_platform.h",
    "platform/ax_unique_id.cc",
    "platform/ax_unique_id.h",
  ]

  if (has_native_accessibility) {
    sources += [
      "platform/ax_platform_node_base.cc",
      "platform/ax_platform_node_base.h",
      "platform/ax_platform_node_delegate.h",
      "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_gen",
    "//base",
    "//base:i18n",
    "//ui/base",
    "//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/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_gtk3) {
      sources += [ "platform/atk_util_auralinux_gtk3.cc" ]
    } else {
      sources += [ "platform/atk_util_auralinux_gtk2.cc" ]
    }
  }

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

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

if (is_android) {
  android_library("ui_accessibility_java") {
    deps = [
      "//third_party/android_tools:android_support_annotations_java",
    ]
    srcjar_deps = [ ":ax_enumerations_srcjar" ]
  }

  java_cpp_enum("ax_enumerations_srcjar") {
    sources = [
      "ax_enums.idl",
    ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "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_node_position_unittest.cc",
    "ax_text_utils_unittest.cc",
    "ax_tree_combiner_unittest.cc",
    "ax_tree_serializer_unittest.cc",
    "ax_tree_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",
  ]

  deps = [
    ":accessibility",
    ":ax_gen",
    ":test_support",
    "//base",
    "//base/test:run_all_unittests",
    "//skia",
    "//testing/gtest",
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

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

json_schema_api("ax_gen") {
  sources = [
    "ax_enums.idl",
  ]
  deps = [
    "//base/third_party/dynamic_annotations",
  ]
  root_namespace = "ui"
  schemas = true
}

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

  deps = [
    ":accessibility",
  ]
}
