# 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",
  ]

  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_idna_icu_alternatives_android.cc" ]
      deps += [
        ":url_features",
        ":url_java",
        ":url_jni_headers",
        "//base",
        "//base/third_party/dynamic_annotations",
      ]
    } else if (is_ios) {
      sources += [ "url_idna_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",
      "url_idna_icu.cc",
    ]
    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_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"
}
