tor-browser

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

shell-wrapper.js (6857B)


      1 // |jit-test|
      2 // Test shell ModuleObject wrapper's accessors and methods
      3 
      4 load(libdir + "asserts.js");
      5 
      6 function testGetter(obj, name) {
      7  // Check the getter is defined on the instance, instead of prototype.
      8  //   * raw ModuleObject's getters are defined on prototype
      9  //   * ModuleObject wrapper's getters are defined on instance
     10  const desc = Object.getOwnPropertyDescriptor(obj, name);
     11  assertEq(typeof desc.get, "function");
     12  assertEq(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), name),
     13           undefined);
     14 
     15  // Check invalid this value.
     16  assertThrowsInstanceOf(() => {
     17    desc.get.call({});
     18  }, Error);
     19 }
     20 
     21 // ==== namespace getter ====
     22 const a = registerModule('a', parseModule(`
     23 export const v = 10;
     24 `));
     25 const b = registerModule('b', parseModule(`
     26 import * as ns from 'a'
     27 `));
     28 moduleLink(b);
     29 moduleEvaluate(b);
     30 assertEq(a.namespace.v, 10);
     31 testGetter(a, "namespace");
     32 
     33 // ==== status getter ====
     34 const c = registerModule('c', parseModule(`
     35 `));
     36 assertEq(c.status, "New");
     37 moduleLink(c);
     38 assertEq(c.status, "Linked");
     39 moduleEvaluate(c);
     40 assertEq(c.status, "Evaluated");
     41 testGetter(c, "status");
     42 
     43 // ==== evaluationError getter ====
     44 const d = registerModule('d', parseModule(`
     45 f();
     46 `));
     47 moduleLink(d);
     48 moduleEvaluate(d).catch(e => undefined);
     49 drainJobQueue();
     50 assertEq(d.evaluationError instanceof ReferenceError, true);
     51 testGetter(d, "evaluationError");
     52 
     53 // ==== requestedModules getter ====
     54 const e = parseModule(`
     55 import a from 'b';
     56 `);
     57 assertEq(e.requestedModules.length, 1);
     58 assertEq(e.requestedModules[0].moduleRequest.specifier, 'b');
     59 assertEq(e.requestedModules[0].moduleRequest.moduleType, 'js');
     60 assertEq(e.requestedModules[0].lineNumber, 2);
     61 assertEq(e.requestedModules[0].columnNumber, 15);
     62 testGetter(e, "requestedModules");
     63 testGetter(e.requestedModules[0], "moduleRequest");
     64 testGetter(e.requestedModules[0].moduleRequest, "specifier");
     65 testGetter(e.requestedModules[0].moduleRequest, "moduleType");
     66 testGetter(e.requestedModules[0], "lineNumber");
     67 testGetter(e.requestedModules[0], "columnNumber");
     68 
     69 const e1 = parseModule(`
     70 import a from 'b' with {type: 'json'};
     71 `);
     72 assertEq(e1.requestedModules.length, 1);
     73 assertEq(e1.requestedModules[0].moduleRequest.specifier, 'b');
     74 assertEq(e1.requestedModules[0].moduleRequest.moduleType, 'json');
     75 assertEq(e1.requestedModules[0].moduleRequest.firstUnsupportedAttributeKey, null);
     76 assertEq(e1.requestedModules[0].lineNumber, 2);
     77 assertEq(e1.requestedModules[0].columnNumber, 15);
     78 testGetter(e1, "requestedModules");
     79 testGetter(e1.requestedModules[0], "moduleRequest");
     80 testGetter(e1.requestedModules[0].moduleRequest, "specifier");
     81 testGetter(e1.requestedModules[0].moduleRequest, "moduleType");
     82 testGetter(e1.requestedModules[0], "lineNumber");
     83 testGetter(e1.requestedModules[0], "columnNumber");
     84 
     85 const e2 = parseModule(`
     86 import a from 'b' with {type: 'cpp', foo: 'bar'};
     87 `);
     88 assertEq(e2.requestedModules.length, 1);
     89 assertEq(e2.requestedModules[0].moduleRequest.specifier, 'b');
     90 assertEq(e2.requestedModules[0].moduleRequest.moduleType, 'unknown');
     91 assertEq(e2.requestedModules[0].moduleRequest.firstUnsupportedAttributeKey, 'foo');
     92 testGetter(e2, "requestedModules");
     93 testGetter(e2.requestedModules[0], "moduleRequest");
     94 testGetter(e2.requestedModules[0].moduleRequest, "specifier");
     95 testGetter(e2.requestedModules[0].moduleRequest, "moduleType");
     96 testGetter(e2.requestedModules[0].moduleRequest, "firstUnsupportedAttributeKey");
     97 
     98 // ==== importEntries getter ====
     99 const f = parseModule(`
    100 import {a as A} from 'b';
    101 `);
    102 assertEq(f.importEntries.length, 1);
    103 assertEq(f.importEntries[0].moduleRequest.specifier, 'b');
    104 assertEq(f.importEntries[0].importName, 'a');
    105 assertEq(f.importEntries[0].localName, 'A');
    106 assertEq(f.importEntries[0].lineNumber, 2);
    107 assertEq(f.importEntries[0].columnNumber, 9);
    108 testGetter(f, "importEntries");
    109 testGetter(f.importEntries[0], "moduleRequest");
    110 testGetter(f.importEntries[0].moduleRequest, "specifier");
    111 testGetter(f.importEntries[0], "importName");
    112 testGetter(f.importEntries[0], "localName");
    113 testGetter(f.importEntries[0], "lineNumber");
    114 testGetter(f.importEntries[0], "columnNumber");
    115 
    116 // ==== localExportEntries getter ====
    117 const g = parseModule(`
    118 export const v = 1;
    119 `);
    120 assertEq(g.localExportEntries.length, 1);
    121 assertEq(g.localExportEntries[0].exportName, 'v');
    122 assertEq(g.localExportEntries[0].moduleRequest, null);
    123 assertEq(g.localExportEntries[0].importName, null);
    124 assertEq(g.localExportEntries[0].localName, 'v');
    125 assertEq(g.localExportEntries[0].lineNumber, 0);
    126 assertEq(g.localExportEntries[0].columnNumber, 1);
    127 testGetter(g, "localExportEntries");
    128 testGetter(g.localExportEntries[0], "exportName");
    129 testGetter(g.localExportEntries[0], "moduleRequest");
    130 testGetter(g.localExportEntries[0], "importName");
    131 testGetter(g.localExportEntries[0], "localName");
    132 testGetter(g.localExportEntries[0], "lineNumber");
    133 testGetter(g.localExportEntries[0], "columnNumber");
    134 
    135 // ==== indirectExportEntries getter ====
    136 const h = parseModule(`
    137 export {v} from "b";
    138 `);
    139 assertEq(h.indirectExportEntries.length, 1);
    140 assertEq(h.indirectExportEntries[0].exportName, 'v');
    141 assertEq(h.indirectExportEntries[0].moduleRequest.specifier, "b");
    142 assertEq(h.indirectExportEntries[0].importName, "v");
    143 assertEq(h.indirectExportEntries[0].localName, null);
    144 assertEq(h.indirectExportEntries[0].lineNumber, 2);
    145 assertEq(h.indirectExportEntries[0].columnNumber, 9);
    146 
    147 // ==== starExportEntries getter ====
    148 const i = parseModule(`
    149 export * from "b";
    150 `);
    151 assertEq(i.starExportEntries.length, 1);
    152 assertEq(i.starExportEntries[0].exportName, null);
    153 assertEq(i.starExportEntries[0].moduleRequest.specifier, "b");
    154 assertEq(i.starExportEntries[0].importName, null);
    155 assertEq(i.starExportEntries[0].localName, null);
    156 assertEq(i.starExportEntries[0].lineNumber, 2);
    157 assertEq(i.starExportEntries[0].columnNumber, 8);
    158 
    159 // ==== dfsAncestorIndex getter ====
    160 const j = registerModule('j', parseModule(`
    161 export const v1 = 10;
    162 import {v2} from 'k'
    163 `));
    164 const k = registerModule('k', parseModule(`
    165 export const v2 = 10;
    166 import {v1} from 'j'
    167 `));
    168 const l = registerModule('l', parseModule(`
    169 export const v3 = 10;
    170 import {v2} from 'k'
    171 import {v1} from 'j'
    172 `));
    173 assertEq(j.dfsAncestorIndex, undefined);
    174 assertEq(k.dfsAncestorIndex, undefined);
    175 assertEq(l.dfsAncestorIndex, undefined);
    176 moduleLink(l);
    177 assertEq(j.dfsAncestorIndex, 1);
    178 assertEq(k.dfsAncestorIndex, 1);
    179 assertEq(l.dfsAncestorIndex, 0);
    180 
    181 // ==== async and promises getters ====
    182 const m = parseModule(`
    183 `);
    184 assertEq(m.hasTopLevelAwait, false);
    185 assertEq(m.topLevelCapability, undefined);
    186 assertEq(m.asyncEvaluationOrder, -1);
    187 assertEq(m.asyncParentModules[0], undefined);
    188 assertEq(m.pendingAsyncDependencies, undefined);
    189 testGetter(m, "hasTopLevelAwait");
    190 testGetter(m, "topLevelCapability");
    191 testGetter(m, "asyncEvaluationOrder");
    192 testGetter(m, "asyncParentModules");
    193 testGetter(m, "pendingAsyncDependencies");