tor-browser

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

proto-from-ctor-realm.html (3533B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8">
      3 <title>WebAssembly JS API: Default [[Prototype]] value is from NewTarget's Realm</title>
      4 <link rel="help" href="https://webidl.spec.whatwg.org/#internally-create-a-new-object-implementing-the-interface">
      5 <link rel="help" href="https://tc39.es/ecma262/#sec-nativeerror">
      6 <script src="/resources/testharness.js"></script>
      7 <script src="/resources/testharnessreport.js"></script>
      8 <script src="wasm-module-builder.js"></script>
      9 <body>
     10 <iframe id="constructor-iframe" hidden></iframe>
     11 <iframe id="new-target-iframe" hidden></iframe>
     12 <iframe id="other-iframe" hidden></iframe>
     13 <script>
     14 "use strict";
     15 
     16 const constructorRealm = document.querySelector("#constructor-iframe").contentWindow;
     17 const newTargetRealm = document.querySelector("#new-target-iframe").contentWindow;
     18 const otherRealm = document.querySelector("#other-iframe").contentWindow;
     19 
     20 const emptyModuleBinary = new WasmModuleBuilder().toBuffer();
     21 const interfaces = [
     22  ["Module", emptyModuleBinary],
     23  ["Instance", new WebAssembly.Module(emptyModuleBinary)],
     24  ["Memory", {initial: 0}],
     25  ["Table", {element: "anyfunc", initial: 0}],
     26  ["Global", {value: "i32"}],
     27 
     28  // See step 2 of https://tc39.es/ecma262/#sec-nativeerror
     29  ["CompileError"],
     30  ["LinkError"],
     31  ["RuntimeError"],
     32 ];
     33 
     34 const primitives = [
     35  undefined,
     36  null,
     37  false,
     38  true,
     39  0,
     40  -1,
     41  "",
     42  "str",
     43  Symbol(),
     44 ];
     45 
     46 const getNewTargets = function* (realm) {
     47  for (const primitive of primitives) {
     48    const newTarget = new realm.Function();
     49    newTarget.prototype = primitive;
     50    yield [newTarget, "cross-realm NewTarget with `" + format_value(primitive) + "` prototype"];
     51  }
     52 
     53  // GetFunctionRealm (https://tc39.es/ecma262/#sec-getfunctionrealm) coverage:
     54  const bindOther = otherRealm.Function.prototype.bind;
     55  const ProxyOther = otherRealm.Proxy;
     56 
     57  const bound = new realm.Function();
     58  bound.prototype = undefined;
     59  yield [bindOther.call(bound), "bound cross-realm NewTarget with `undefined` prototype"];
     60 
     61  const boundBound = new realm.Function();
     62  boundBound.prototype = null;
     63  yield [bindOther.call(bindOther.call(boundBound)), "bound bound cross-realm NewTarget with `null` prototype"];
     64 
     65  const boundProxy = new realm.Function();
     66  boundProxy.prototype = false;
     67  yield [bindOther.call(new ProxyOther(boundProxy, {})), "bound Proxy of cross-realm NewTarget with `false` prototype"];
     68 
     69  const proxy = new realm.Function();
     70  proxy.prototype = true;
     71  yield [new ProxyOther(proxy, {}), "Proxy of cross-realm NewTarget with `true` prototype"];
     72 
     73  const proxyProxy = new realm.Function();
     74  proxyProxy.prototype = -0;
     75  yield [new ProxyOther(new ProxyOther(proxyProxy, {}), {}), "Proxy of Proxy of cross-realm NewTarget with `-0` prototype"];
     76 
     77  const proxyBound = new realm.Function();
     78  proxyBound.prototype = NaN;
     79  yield [new ProxyOther(bindOther.call(proxyBound), {}), "Proxy of bound cross-realm NewTarget with `NaN` prototype"];
     80 };
     81 
     82 for (const [interfaceName, constructorArg] of interfaces) {
     83  for (const [newTarget, testDescription] of getNewTargets(newTargetRealm)) {
     84    test(() => {
     85      const Constructor = constructorRealm.WebAssembly[interfaceName];
     86      const object = Reflect.construct(Constructor, [constructorArg], newTarget);
     87 
     88      const NewTargetConstructor = newTargetRealm.WebAssembly[interfaceName];
     89      assert_true(object instanceof NewTargetConstructor);
     90      assert_equals(Object.getPrototypeOf(object), NewTargetConstructor.prototype);
     91    }, `WebAssembly.${interfaceName}: ${testDescription}`);
     92  }
     93 }
     94 </script>
     95 </body>