Provide a no-ICU build of googleurl

ICU is used by googleurl to normalize IDNA inside hostnames.  However,
using ICU comes with costs (mostly binary size), meaning that some
embedders might want to avoid using it (Chrome itself does not use it on
iOS, for instance).  Provide such option in quiche googleurl fork.

Change-Id: I3ef56cefa85aacd04e6c019257221edeb076d58c
diff --git a/build_config/build_config.bzl b/build_config/build_config.bzl
index 3deb9d1..5960d2a 100644
--- a/build_config/build_config.bzl
+++ b/build_config/build_config.bzl
@@ -20,16 +20,8 @@
     "//conditions:default": [],
 })
 
-_icuuc_deps = select({
-    "//build_config:with_system_icu": [],
-
-    # If we don't link against system ICU library, we must provide "@org_unicode_icuuc//:common".
-    "//conditions:default": ["@org_unicode_icuuc//:common"],
-})
-
 build_config = struct(
     default_copts = _default_copts,
     url_linkopts = _url_linkopts,
     strings_hdrs = _strings_hdrs,
-    icuuc_deps = _icuuc_deps,
 )
diff --git a/copy.bara.sky b/copy.bara.sky
index 6bf0772..0f78461 100644
--- a/copy.bara.sky
+++ b/copy.bara.sky
@@ -37,10 +37,11 @@
         "build/buildflag.h",
         "url/*.cc",
         "url/*.h",
+        "url/url_idna_icu_alternatives_ios.mm",
         "url/third_party/mozilla/**",
     ],
     exclude = [
-        "url/url_idna_icu_alternatives*",
+        "url/url_idna_icu_alternatives_android.cc",
     ],
 )
 
@@ -93,6 +94,10 @@
     # Use Abseil at upstream-recommended paths.
     core.replace("third_party/abseil-cpp/absl", "absl"),
 
+    # iOS version of url_idna is ASCII-only, but it uses .mm extension; rename
+    # it to a .cc file.
+    core.move("url/url_idna_icu_alternatives_ios.mm", "url/url_idna_ascii_only.cc"),
+
     # Fix some Perfetto includes.
     core.replace("perfetto/tracing/traced_value_forward.h", "perfetto/tracing/traced_value.h"),
 
diff --git a/test/BUILD b/test/BUILD
index 16b1a42..b71bb78 100644
--- a/test/BUILD
+++ b/test/BUILD
@@ -4,9 +4,15 @@
 load("//build_config:build_config.bzl", "build_config")
 load("@rules_cc//cc:defs.bzl", "cc_test")
 
+idna_extra_defines = select({
+    "//build_config:with_system_icu": ["GOOGLEURL_SUPPORTS_IDNA"],
+    "//conditions:default": [],
+})
+
 cc_test(
     name = "basic_test",
     srcs = ["basic_test.cc"],
     copts = build_config.default_copts,
+    defines = idna_extra_defines,
     deps = ["//url"],
 )
diff --git a/test/basic_test.cc b/test/basic_test.cc
index f60df57..6253e25 100644
--- a/test/basic_test.cc
+++ b/test/basic_test.cc
@@ -29,7 +29,11 @@
 
   // Ensure ICU is functioning correctly.
   GURL idn_url("https://\xe5\x85\x89.example/");
+#ifdef GOOGLEURL_SUPPORTS_IDNA
   ASSERT_EQ(idn_url.spec(), "https://xn--54q.example/");
+#else
+  ASSERT_EQ(idn_url.is_valid(), false);
+#endif
 
   return 0;
 }
diff --git a/url/BUILD b/url/BUILD
index 24fd97e..c6b53ab 100644
--- a/url/BUILD
+++ b/url/BUILD
@@ -4,6 +4,11 @@
 load("//build_config:build_config.bzl", "build_config")
 load("@rules_cc//cc:defs.bzl", "cc_library")
 
+idna_src = select({
+    "//build_config:with_system_icu": ["url_idna_icu.cc"],
+    "//conditions:default": ["url_idna_ascii_only.cc"],
+})
+
 cc_library(
     name = "url",
     srcs = [
@@ -26,12 +31,11 @@
         "url_canon_stdstring.cc",
         "url_canon_stdurl.cc",
         "url_constants.cc",
-        "url_idna_icu.cc",
         "url_parse_file.cc",
         "url_parse_internal.h",
         "url_util.cc",
         "url_util_internal.h",
-    ],
+    ] + idna_src,
     hdrs = [
         "gurl.h",
         "third_party/mozilla/url_parse.h",
@@ -49,5 +53,5 @@
     deps = [
         "//base",
         "//polyfills",
-    ] + build_config.icuuc_deps,
+    ],
 )
diff --git a/url/url_idna_ascii_only.cc b/url/url_idna_ascii_only.cc
new file mode 100644
index 0000000..55e8459
--- /dev/null
+++ b/url/url_idna_ascii_only.cc
@@ -0,0 +1,28 @@
+// Copyright 2016 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.
+
+#include <string.h>
+
+#include <ostream>
+#include <string>
+
+#include "base/strings/string_piece.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "url/url_canon_internal.h"
+
+namespace url {
+
+// Only allow ASCII to avoid ICU dependency. Use NSString+IDN
+// to convert non-ASCII URL prior to passing to API.
+bool IDNToASCII(const char16_t* src, int src_len, CanonOutputW* output) {
+  if (gurl_base::IsStringASCII(gurl_base::StringPiece16(src, src_len))) {
+    output->Append(src, src_len);
+    return true;
+  }
+  GURL_DCHECK(false) << "IDN URL support is not available.";
+  return false;
+}
+
+}  // namespace url