28 lines
1.5 KiB
JavaScript
28 lines
1.5 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { readFileSync } from 'node:fs';
|
|
import vm from 'node:vm';
|
|
|
|
const extension = new URL('../chrome-extension/ltjt-order-assistant/', import.meta.url);
|
|
const background = readFileSync(new URL('background.js', extension), 'utf8');
|
|
const lists = background.slice(background.indexOf('const DEFAULT_PAGE_ACTION_FILES ='), background.indexOf('let storageMutationQueue ='));
|
|
const selector = background.slice(background.indexOf('function pageActionFiles('), background.indexOf('function queueOperationTimingDetails('));
|
|
|
|
// The service worker and ERP MAIN world have separate globals. Read the real
|
|
// dispatch list so adding a helper to importScripts alone cannot satisfy tests.
|
|
export function loadPageActionRealm(window, globals, overrides = {}, omitFiles = []) {
|
|
const worker = vm.createContext({});
|
|
vm.runInContext(`${lists}\n${selector}`, worker);
|
|
const files = vm.runInContext("pageActionFiles('prepareLifecycleOperation')", worker);
|
|
assert.ok(files.includes('inpage.js') && files.includes('lifecycle-adapters.js'));
|
|
const realm = Object.assign(window, globals);
|
|
realm.window = realm;
|
|
realm.self = realm;
|
|
const context = vm.createContext(realm);
|
|
assert.equal(realm.LTJTOperationPlans, undefined, 'a fresh page must not inherit worker exports');
|
|
for (const file of files) {
|
|
if (omitFiles.includes(file)) continue;
|
|
vm.runInContext(overrides[file] ?? readFileSync(new URL(file, extension), 'utf8'), context, { filename: file });
|
|
}
|
|
return realm;
|
|
}
|