clone-transferables.js (4564B)
1 // |reftest| skip-if(!xulRuntime.shell) 2 // Any copyright is dedicated to the Public Domain. 3 // http://creativecommons.org/licenses/publicdomain/ 4 5 function* buffer_options() { 6 for (var scope of ["SameProcess", 7 "DifferentProcess", 8 "DifferentProcessForIndexedDB"]) 9 { 10 for (var size of [0, 8, 16, 200, 1000, 4096, 8192, 65536]) { 11 yield { scope, size }; 12 } 13 } 14 } 15 16 17 function test() { 18 for (var {scope, size} of buffer_options()) { 19 var old = new ArrayBuffer(size); 20 var copy = deserialize(serialize([old, old], [old], { scope }), { scope }); 21 assertEq(old.byteLength, 0); 22 assertEq(copy[0] === copy[1], true); 23 copy = copy[0]; 24 assertEq(copy.byteLength, size); 25 26 var constructors = [ Int8Array, 27 Uint8Array, 28 Int16Array, 29 Uint16Array, 30 Int32Array, 31 Uint32Array, 32 Float32Array, 33 Float64Array, 34 Uint8ClampedArray, 35 DataView ]; 36 37 for (var ctor of constructors) { 38 var dataview = (ctor === DataView); 39 40 var buf = new ArrayBuffer(size); 41 var old_arr = new ctor(buf); 42 assertEq(buf.byteLength, size); 43 assertEq(buf, old_arr.buffer); 44 if (!dataview) 45 assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT); 46 47 var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope }); 48 assertEq(buf.byteLength, 0, 49 "donor array buffer should be detached"); 50 if (!dataview) { 51 assertEq(old_arr.length, 0, 52 "donor typed array should be detached"); 53 } 54 assertEq(copy_arr.buffer.byteLength == size, true); 55 if (!dataview) 56 assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT); 57 58 buf = null; 59 old_arr = null; 60 gc(); // Tickle the ArrayBuffer -> view management 61 } 62 63 for (var ctor of constructors) { 64 var dataview = (ctor === DataView); 65 66 var buf = new ArrayBuffer(size); 67 var old_arr = new ctor(buf); 68 var dv = new DataView(buf); // Second view 69 var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope }); 70 assertEq(buf.byteLength, 0, 71 "donor array buffer should be detached"); 72 if (!dataview) { 73 assertEq(old_arr.byteLength, 0, 74 "donor typed array should be detached"); 75 assertEq(old_arr.length, 0, 76 "donor typed array should be detached"); 77 } 78 79 buf = null; 80 old_arr = null; 81 gc(); // Tickle the ArrayBuffer -> view management 82 } 83 84 // Mutate the buffer during the clone operation. The modifications should be visible. 85 if (size >= 4) { 86 old = new ArrayBuffer(size); 87 var view = new Int32Array(old); 88 view[0] = 1; 89 var mutator = { get foo() { view[0] = 2; } }; 90 var copy = deserialize(serialize([ old, mutator ], [ old ], { scope }), { scope }); 91 var viewCopy = new Int32Array(copy[0]); 92 assertEq(view.length, 0); // Underlying buffer now detached. 93 assertEq(viewCopy[0], 2); 94 } 95 96 // Detach the buffer during the clone operation. Should throw an 97 // exception. 98 if (size >= 4) { 99 const b1 = new ArrayBuffer(size); 100 let mutator = { 101 get foo() { 102 serialize(b1, [b1], { scope }); 103 } 104 }; 105 106 assertThrowsInstanceOf( 107 () => serialize([ b1, mutator ], [b1]), 108 TypeError, 109 "detaching (due to Transferring) while serializing should throw" 110 ); 111 112 const b2 = new ArrayBuffer(size); 113 mutator = { 114 get foo() { 115 detachArrayBuffer(b2); 116 } 117 }; 118 119 assertThrowsInstanceOf( 120 () => serialize([ b2, mutator ], [b2]), 121 TypeError, 122 "detaching (due to detachArrayBuffer) while serializing should throw" 123 ); 124 } 125 } 126 } 127 128 test(); 129 reportCompare(0, 0, 'ok');