Files
LWLT-AIBOT/tools/page-action-test-realm.mjs
2026-09-14 16:34:36 +08:00

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;
}