tor-browser

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

test_malformed_utf8.js (2635B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 // nsIPrefBranch.{getCharPref,setCharPref} uses Latin-1 string, and
      6 // nsIPrefBranch.{getStringPref,setStringPref} uses UTF-8 string.
      7 //
      8 // Mixing them results in unexpected string, but it should perform lossy
      9 // conversion, and not throw.
     10 
     11 const gPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
     12 
     13 const tests = [
     14  // Latin-1 to Latin-1 and UTF-8 to UTF-8 should preserve the string.
     15  // Latin-1 to UTF-8 should replace invalid character with REPLACEMENT
     16  // CHARACTER.
     17  // UTF-8 to Latin1 should return the raw UTF-8 code units.
     18 
     19  // UTF-8 code units sequence without the last unit.
     20  //
     21  // input, Latin-1 to UTF-8, UTF-8 to Latin-1
     22  ["\xC2", "\uFFFD", "\xC3\x82"],
     23  ["\xDF", "\uFFFD", "\xC3\x9F"],
     24  ["\xE0\xA0", "\uFFFD", "\xC3\xA0\xC2\xA0"],
     25  ["\xF0\x90\x80", "\uFFFD", "\xC3\xB0\xC2\x90\xC2\x80"],
     26 
     27  // UTF-8 code units sequence with malformed last unit.
     28  //
     29  // input, Latin-1 to UTF-8, UTF-8 to Latin-1
     30  ["\xC2 ", "\uFFFD ", "\xC3\x82 "],
     31  ["\xDF ", "\uFFFD ", "\xC3\x9F "],
     32  ["\xE0\xA0 ", "\uFFFD ", "\xC3\xA0\xC2\xA0 "],
     33  ["\xF0\x90\x80 ", "\uFFFD ", "\xC3\xB0\xC2\x90\xC2\x80 "],
     34 
     35  // UTF-8 code units without the first unit.
     36  //
     37  // input, Latin-1 to UTF-8, UTF-8 to Latin-1
     38  ["\x80", "\uFFFD", "\xC2\x80"],
     39  ["\xBF", "\uFFFD", "\xC2\xBF"],
     40  ["\xA0\x80", "\uFFFD\uFFFD", "\xC2\xA0\xC2\x80"],
     41  ["\x8F\x80\x80", "\uFFFD\uFFFD\uFFFD", "\xC2\x8F\xC2\x80\xC2\x80"],
     42 ];
     43 
     44 add_task(function testLatin1ToLatin1() {
     45  for (const [input, ] of tests) {
     46    gPrefs.setCharPref("test.malformed_utf8_data", input);
     47    const result = gPrefs.getCharPref("test.malformed_utf8_data");
     48    Assert.equal(result, input);
     49  }
     50 });
     51 
     52 add_task(function testLatin1ToUTF8() {
     53  for (const [input, expected] of tests) {
     54    gPrefs.setCharPref("test.malformed_utf8_data", input);
     55    const result = gPrefs.getStringPref("test.malformed_utf8_data");
     56    Assert.equal(result, expected);
     57  }
     58 });
     59 
     60 add_task(function testUTF8ToLatin1() {
     61  for (const [input, , expected] of tests) {
     62    gPrefs.setStringPref("test.malformed_utf8_data", input);
     63    const result = gPrefs.getCharPref("test.malformed_utf8_data");
     64    Assert.equal(result, expected);
     65  }
     66 });
     67 
     68 add_task(function testUTF8ToUTF8() {
     69  for (const [input, ] of tests) {
     70    gPrefs.setStringPref("test.malformed_utf8_data", input);
     71    const result = gPrefs.getStringPref("test.malformed_utf8_data");
     72    Assert.equal(result, input);
     73  }
     74 });