summaryrefslogtreecommitdiffstats
path: root/dom/quota/test/modules/system/worker/ModuleLoader.js
blob: b79f3ff5b9447e7835b470b9e8a6ec5ccf8bd6f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

function ModuleLoader(base, depth, proto) {
  const modules = {};

  const require = async function (id) {
    if (modules[id]) {
      return modules[id].exported_symbols;
    }

    const url = new URL(depth + id, base);

    const module = Object.create(null, {
      exported_symbols: {
        configurable: false,
        enumerable: true,
        value: Object.create(null),
        writable: true,
      },
    });

    modules[id] = module;

    const xhr = new XMLHttpRequest();
    xhr.open("GET", url.href, false);
    xhr.responseType = "text";
    xhr.send();

    let source = xhr.responseText;

    let code = new Function(
      "require_module",
      "exported_symbols",
      `eval(arguments[2] + "\\n//# sourceURL=" + arguments[3] + "\\n")`
    );
    code(require, module.exported_symbols, source, url.href);

    return module.exported_symbols;
  };

  const returnObj = {
    require: {
      enumerable: true,
      value: require,
    },
  };

  return Object.create(null, returnObj);
}