structured-clone.js (2148B)
1 var gb = 1 * 1024 * 1024 * 1024; 2 var ab = new ArrayBuffer(5 * gb); 3 4 var ta1 = new Uint8Array(ab); 5 6 for (var i = 0; i < 5; i++) { 7 ta1[i * gb + 0] = i + 1; 8 ta1[i * gb + 1] = i + 2; 9 ta1[i * gb + 2] = i + 3; 10 ta1[i * gb + 3] = i + 4; 11 } 12 13 function test(transferables, scope) { 14 var ta2 = new Int32Array(ab, ab.byteLength - 8, 2); 15 ta2[0] = 1234567; 16 var dv1 = new DataView(ab); 17 var dv2 = new DataView(ab, ab.byteLength - 8); 18 dv2.setInt32(4, -987654); 19 var objects = [ab, ta1, ta2, dv1, dv2]; 20 21 var clonebuf = serialize(objects, transferables, {scope}); 22 check(clonebuf); 23 } 24 25 function check(clonebuf) { 26 var objects = deserialize(clonebuf); 27 assertEq(objects.length, 5); 28 29 var ab = objects[0]; 30 assertEq(ab instanceof ArrayBuffer, true); 31 assertEq(ab.byteLength, 5 * gb); 32 33 var ta1 = objects[1]; 34 assertEq(ta1 instanceof Uint8Array, true); 35 assertEq(ta1.buffer, ab); 36 assertEq(ta1.byteOffset, 0); 37 assertEq(ta1.length, 5 * gb); 38 39 for (var i = 0; i < 5; i++) { 40 assertEq(ta1[i * gb + 0], i + 1); 41 assertEq(ta1[i * gb + 1], i + 2); 42 assertEq(ta1[i * gb + 2], i + 3); 43 assertEq(ta1[i * gb + 3], i + 4); 44 } 45 46 var ta2 = objects[2]; 47 assertEq(ta2 instanceof Int32Array, true); 48 assertEq(ta2.buffer, ab); 49 assertEq(ta2.byteOffset, 5 * gb - 8); 50 assertEq(ta2.length, 2); 51 assertEq(ta2[0], 1234567); 52 53 var dv1 = objects[3]; 54 assertEq(dv1 instanceof DataView, true); 55 assertEq(dv1.buffer, ab); 56 assertEq(dv1.byteOffset, 0); 57 assertEq(dv1.byteLength, 5 * gb); 58 59 var dv2 = objects[4]; 60 assertEq(dv2 instanceof DataView, true); 61 assertEq(dv2.buffer, ab); 62 assertEq(dv2.byteOffset, 5 * gb - 8); 63 assertEq(dv2.byteLength, 8); 64 assertEq(dv2.getInt32(4), -987654); 65 } 66 67 // It would be nice to test serialization of the ArrayBuffer's contents, but it 68 // causes OOMs and/or timeouts in automation so for now only test the more 69 // efficient version that transfers the underlying buffer. 70 //test([], "DifferentProcessForIndexedDB"); 71 //assertEq(ab.byteLength, 5 * gb); 72 73 test([ab], "SameProcess"); 74 assertEq(ab.byteLength, 0);