tor-browser

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

to-resizable-buffer.any.js (2497B)


      1 // META: global=window,dedicatedworker,jsshell
      2 // META: script=/wasm/jsapi/wasm-module-builder.js
      3 
      4 test(() => {
      5  const thisValues = [
      6    undefined,
      7    null,
      8    true,
      9    "",
     10    Symbol(),
     11    1,
     12    {},
     13    WebAssembly.Memory,
     14    WebAssembly.Memory.prototype,
     15  ];
     16 
     17  const desc = Object.getOwnPropertyDescriptor(WebAssembly.Memory.prototype, "toResizableBuffer");
     18  assert_equals(typeof desc, "object");
     19 
     20  const fun = desc.value;
     21  assert_equals(typeof desc.value, "function");
     22 
     23  for (const thisValue of thisValues) {
     24    assert_throws_js(TypeError, () => fun.call(thisValue), `this=${format_value(thisValue)}`);
     25  }
     26 }, "API surface");
     27 
     28 test(() => {
     29  const memory = new WebAssembly.Memory({ initial: 0, maximum: 1 });
     30  const buffer1 = memory.buffer;
     31 
     32  assert_false(buffer1.resizable, "By default the AB is initially not resizable");
     33 
     34  const buffer2 = memory.toResizableBuffer();
     35  assert_true(buffer2.resizable);
     36  assert_not_equals(buffer1, buffer2, "Changing resizability makes a new object");
     37  assert_true(buffer1.detached);
     38  assert_equals(memory.buffer, buffer2, "The buffer created by the most recent toFooBuffer call is cached");
     39 
     40  const buffer3 = memory.toResizableBuffer();
     41  assert_equals(buffer2, buffer3, "toResizableBuffer does nothing if buffer is already resizable")
     42  assert_equals(memory.buffer, buffer3);
     43 
     44 }, "toResizableBuffer caching behavior");
     45 
     46 test(() => {
     47  {
     48    const maxNumPages = 4;
     49    const memory = new WebAssembly.Memory({ initial: 0, maximum: maxNumPages });
     50    const buffer = memory.toResizableBuffer();
     51    assert_equals(buffer.maxByteLength, kPageSize * maxNumPages, "Memory maximum is same as maxByteLength");
     52  }
     53 }, "toResizableBuffer max size");
     54 
     55 test(() => {
     56  const maxNumPages = 4;
     57  const memory = new WebAssembly.Memory({ initial: 0, maximum: maxNumPages });
     58  const buffer = memory.toResizableBuffer();
     59 
     60  assert_equals(buffer.byteLength, 0);
     61  buffer.resize(2 * kPageSize);
     62  assert_equals(buffer.byteLength, 2 * kPageSize);
     63 
     64  assert_throws_js(RangeError, () => buffer.resize(3 * kPageSize - 1), "Can only grow by page multiples");
     65  assert_throws_js(RangeError, () => buffer.resize(1 * kPageSize), "Cannot shrink");
     66 }, "Resizing a Memory's resizable buffer");
     67 
     68 test(() => {
     69  const memory = new WebAssembly.Memory({ initial: 0, maximum: 1 });
     70  const buffer = memory.toResizableBuffer();
     71  assert_throws_js(TypeError, () => buffer.transfer(), "Cannot be detached by JS");
     72 }, "Resizable buffers from Memory cannot be detached by JS");