# Copyright 2018 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/config/ios/ios_sdk.gni")
import("//build/config/ios/rules.gni")
import("//third_party/protobuf/proto_library.gni")

# Remove when GTX is updated or a better solution is found.
template("patch_file") {
  assert(defined(invoker.patch_path),
         "patch_path must be defined for $target_name")
  assert(defined(invoker.source_file),
         "source_file must be defined for $target_name")

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    script = "patch.py"
    sources = [
      invoker.patch_path,
      invoker.source_file,
    ]
    outputs = [ "$target_gen_dir/" + invoker.source_file ]

    args = rebase_path(sources, root_build_dir) +
           rebase_path(outputs, root_build_dir)
  }
}

patch_file("patch_GTXAccessibilityTree_m") {
  patch_path = "patches/GTXAccessibilityTree.m.diff"
  source_file = "src/Classes/GTXAccessibilityTree.m"
}

config("config") {
  include_dirs = [ "src/Classes" ]
}

config("internal_config") {
  include_dirs = [
    "src/OOPClasses",
    "../../../third_party/protobuf/src",
  ]
}

# GTXiLibCore.m uses `-keyWindow` method which is deprecated since iOS 13.0.
# Disable the warning until the library is updated to a version thats do not
# use the deprecated method. See https://crbug.com/1237312 for progress.
config("disable_deprecated_declarations") {
  cflags_objcc = [ "-Wno-deprecated-declarations" ]
  cflags_objc = cflags_objcc
}

# The file ios/third_party/gtx/redirect_compiled_header.h brings dependency
# on third_party/abseil-cpp/absl which does not use nullability annotations
# but GTX uses the macro to push nullability annotation causing lots of
# warnings during compilation.
config("disable_nullability_completeness") {
  cflags = [ "-Wno-nullability-completeness" ]
}

proto_library("proto") {
  sources = [ "src/OOPClasses/Protos/gtx.proto" ]
  cc_generator_options = "lite"
}

source_set("oop_classes") {
  testonly = true
  sources = [
    "src/OOPClasses/accessibility_label_not_punctuated_check.cc",
    "src/OOPClasses/accessibility_label_not_punctuated_check.h",
    "src/OOPClasses/check.cc",
    "src/OOPClasses/check.h",
    "src/OOPClasses/check_result.cc",
    "src/OOPClasses/check_result.h",
    "src/OOPClasses/contrast_check.cc",
    "src/OOPClasses/contrast_check.h",
    "src/OOPClasses/contrast_swatch.cc",
    "src/OOPClasses/contrast_swatch.h",
    "src/OOPClasses/element_type.h",
    "src/OOPClasses/error_message.cc",
    "src/OOPClasses/error_message.h",
    "src/OOPClasses/gtx_types.cc",
    "src/OOPClasses/gtx_types.h",
    "src/OOPClasses/image_color_utils.cc",
    "src/OOPClasses/image_color_utils.h",
    "src/OOPClasses/localized_strings_manager.cc",
    "src/OOPClasses/localized_strings_manager.h",
    "src/OOPClasses/minimum_tappable_area_check.cc",
    "src/OOPClasses/minimum_tappable_area_check.h",
    "src/OOPClasses/no_label_check.h",
    "src/OOPClasses/parameters.cc",
    "src/OOPClasses/parameters.h",
    "src/OOPClasses/string_utils.cc",
    "src/OOPClasses/string_utils.h",
    "src/OOPClasses/toolkit.cc",
    "src/OOPClasses/toolkit.h",
    "src/OOPClasses/ui_element.cc",
    "src/OOPClasses/ui_element.h",
  ]

  deps = [
    ":proto",
    "//third_party/protobuf:protobuf_lite",
  ]

  # Don't use the gtx provided compiled protobuf header. The ordering of these
  # include_dirs enforces that.
  cflags_cc = [
    "-include",
    rebase_path("redirect_compiled_header.h", root_build_dir),
  ]
  include_dirs =
      [ "$root_out_dir/gen/ios/third_party/gtx/src/OOPClasses/Protos" ]
  configs += [
    ":internal_config",
    ":disable_nullability_completeness",
  ]

  configs -= [ "//build/config/compiler:chromium_code" ]
}

ios_framework_bundle("gtx") {
  output_name = "GTXiLib"
  info_plist = "Info.plist"

  testonly = true
  sources = [
    "src/Classes/GTXAccessibilityTree.h",
    "src/Classes/GTXAccessibilityTree.m",
    "src/Classes/GTXAnalytics.h",
    "src/Classes/GTXAnalytics.m",
    "src/Classes/GTXAnalyticsUtils.h",
    "src/Classes/GTXAnalyticsUtils.m",
    "src/Classes/GTXAssertions.h",
    "src/Classes/GTXCheckBlock.h",
    "src/Classes/GTXCheckBlock.m",
    "src/Classes/GTXCheckResult.h",
    "src/Classes/GTXCheckResult.m",
    "src/Classes/GTXChecking.h",
    "src/Classes/GTXChecksCollection.h",
    "src/Classes/GTXChecksCollection.m",
    "src/Classes/GTXCommon.h",
    "src/Classes/GTXElementReference.h",
    "src/Classes/GTXElementReference.m",
    "src/Classes/GTXElementResultCollection.h",
    "src/Classes/GTXElementResultCollection.m",
    "src/Classes/GTXError.h",
    "src/Classes/GTXError.m",
    "src/Classes/GTXErrorReporter.h",
    "src/Classes/GTXErrorReporter.m",
    "src/Classes/GTXExcludeListBlock.h",
    "src/Classes/GTXExcludeListBlock.m",
    "src/Classes/GTXExcludeListFactory.h",
    "src/Classes/GTXExcludeListFactory.m",
    "src/Classes/GTXExcludeListing.h",
    "src/Classes/GTXHierarchyResultCollection.h",
    "src/Classes/GTXHierarchyResultCollection.m",
    "src/Classes/GTXImageAndColorUtils.h",
    "src/Classes/GTXImageAndColorUtils.mm",
    "src/Classes/GTXImageRGBAData+GTXOOPAdditions.h",
    "src/Classes/GTXImageRGBAData+GTXOOPAdditions.mm",
    "src/Classes/GTXImageRGBAData.h",
    "src/Classes/GTXImageRGBAData.m",
    "src/Classes/GTXLogging.h",
    "src/Classes/GTXPluginXCTestCase.h",
    "src/Classes/GTXPluginXCTestCase.m",
    "src/Classes/GTXReport.h",
    "src/Classes/GTXReport.m",
    "src/Classes/GTXResult.h",
    "src/Classes/GTXResult.m",
    "src/Classes/GTXSwizzler.h",
    "src/Classes/GTXSwizzler.m",
    "src/Classes/GTXTestCase.h",
    "src/Classes/GTXTestCase.m",
    "src/Classes/GTXTestEnvironment.h",
    "src/Classes/GTXTestEnvironment.m",
    "src/Classes/GTXTestSuite.h",
    "src/Classes/GTXTestSuite.m",
    "src/Classes/GTXToolKit+GTXOOPAdditions.h",
    "src/Classes/GTXToolKit.h",
    "src/Classes/GTXToolKit.mm",
    "src/Classes/GTXXCUIApplicationProxy.h",
    "src/Classes/GTXXCUIApplicationProxy.m",
    "src/Classes/GTXXCUIElementProxy.h",
    "src/Classes/GTXXCUIElementProxy.m",
    "src/Classes/GTXXCUIElementQueryProxy.h",
    "src/Classes/GTXXCUIElementQueryProxy.m",
    "src/Classes/GTXiLib.h",
    "src/Classes/GTXiLibCore.h",
    "src/Classes/GTXiLibCore.m",
    "src/Classes/NSError+GTXAdditions.h",
    "src/Classes/NSError+GTXAdditions.m",
    "src/Classes/NSObject+GTXAdditions.h",
    "src/Classes/NSObject+GTXAdditions.mm",
    "src/Classes/NSString+GTXAdditions.h",
    "src/Classes/NSString+GTXAdditions.mm",
    "src/Classes/UIColor+GTXAdditions.h",
    "src/Classes/UIColor+GTXAdditions.m",
    "src/Classes/UIColor+GTXOOPAdditions.h",
    "src/Classes/UIColor+GTXOOPAdditions.mm",
  ]
  public_headers = [
    "src/Classes/GTXAccessibilityTree.h",
    "src/Classes/GTXAnalytics.h",
    "src/Classes/GTXAnalyticsUtils.h",
    "src/Classes/GTXAssertions.h",
    "src/Classes/GTXExcludeListBlock.h",
    "src/Classes/GTXExcludeListFactory.h",
    "src/Classes/GTXExcludeListing.h",
    "src/Classes/GTXCheckBlock.h",
    "src/Classes/GTXChecking.h",
    "src/Classes/GTXChecksCollection.h",
    "src/Classes/GTXCommon.h",
    "src/Classes/GTXErrorReporter.h",
    "src/Classes/GTXImageAndColorUtils.h",
    "src/Classes/GTXImageRGBAData.h",
    "src/Classes/GTXLogging.h",
    "src/Classes/GTXPluginXCTestCase.h",
    "src/Classes/GTXTestCase.h",
    "src/Classes/GTXTestEnvironment.h",
    "src/Classes/GTXTestSuite.h",
    "src/Classes/GTXToolKit.h",
    "src/Classes/GTXiLib.h",
    "src/Classes/GTXiLibCore.h",
    "src/Classes/NSError+GTXAdditions.h",
    "src/Classes/GTXImageRGBAData+GTXOOPAdditions.h",
    "src/Classes/GTXError.h",
    "src/Classes/GTXReport.h",
    "src/Classes/UIColor+GTXAdditions.h",
    "src/Classes/GTXCheckResult.h",
    "src/Classes/GTXElementReference.h",
    "src/Classes/GTXElementResultCollection.h",
    "src/Classes/GTXHierarchyResultCollection.h",
    "src/Classes/GTXResult.h",
    "src/Classes/GTXSwizzler.h",
    "src/Classes/GTXXCUIApplicationProxy.h",
    "src/Classes/GTXXCUIElementProxy.h",
    "src/Classes/GTXXCUIElementQueryProxy.h",
    "src/Classes/NSObject+GTXAdditions.h",
    "src/Classes/NSString+GTXAdditions.h",
    "src/Classes/UIColor+GTXOOPAdditions.h",
    "src/Classes/GTXToolKit+GTXOOPAdditions.h",
  ]

  deps = [
    ":oop_classes",
    "//build/config/ios:xctest",
    "//third_party/protobuf:protobuf_lite",
  ]

  # Remove when GTX is updated or a better solution is found.
  sources -= [ "src/Classes/GTXAccessibilityTree.m" ]
  sources += get_target_outputs(":patch_GTXAccessibilityTree_m")
  deps += [ ":patch_GTXAccessibilityTree_m" ]

  # Don't use the gtx provided compiled protobuf header. The ordering of these
  # include_dirs enforces that.
  cflags_objcc = [
    "-include",
    rebase_path("redirect_compiled_header.h", root_build_dir),
  ]
  include_dirs =
      [ "$root_out_dir/gen/ios/third_party/gtx/src/OOPClasses/Protos" ]
  configs += [ ":internal_config" ]

  frameworks = [
    "CoreGraphics.framework",
    "Foundation.framework",
    "QuartzCore.framework",
    "UIKit.framework",
    "XCTest.framework",
  ]
  public_configs = [ ":config" ]

  configs -= [
    "//build/config/gcc:symbol_visibility_hidden",
    "//build/config/compiler:chromium_code",
  ]
  configs += [
    "//build/config/gcc:symbol_visibility_default",
    "//build/config/compiler:no_chromium_code",
    ":disable_deprecated_declarations",
  ]
}
