# Copyright (c) 2013 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/buildflag_header.gni")
import("//testing/test.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("features.gni")

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

buildflag_header("url_features") {
  header = "url_features.h"
  flags = [ "USE_PLATFORM_ICU_ALTERNATIVES=$use_platform_icu_alternatives" ]
}

component("url") {
  sources = [
    "gurl.cc",
    "gurl.h",
    "origin.cc",
    "origin.h",
    "scheme_host_port.cc",
    "scheme_host_port.h",
    "third_party/mozilla/url_parse.cc",
    "third_party/mozilla/url_parse.h",
    "url_canon.cc",
    "url_canon.h",
    "url_canon_etc.cc",
    "url_canon_filesystemurl.cc",
    "url_canon_fileurl.cc",
    "url_canon_host.cc",
    "url_canon_internal.cc",
    "url_canon_internal.h",
    "url_canon_internal_file.h",
    "url_canon_ip.cc",
    "url_canon_ip.h",
    "url_canon_mailtourl.cc",
    "url_canon_path.cc",
    "url_canon_pathurl.cc",
    "url_canon_query.cc",
    "url_canon_relative.cc",
    "url_canon_stdstring.cc",
    "url_canon_stdstring.h",
    "url_canon_stdurl.cc",
    "url_constants.cc",
    "url_constants.h",
    "url_export.h",
    "url_file.h",
    "url_parse_file.cc",
    "url_parse_internal.h",
    "url_util.cc",
    "url_util.h",
    "url_util_internal.h",
    "url_util_qt.cc",
    "url_util_qt.h",
  ]

  defines = [ "URL_IMPLEMENTATION" ]

  configs += [
    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
  ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
  ]

  if (is_win) {
    # Don't conflict with Windows' "url.dll".
    output_name = "url_lib"
  }

  # ICU support.
  if (use_platform_icu_alternatives) {
    if (is_android) {
      sources += [ "url_canon_icu_alternatives_android.cc" ]
      deps += [
        ":url_features",
        ":url_java",
        ":url_jni_headers",
        "//base",
        "//base/third_party/dynamic_annotations",
      ]
    } else if (is_ios) {
      sources += [ "url_canon_icu_alternatives_ios.mm" ]
    } else {
      assert(false,
             "ICU alternative is not implemented for platform: " + target_os)
    }
  } else {
    # Use ICU.
    sources += [
      "url_canon_icu.cc",
      "url_canon_icu.h",
    ]
    deps += [ "//third_party/icu" ]
  }
}

if (is_android) {
  android_library("url_java") {
    java_files = [ "android/java/src/org/chromium/url/IDNStringUtil.java" ]
    deps = [
      "//base:base_java",
    ]
  }

  generate_jni("url_jni_headers") {
    sources = [
      "android/java/src/org/chromium/url/IDNStringUtil.java",
    ]
    jni_package = "url"
  }
}

test("url_unittests") {
  sources = [
    "gurl_unittest.cc",
    "origin_unittest.cc",
    "run_all_unittests.cc",
    "scheme_host_port_unittest.cc",
    "url_canon_icu_unittest.cc",
    "url_canon_unittest.cc",
    "url_parse_unittest.cc",
    "url_test_utils.h",
    "url_util_qt_unittest.cc",
    "url_util_unittest.cc",
  ]

  deps = [
    ":url",
    "//base",
    "//base/test:test_support",
    "//testing/gtest",
  ]

  if (!is_ios) {
    sources += [ "mojom/url_gurl_mojom_traits_unittest.cc" ]
  }

  if (use_platform_icu_alternatives) {
    # Unit tests that are not supported by the current ICU alternatives on Android.
    if (is_android) {
      sources -= [
        "url_canon_icu_unittest.cc",
        "url_canon_unittest.cc",
      ]
      deps += [ ":url_java" ]
    }

    # Unit tests that are not supported by the current ICU alternatives on iOS.
    if (is_ios) {
      sources -= [
        "origin_unittest.cc",
        "scheme_host_port_unittest.cc",
        "url_canon_icu_unittest.cc",
        "url_canon_unittest.cc",
      ]
    }
  } else {  # !use_platform_icu_alternatives
    deps += [ "//third_party/icu:icuuc" ]
  }

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  if (!is_ios) {
    deps += [
      "//mojo/core/embedder",
      "//url/mojom:test_url_mojom_gurl",
    ]
  }
}

fuzzer_test("gurl_fuzzer") {
  sources = [
    "gurl_fuzzer.cc",
  ]
  deps = [
    ":url",
    "//base",
    "//base:i18n",
  ]
  dict = "gurl_fuzzer.dict"
}
