// Test that URLs containing characters in the IDN blacklist are
// always displayed as punycode

"use strict";

const testcases = [
  //  Original  Punycode or
  //            normalized form
  //
  ["\u00BC", "xn--14-c6t"],
  ["\u00BD", "xn--12-c6t"],
  ["\u00BE", "xn--34-c6t"],
  ["\u01C3", "xn--ija"],
  ["\u02D0", "xn--6qa"],
  ["\u0337", "xn--4ta"],
  ["\u0338", "xn--5ta"],
  ["\u0589", "xn--3bb"],
  ["\u05C3", "xn--rdb"],
  ["\u05F4", "xn--5eb"],
  ["\u0609", "xn--rfb"],
  ["\u060A", "xn--sfb"],
  ["\u066A", "xn--jib"],
  ["\u06D4", "xn--klb"],
  ["\u0701", "xn--umb"],
  ["\u0702", "xn--vmb"],
  ["\u0703", "xn--wmb"],
  ["\u0704", "xn--xmb"],
  ["\u115F", "xn--osd"],
  ["\u1160", "xn--psd"],
  ["\u1735", "xn--d0e"],
  ["\u2027", "xn--svg"],
  ["\u2028", "xn--tvg"],
  ["\u2029", "xn--uvg"],
  ["\u2039", "xn--bwg"],
  ["\u203A", "xn--cwg"],
  ["\u2041", "xn--jwg"],
  ["\u2044", "xn--mwg"],
  ["\u2052", "xn--0wg"],
  ["\u2153", "xn--13-c6t"],
  ["\u2154", "xn--23-c6t"],
  ["\u2155", "xn--15-c6t"],
  ["\u2156", "xn--25-c6t"],
  ["\u2157", "xn--35-c6t"],
  ["\u2158", "xn--45-c6t"],
  ["\u2159", "xn--16-c6t"],
  ["\u215A", "xn--56-c6t"],
  ["\u215B", "xn--18-c6t"],
  ["\u215C", "xn--38-c6t"],
  ["\u215D", "xn--58-c6t"],
  ["\u215E", "xn--78-c6t"],
  ["\u215F", "xn--1-zjn"],
  ["\u2215", "xn--w9g"],
  ["\u2236", "xn--ubh"],
  ["\u23AE", "xn--lmh"],
  ["\u2571", "xn--hzh"],
  ["\u29F6", "xn--jxi"],
  ["\u29F8", "xn--lxi"],
  ["\u2AFB", "xn--z4i"],
  ["\u2AFD", "xn--14i"],
  ["\u2FF0", "xn--85j"],
  ["\u2FF1", "xn--95j"],
  ["\u2FF2", "xn--b6j"],
  ["\u2FF3", "xn--c6j"],
  ["\u2FF4", "xn--d6j"],
  ["\u2FF5", "xn--e6j"],
  ["\u2FF6", "xn--f6j"],
  ["\u2FF7", "xn--g6j"],
  ["\u2FF8", "xn--h6j"],
  ["\u2FF9", "xn--i6j"],
  ["\u2FFA", "xn--j6j"],
  ["\u2FFB", "xn--k6j"],
  ["\u3014", "xn--96j"],
  ["\u3015", "xn--b7j"],
  ["\u3033", "xn--57j"],
  ["\u3164", "xn--psd"],
  ["\u321D", "xn--()-357j35d"],
  ["\u321E", "xn--()-357jf36c"],
  ["\u33AE", "xn--rads-id9a"],
  ["\u33AF", "xn--rads2-4d6b"],
  ["\u33C6", "xn--ckg-tc2a"],
  ["\u33DF", "xn--am-6bv"],
  ["\uA789", "xn--058a"],
  ["\uFE3F", "xn--x6j"],
  ["\uFE5D", "xn--96j"],
  ["\uFE5E", "xn--b7j"],
  ["\uFFA0", "xn--psd"],
  ["\uFFF9", "xn--vn7c"],
  ["\uFFFA", "xn--wn7c"],
  ["\uFFFB", "xn--xn7c"],
  ["\uFFFC", "xn--yn7c"],
  ["\uFFFD", "xn--zn7c"],

  // Characters from the IDN blacklist that normalize to ASCII
  // If we start using STD3ASCIIRules these will be blocked (bug 316444)
  ["\u00A0", " "],
  ["\u2000", " "],
  ["\u2001", " "],
  ["\u2002", " "],
  ["\u2003", " "],
  ["\u2004", " "],
  ["\u2005", " "],
  ["\u2006", " "],
  ["\u2007", " "],
  ["\u2008", " "],
  ["\u2009", " "],
  ["\u200A", " "],
  ["\u2024", "."],
  ["\u202F", " "],
  ["\u205F", " "],
  ["\u3000", " "],
  ["\u3002", "."],
  ["\uFE14", ";"],
  ["\uFE15", "!"],
  ["\uFF0E", "."],
  ["\uFF0F", "/"],
  ["\uFF61", "."],

  // Characters from the IDN blacklist that are stripped by Nameprep
  ["\u200B", ""],
  ["\uFEFF", ""],
];

function run_test() {
  var pbi = Services.prefs;
  var oldProfile = pbi.getCharPref(
    "network.IDN.restriction_profile",
    "moderate"
  );
  var idnService = Cc["@mozilla.org/network/idn-service;1"].getService(
    Ci.nsIIDNService
  );

  pbi.setCharPref("network.IDN.restriction_profile", "moderate");

  for (var j = 0; j < testcases.length; ++j) {
    var test = testcases[j];
    var URL = test[0] + ".com";
    var punycodeURL = test[1] + ".com";
    var isASCII = {};

    var result;
    try {
      result = idnService.convertToDisplayIDN(URL, isASCII);
    } catch (e) {
      result = ".com";
    }
    // If the punycode URL is equivalent to \ufffd.com (i.e. the
    // blacklisted character has been replaced by a unicode
    // REPLACEMENT CHARACTER, skip the test
    if (result != "xn--zn7c.com") {
      if (punycodeURL.substr(0, 4) == "xn--") {
        // test convertToDisplayIDN with a Unicode URL and with a
        //  Punycode URL if we have one
        equal(escape(result), escape(punycodeURL));

        result = idnService.convertToDisplayIDN(punycodeURL, isASCII);
        equal(escape(result), escape(punycodeURL));
      } else {
        // The "punycode" URL isn't punycode. This happens in testcases
        // where the Unicode URL has become normalized to an ASCII URL,
        // so, even though expectedUnicode is true, the expected result
        // is equal to punycodeURL
        equal(escape(result), escape(punycodeURL));
      }
    }
  }
  pbi.setCharPref("network.IDN.restriction_profile", oldProfile);
}
