// Tests illegal UTF-8 sequences const Cc = Components.Constructor; const Ci = Components.interfaces; const inStrings1 = new Array("%c0%af", // long forms of 0x2F "%e0%80%af", "%f0%80%80%af", "%f8%80%80%80%af", "%fc%80%80%80%80%af", // lone surrogates "%ed%a0%80", // D800 "%ed%ad%bf", // DB7F "%ed%ae%80", // DB80 "%ed%af%bf", // DBFF "%ed%b0%80", // DC00 "%ed%be%80", // DF80 "%ed%bf%bf"); // DFFF const expected1 = "ABC\ufffdXYZ"; // Surrogate pairs const inStrings2 = new Array("%ed%a0%80%ed%b0%80", // D800 DC00 "%ed%a0%80%ed%bf%bf", // D800 DFFF "%ed%ad%bf%ed%b0%80", // DB7F DC00 "%ed%ad%bf%ed%bf%bf", // DB7F DFFF "%ed%ae%80%ed%b0%80", // DB80 DC00 "%ed%ae%80%ed%bf%bf", // DB80 DFFF "%ed%af%bf%ed%b0%80", // DBFF DC00 "%ed%ad%bf%ed%bf%bf"); // DBFF DFFF const expected2 = "ABC\ufffd\ufffdXYZ"; function testCaseInputStream(inStr, expected) { var dataURI = "data:text/plain; charset=UTF-8,ABC" + inStr + "XYZ" dump(inStr + "==>"); var IOService = Cc("@mozilla.org/network/io-service;1", "nsIIOService"); var ConverterInputStream = Cc("@mozilla.org/intl/converter-input-stream;1", "nsIConverterInputStream", "init"); var ios = new IOService(); var channel = ios.newChannel(dataURI, "", null); var testInputStream = channel.open(); var testConverter = new ConverterInputStream(testInputStream, "UTF-8", 16, 0xFFFD); if (!(testConverter instanceof Ci.nsIUnicharLineInputStream)) throw "not line input stream"; var outStr = ""; var more; do { // read the line and check for eof var line = {}; more = testConverter.readLine(line); outStr += line.value; } while (more); dump(outStr + "; expected=" + expected + "\n"); do_check_eq(outStr, expected); do_check_eq(outStr.length, expected.length); } function run_test() { for (var i = 0; i < inStrings1.length; ++i) { var inStr = inStrings1[i]; testCaseInputStream(inStr, expected1); } for (var i = 0; i < inStrings2.length; ++i) { var inStr = inStrings2[i]; testCaseInputStream(inStr, expected2); } }