test_bug381412.gb2312.js (1724B)
1 const charset = "GB2312"; 2 3 function error(inString, outString, msg) { 4 var dispIn = ""; 5 var dispOut = ""; 6 var i; 7 for (i = 0; i < inString.length; ++i) { 8 dispIn += " x" + inString.charCodeAt(i).toString(16); 9 } 10 if (!outString.length) { 11 dispOut = "<empty>"; 12 } else { 13 for (i = 0; i < outString.length; ++i) { 14 dispOut += " x" + outString.charCodeAt(i).toString(16); 15 } 16 } 17 dump('"' + dispIn + '" ==> "' + dispOut + '"\n'); 18 do_throw("security risk: " + msg); 19 } 20 21 function run_test() { 22 var ScriptableUnicodeConverter = Components.Constructor( 23 "@mozilla.org/intl/scriptableunicodeconverter", 24 "nsIScriptableUnicodeConverter" 25 ); 26 27 var converter = new ScriptableUnicodeConverter(); 28 converter.charset = charset; 29 30 var leadByte, trailByte; 31 var inString; 32 for (leadByte = 1; leadByte < 0x100; ++leadByte) { 33 for (trailByte = 1; trailByte < 0x100; ++trailByte) { 34 inString = String.fromCharCode(leadByte, trailByte, 65); 35 var outString = converter.ConvertToUnicode(inString) + converter.Finish(); 36 switch (outString.length) { 37 case 1: 38 error(inString, outString, "2 byte sequence eaten"); 39 break; 40 case 2: 41 if ( 42 outString.charCodeAt(0) < 0x80 && 43 outString.charCodeAt(1) < 0x80 44 ) { 45 error(inString, outString, "2 byte sequence converted to 1 ASCII"); 46 } 47 break; 48 case 3: 49 if ( 50 outString != inString && 51 outString.charCodeAt(0) < 0x80 && 52 outString.charCodeAt(1) < 0x80 53 ) { 54 error(inString, outString, "2 byte sequence converted to 2 ASCII"); 55 } 56 break; 57 } 58 } 59 } 60 }