···
const logger = new Logger("core/extension/loader");
20
-
function loadExtWeb(ext: DetectedExtension) {
20
+
function evalIIFE(id: string, source: string): ExtensionWebExports {
21
+
const fn = new Function("require", "module", "exports", source);
23
+
const module = { id, exports: {} };
26
+
logger.warn("Attempted to require() from web");
32
+
return module.exports;
35
+
async function evalEsm(source: string): Promise<ExtensionWebExports> {
36
+
// Data URLs (`data:`) don't seem to work under the CSP, but object URLs do
37
+
const url = URL.createObjectURL(new Blob([source], { type: "text/javascript" }));
39
+
const module = await import(url);
41
+
URL.revokeObjectURL(url);
46
+
async function loadExtWeb(ext: DetectedExtension) {
if (ext.scripts.web != null) {
const source = ext.scripts.web + `\n//# sourceURL=${ext.id}/web.js`;
23
-
const fn = new Function("require", "module", "exports", source);
25
-
const module = { id: ext.id, exports: {} };
28
-
logger.warn("Attempted to require() from web");
50
+
let exports: ExtensionWebExports;
53
+
exports = evalIIFE(ext.id, source);
55
+
logger.trace(`Failed to load IIFE for extension ${ext.id}, trying ESM loading`);
56
+
exports = await evalEsm(source);
34
-
const exports: ExtensionWebExports = module.exports;
if (exports.patches != null) {
for (const patch of exports.patches) {
···
async function loadExt(ext: DetectedExtension) {
107
+
await loadExtWeb(ext);
logger.error(`Failed to load extension "${ext.id}"`, e);