tor-browser

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

mailbox.js (3462B)


      1 // |reftest| skip-if(!xulRuntime.shell)
      2 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
      3 /*
      4 * Any copyright is dedicated to the Public Domain.
      5 * http://creativecommons.org/licenses/publicdomain/
      6 */
      7 
      8 // Tests the shared-object mailbox in the shell.
      9 
     10 var hasSharedMemory = !!(this.SharedArrayBuffer &&
     11                         this.getSharedObject &&
     12                         this.setSharedObject);
     13 
     14 if (!hasSharedMemory) {
     15    reportCompare(true, true);
     16    quit(0);
     17 }
     18 
     19 var sab = new SharedArrayBuffer(12);
     20 var mem = new Int32Array(sab);
     21 
     22 // SharedArrayBuffer mailbox tests
     23 
     24 assertEq(getSharedObject(), null); // Mbx starts empty
     25 
     26 assertEq(setSharedObject(mem.buffer), undefined); // Setter returns undefined
     27 assertEq(getSharedObject() == null, false);       // And then the mbx is not empty
     28 
     29 var v = getSharedObject();
     30 assertEq(v.byteLength, mem.buffer.byteLength); // Looks like what we put in?
     31 var w = new Int32Array(v);
     32 mem[0] = 314159;
     33 assertEq(w[0], 314159);		// Shares memory (locally) with what we put in?
     34 mem[0] = 0;
     35 
     36 setSharedObject(3.14);	// Share numbers
     37 assertEq(getSharedObject(), 3.14);
     38 
     39 setSharedObject(null);	// Setting to null clears to null
     40 assertEq(getSharedObject(), null);
     41 
     42 setSharedObject(mem.buffer);
     43 setSharedObject(undefined); // Setting to undefined clears to null
     44 assertEq(getSharedObject(), null);
     45 
     46 setSharedObject(mem.buffer);
     47 setSharedObject();		// Setting without arguments clears to null
     48 assertEq(getSharedObject(), null);
     49 
     50 // Non-shared objects cannot be stored in the mbx
     51 
     52 assertThrowsInstanceOf(() => setSharedObject({x:10, y:20}), Error);
     53 assertThrowsInstanceOf(() => setSharedObject([1,2]), Error);
     54 assertThrowsInstanceOf(() => setSharedObject(new ArrayBuffer(10)), Error);
     55 assertThrowsInstanceOf(() => setSharedObject(new Int32Array(10)), Error);
     56 assertThrowsInstanceOf(() => setSharedObject(false), Error);
     57 assertThrowsInstanceOf(() => setSharedObject(mem), Error);
     58 assertThrowsInstanceOf(() => setSharedObject("abracadabra"), Error);
     59 assertThrowsInstanceOf(() => setSharedObject(() => 37), Error);
     60 
     61 // We can store wasm shared memories, too
     62 
     63 if (!this.WebAssembly || !wasmThreadsEnabled()) {
     64    reportCompare(true, true);
     65    quit(0);
     66 }
     67 
     68 setSharedObject(null);
     69 
     70 var mem = new WebAssembly.Memory({initial: 1, maximum: 1, shared: true});
     71 setSharedObject(mem);
     72 var ia1 = new Int32Array(mem.buffer);
     73 
     74 var mem2 = getSharedObject();
     75 assertEq(mem2.buffer instanceof SharedArrayBuffer, true);
     76 assertEq(mem2.buffer.byteLength, 65536);
     77 var ia2 = new Int32Array(mem2.buffer);
     78 
     79 ia2[37] = 0x12345678;
     80 assertEq(ia1[37], 0x12345678);
     81 
     82 // Can't store a non-shared memory
     83 
     84 assertThrowsInstanceOf(() => setSharedObject(new WebAssembly.Memory({initial: 1, maximum: 1})), Error);
     85 
     86 // We can store wasm modules
     87 
     88 var mod = new WebAssembly.Module(wasmTextToBinary(`(module
     89                                                    (import "m" "f" (func (param i32) (result i32)))
     90                                                    (func (export "hi") (result i32)
     91                                                     (i32.const 37))
     92                                                    )`));
     93 
     94 setSharedObject(mod);
     95 
     96 var mod2 = getSharedObject();
     97 
     98 // This should fail because we're not providing the correct import object
     99 assertThrowsInstanceOf(() => new WebAssembly.Instance(mod2, {m:{}}), WebAssembly.LinkError);
    100 
    101 // But this should work
    102 new WebAssembly.Instance(mod2, {m:{f:(x) => x}});
    103 
    104 reportCompare(true,true);