1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_bug427957.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,100 @@ 1.4 +/** 1.5 + * Test for Bidi restrictions on IDNs from RFC 3454 1.6 + */ 1.7 + 1.8 +var Cc = Components.classes; 1.9 +var Ci = Components.interfaces; 1.10 +var idnService; 1.11 + 1.12 +function expected_pass(inputIDN) 1.13 +{ 1.14 + var isASCII = {}; 1.15 + var displayIDN = idnService.convertToDisplayIDN(inputIDN, isASCII); 1.16 + do_check_eq(displayIDN, inputIDN); 1.17 +} 1.18 + 1.19 +function expected_fail(inputIDN) 1.20 +{ 1.21 + var isASCII = {}; 1.22 + var displayIDN = ""; 1.23 + 1.24 + try { 1.25 + displayIDN = idnService.convertToDisplayIDN(inputIDN, isASCII); 1.26 + } 1.27 + catch(e) {} 1.28 + 1.29 + do_check_neq(displayIDN, inputIDN); 1.30 +} 1.31 + 1.32 +function run_test() { 1.33 + // add an IDN whitelist pref 1.34 + var pbi = Cc["@mozilla.org/preferences-service;1"] 1.35 + .getService(Ci.nsIPrefBranch); 1.36 + pbi.setBoolPref("network.IDN.whitelist.com", true); 1.37 + 1.38 + idnService = Cc["@mozilla.org/network/idn-service;1"] 1.39 + .getService(Ci.nsIIDNService); 1.40 + /* 1.41 + * In any profile that specifies bidirectional character handling, all 1.42 + * three of the following requirements MUST be met: 1.43 + * 1.44 + * 1) The characters in section 5.8 MUST be prohibited. 1.45 + */ 1.46 + 1.47 + // 0340; COMBINING GRAVE TONE MARK 1.48 + expected_fail("foo\u0340bar.com"); 1.49 + // 0341; COMBINING ACUTE TONE MARK 1.50 + expected_fail("foo\u0341bar.com"); 1.51 + // 200E; LEFT-TO-RIGHT MARK 1.52 + expected_fail("foo\200ebar.com"); 1.53 + // 200F; RIGHT-TO-LEFT MARK 1.54 + // Note: this is an RTL IDN so that it doesn't fail test 2) below 1.55 + expected_fail("\u200f\u0645\u062B\u0627\u0644.\u0622\u0632\u0645\u0627\u06CC\u0634\u06CC"); 1.56 + // 202A; LEFT-TO-RIGHT EMBEDDING 1.57 + expected_fail("foo\u202abar.com"); 1.58 + // 202B; RIGHT-TO-LEFT EMBEDDING 1.59 + expected_fail("foo\u202bbar.com"); 1.60 + // 202C; POP DIRECTIONAL FORMATTING 1.61 + expected_fail("foo\u202cbar.com"); 1.62 + // 202D; LEFT-TO-RIGHT OVERRIDE 1.63 + expected_fail("foo\u202dbar.com"); 1.64 + // 202E; RIGHT-TO-LEFT OVERRIDE 1.65 + expected_fail("foo\u202ebar.com"); 1.66 + // 206A; INHIBIT SYMMETRIC SWAPPING 1.67 + expected_fail("foo\u206abar.com"); 1.68 + // 206B; ACTIVATE SYMMETRIC SWAPPING 1.69 + expected_fail("foo\u206bbar.com"); 1.70 + // 206C; INHIBIT ARABIC FORM SHAPING 1.71 + expected_fail("foo\u206cbar.com"); 1.72 + // 206D; ACTIVATE ARABIC FORM SHAPING 1.73 + expected_fail("foo\u206dbar.com"); 1.74 + // 206E; NATIONAL DIGIT SHAPES 1.75 + expected_fail("foo\u206ebar.com"); 1.76 + // 206F; NOMINAL DIGIT SHAPES 1.77 + expected_fail("foo\u206fbar.com"); 1.78 + 1.79 + /* 1.80 + * 2) If a string contains any RandALCat character, the string MUST NOT 1.81 + * contain any LCat character. 1.82 + */ 1.83 + 1.84 + // www.מיץpetel.com is invalid 1.85 + expected_fail("www.\u05DE\u05D9\u05E5petel.com"); 1.86 + // But www.מיץפטל.com is fine because the ltr and rtl characters are in 1.87 + // different labels 1.88 + expected_pass("www.\u05DE\u05D9\u05E5\u05E4\u05D8\u05DC.com"); 1.89 + 1.90 + /* 1.91 + * 3) If a string contains any RandALCat character, a RandALCat 1.92 + * character MUST be the first character of the string, and a 1.93 + * RandALCat character MUST be the last character of the string. 1.94 + */ 1.95 + 1.96 + // www.1מיץ.com is invalid 1.97 + expected_fail("www.1\u05DE\u05D9\u05E5.com"); 1.98 + // www.מיץ1.com is invalid 1.99 + expected_fail("www.\u05DE\u05D9\u05E51.com"); 1.100 + // But www.מיץ1פטל.com is fine 1.101 + expected_pass("www.\u05DE\u05D9\u05E51\u05E4\u05D8\u05DC.com"); 1.102 +} 1.103 +