test_bug563618.js (2803B)
1 /* Test case for bug 563618 2 * 3 * Uses nsIConverterInputStream to decode invalid EUC-JP text 4 * 5 */ 6 7 const { NetUtil } = ChromeUtils.importESModule( 8 "resource://gre/modules/NetUtil.sys.mjs" 9 ); 10 11 const test = [ 12 // 0: 0x8e followed by hi byte, not valid JIS X 0201 13 [ 14 "abcdefghijklmnopqrstuvwxyz12test00%8e%80foobar", 15 // expected: one replacement character, invalid byte eaten 16 "abcdefghijklmnopqrstuvwxyz12test00\uFFFDfoobar", 17 ], 18 // 1: 0x8e followed by ASCII 19 [ 20 "abcdefghijklmnopqrstuvwxyz12test01%8efoobar", 21 // expected: one replacement character, invalid byte not eaten 22 "abcdefghijklmnopqrstuvwxyz12test01\uFFFDfoobar", 23 ], 24 // 2: JIS X 0208 lead byte followed by invalid hi byte 25 [ 26 "abcdefghijklmnopqrstuvwxyz12test02%bf%80foobar", 27 // expected: one replacement character, invalid byte eaten 28 "abcdefghijklmnopqrstuvwxyz12test02\uFFFDfoobar", 29 ], 30 // 3: JIS X 0208 lead byte followed by ASCII 31 [ 32 "abcdefghijklmnopqrstuvwxyz12test03%bffoobar", 33 // expected: one replacement character, invalid byte not eaten 34 "abcdefghijklmnopqrstuvwxyz12test03\uFFFDfoobar", 35 ], 36 ]; 37 38 const ConverterInputStream = Components.Constructor( 39 "@mozilla.org/intl/converter-input-stream;1", 40 "nsIConverterInputStream", 41 "init" 42 ); 43 44 function testCase(testText, expectedText, bufferLength, charset) { 45 var dataURI = "data:text/plain;charset=" + charset + "," + testText; 46 var channel = NetUtil.newChannel({ 47 uri: dataURI, 48 loadUsingSystemPrincipal: true, 49 }); 50 var testInputStream = channel.open(); 51 var testConverter = new ConverterInputStream( 52 testInputStream, 53 charset, 54 bufferLength, 55 0xfffd 56 ); 57 58 if (!(testConverter instanceof Ci.nsIUnicharLineInputStream)) { 59 throw new Error("not line input stream"); 60 } 61 62 var outStr = ""; 63 var more; 64 do { 65 // read the line and check for eof 66 var line = {}; 67 more = testConverter.readLine(line); 68 outStr += line.value; 69 } while (more); 70 71 if (outStr != expectedText) { 72 dump("Failed with bufferLength = " + bufferLength + "\n"); 73 if (outStr.length == expectedText.length) { 74 for (let i = 0; i < outStr.length; ++i) { 75 if (outStr.charCodeAt(i) != expectedText.charCodeAt(i)) { 76 dump( 77 i + 78 ": " + 79 outStr.charCodeAt(i).toString(16) + 80 " != " + 81 expectedText.charCodeAt(i).toString(16) + 82 "\n" 83 ); 84 } 85 } 86 } 87 } 88 89 // escape the strings before comparing for better readability 90 Assert.equal(escape(outStr), escape(expectedText)); 91 } 92 93 function run_test() { 94 for (var i = 0; i < test.length; ++i) { 95 for (var bufferLength = 32; bufferLength < 40; ++bufferLength) { 96 testCase(test[i][0], test[i][1], bufferLength, "EUC-JP"); 97 } 98 } 99 }