tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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);