if ("dbg" in this) { throw new Error("Debugger script must not run more than once!"); } const dbg = new Debugger; const debuggeesToPipelineIds = new Map; const debuggeesToWorkerIds = new Map; const sourceIdsToScripts = new Map; dbg.uncaughtExceptionHook = function(error) { console.error(`[debugger] Uncaught exception at ${error.fileName}:${error.lineNumber}:${error.columnNumber}: ${error.name}: ${error.message}`); }; dbg.onNewScript = function(script, /* undefined; seems to be `script.global` now */ global) { // TODO: handle wasm (`script.source.introductionType == wasm`) sourceIdsToScripts.set(script.source.id, script); notifyNewSource({ pipelineId: debuggeesToPipelineIds.get(script.global), workerId: debuggeesToWorkerIds.get(script.global), spidermonkeyId: script.source.id, url: script.source.url, urlOverride: script.source.displayURL, text: script.source.text, introductionType: script.source.introductionType ?? null, }); }; addEventListener("addDebuggee", event => { const {global, pipelineId: {namespaceId, index}, workerId} = event; dbg.addDebuggee(global); const debuggerObject = dbg.addDebuggee(global); debuggeesToPipelineIds.set(debuggerObject, { namespaceId, index, }); debuggeesToWorkerIds.set(debuggerObject, workerId); }); addEventListener("getPossibleBreakpoints", event => { const {spidermonkeyId} = event; const script = sourceIdsToScripts.get(spidermonkeyId); function getPossibleBreakpointsRecursive(script) { const result = script.getPossibleBreakpoints(/* TODO: `query` */); for (const child of script.getChildScripts()) { for (const location of getPossibleBreakpointsRecursive(child)) { result.push(location); } } return result; } getPossibleBreakpointsResult(event, getPossibleBreakpointsRecursive(script)); });