test_arraybufferinputstream.html (2211B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 --> 5 <head> 6 <title>ArrayBuffer stream test</title> 7 <script src="/tests/SimpleTest/SimpleTest.js"></script> 8 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 9 10 <script type="text/javascript"> 11 function detachArrayBuffer(ab) 12 { 13 var w = new Worker("data:application/javascript,"); 14 w.postMessage(ab, [ab]); 15 } 16 17 function test() 18 { 19 var ab = new ArrayBuffer(4000); 20 var ta = new Uint8Array(ab); 21 ta[0] = 'a'.charCodeAt(0); 22 ta[1] = 'b'.charCodeAt(0); 23 24 const Cc = SpecialPowers.Cc, Ci = SpecialPowers.Ci; 25 var abis = Cc["@mozilla.org/io/arraybuffer-input-stream;1"] 26 .createInstance(Ci.nsIArrayBufferInputStream); 27 28 var sis = Cc["@mozilla.org/scriptableinputstream;1"] 29 .createInstance(Ci.nsIScriptableInputStream); 30 sis.init(abis); 31 32 is(sis.read(1), "", "should read no data from an uninitialized ABIS"); 33 34 abis.setData(ab, 0, 256 * 1024); 35 36 is(sis.read(1), "a", "should read 'a' after init"); 37 38 detachArrayBuffer(ab); 39 40 SpecialPowers.forceGC(); 41 SpecialPowers.forceGC(); 42 43 try 44 { 45 is(sis.read(1), "b", "should read 'b' after detaching buffer"); 46 } 47 catch (e) 48 { 49 ok(false, "reading from stream should have worked"); 50 } 51 52 // A regression test for bug 1265076. Previously, overflowing 53 // the internal buffer from readSegments would cause incorrect 54 // copying. The constant mirrors the value in 55 // ArrayBufferInputStream::readSegments. 56 var size = 8192; 57 ab = new ArrayBuffer(2 * size); 58 ta = new Uint8Array(ab); 59 60 var i; 61 for (i = 0; i < size; ++i) { 62 ta[i] = 'x'.charCodeAt(0); 63 } 64 for (i = 0; i < size; ++i) { 65 ta[size + i] = 'y'.charCodeAt(0); 66 } 67 68 abis = Cc["@mozilla.org/io/arraybuffer-input-stream;1"] 69 .createInstance(Ci.nsIArrayBufferInputStream); 70 abis.setData(ab, 0, 2 * size); 71 72 sis = Cc["@mozilla.org/scriptableinputstream;1"] 73 .createInstance(Ci.nsIScriptableInputStream); 74 sis.init(abis); 75 76 var result = sis.read(2 * size); 77 is(result, "x".repeat(size) + "y".repeat(size), "correctly read the data"); 78 } 79 80 test(); 81 </script> 82 </head> 83 <body> 84 <p id="display"></p> 85 <div id="content" style="display: none"></div> 86 <pre id="test"> 87 </pre> 88 </body> 89 </html>