Source code
Revision control
Copy as Markdown
Other Tools
var gb = 1 * 1024 * 1024 * 1024;
var ab = new ArrayBuffer(5 * gb);
var ta1 = new Uint8Array(ab);
for (var i = 0; i < 5; i++) {
ta1[i * gb + 0] = i + 1;
ta1[i * gb + 1] = i + 2;
ta1[i * gb + 2] = i + 3;
ta1[i * gb + 3] = i + 4;
}
function test(transferables, scope) {
var ta2 = new Int32Array(ab, ab.byteLength - 8, 2);
ta2[0] = 1234567;
var dv1 = new DataView(ab);
var dv2 = new DataView(ab, ab.byteLength - 8);
dv2.setInt32(4, -987654);
var objects = [ab, ta1, ta2, dv1, dv2];
var clonebuf = serialize(objects, transferables, {scope});
check(clonebuf);
}
function check(clonebuf) {
var objects = deserialize(clonebuf);
assertEq(objects.length, 5);
var ab = objects[0];
assertEq(ab instanceof ArrayBuffer, true);
assertEq(ab.byteLength, 5 * gb);
var ta1 = objects[1];
assertEq(ta1 instanceof Uint8Array, true);
assertEq(ta1.buffer, ab);
assertEq(ta1.byteOffset, 0);
assertEq(ta1.length, 5 * gb);
for (var i = 0; i < 5; i++) {
assertEq(ta1[i * gb + 0], i + 1);
assertEq(ta1[i * gb + 1], i + 2);
assertEq(ta1[i * gb + 2], i + 3);
assertEq(ta1[i * gb + 3], i + 4);
}
var ta2 = objects[2];
assertEq(ta2 instanceof Int32Array, true);
assertEq(ta2.buffer, ab);
assertEq(ta2.byteOffset, 5 * gb - 8);
assertEq(ta2.length, 2);
assertEq(ta2[0], 1234567);
var dv1 = objects[3];
assertEq(dv1 instanceof DataView, true);
assertEq(dv1.buffer, ab);
assertEq(dv1.byteOffset, 0);
assertEq(dv1.byteLength, 5 * gb);
var dv2 = objects[4];
assertEq(dv2 instanceof DataView, true);
assertEq(dv2.buffer, ab);
assertEq(dv2.byteOffset, 5 * gb - 8);
assertEq(dv2.byteLength, 8);
assertEq(dv2.getInt32(4), -987654);
}
// It would be nice to test serialization of the ArrayBuffer's contents, but it
// causes OOMs and/or timeouts in automation so for now only test the more
// efficient version that transfers the underlying buffer.
//test([], "DifferentProcessForIndexedDB");
//assertEq(ab.byteLength, 5 * gb);
test([ab], "SameProcess");
assertEq(ab.byteLength, 0);