// |reftest| skip-if(!xulRuntime.shell)
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
function* buffer_options() {
for (
var scope of [
"SameProcess",
"DifferentProcess",
"DifferentProcessForIndexedDB"])
{
for (
var size of [
0,
8,
16,
200,
1000,
4096,
8192,
65536]) {
yield { scope, size };
}
}
}
function test() {
for (
var {scope, size} of buffer_options()) {
var old =
new ArrayBuffer(size);
var copy = deserialize(serialize([old, old], [old], { scope }), { scope });
assertEq(old.byteLength,
0);
assertEq(copy[
0] === copy[
1],
true);
copy = copy[
0];
assertEq(copy.byteLength, size);
var constructors = [ Int8Array,
Uint8Array,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
Uint8ClampedArray,
DataView ];
for (
var ctor of constructors) {
var dataview = (ctor === DataView);
var buf =
new ArrayBuffer(size);
var old_arr =
new ctor(buf);
assertEq(buf.byteLength, size);
assertEq(buf, old_arr.buffer);
if (!dataview)
assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT);
var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
assertEq(buf.byteLength,
0,
"donor array buffer should be detached");
if (!dataview) {
assertEq(old_arr.length,
0,
"donor typed array should be detached");
}
assertEq(copy_arr.buffer.byteLength == size,
true);
if (!dataview)
assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT);
buf =
null;
old_arr =
null;
gc();
// Tickle the ArrayBuffer -> view management
}
for (
var ctor of constructors) {
var dataview = (ctor === DataView);
var buf =
new ArrayBuffer(size);
var old_arr =
new ctor(buf);
var dv =
new DataView(buf);
// Second view
var copy_arr = deserialize(serialize(old_arr, [ buf ], { scope }), { scope });
assertEq(buf.byteLength,
0,
"donor array buffer should be detached");
if (!dataview) {
assertEq(old_arr.byteLength,
0,
"donor typed array should be detached");
assertEq(old_arr.length,
0,
"donor typed array should be detached");
}
buf =
null;
old_arr =
null;
gc();
// Tickle the ArrayBuffer -> view management
}
// Mutate the buffer during the clone operation. The modifications should be visible.
if (size >=
4) {
old =
new ArrayBuffer(size);
var view =
new Int32Array(old);
view[
0] =
1;
var mutator = { get foo() { view[
0] =
2; } };
var copy = deserialize(serialize([ old, mutator ], [ old ], { scope }), { scope });
var viewCopy =
new Int32Array(copy[
0]);
assertEq(view.length,
0);
// Underlying buffer now detached.
assertEq(viewCopy[
0],
2);
}
// Detach the buffer during the clone operation. Should throw an
// exception.
if (size >=
4) {
const b1 =
new ArrayBuffer(size);
let mutator = {
get foo() {
serialize(b1, [b1], { scope });
}
};
assertThrowsInstanceOf(
() => serialize([ b1, mutator ], [b1]),
TypeError,
"detaching (due to Transferring) while serializing should throw"
);
const b2 =
new ArrayBuffer(size);
mutator = {
get foo() {
detachArrayBuffer(b2);
}
};
assertThrowsInstanceOf(
() => serialize([ b2, mutator ], [b2]),
TypeError,
"detaching (due to detachArrayBuffer) while serializing should throw"
);
}
}
}
test();
reportCompare(
0,
0,
'ok');