tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }