fix(electrobun): load CanvasAddon+ImageAddon AFTER term.open() (fixes _linkifier2 crash)

This commit is contained in:
Hibryda 2026-03-23 15:57:37 +01:00
parent f4a51ca6c0
commit aee772aee0

View file

@ -50,8 +50,16 @@
fitAddon = new FitAddon(); fitAddon = new FitAddon();
term.loadAddon(fitAddon); term.loadAddon(fitAddon);
term.loadAddon(new CanvasAddon()); // NOTE: CanvasAddon and ImageAddon MUST be loaded AFTER term.open()
// because they access _linkifier2 which is created during open()
const openAndLoadAddons = () => {
term.open(termEl);
// Now safe to load addons that depend on _linkifier2
try { term.loadAddon(new CanvasAddon()); } catch (e) {
console.warn('[Terminal] CanvasAddon failed:', (e as Error).message);
}
try {
term.loadAddon(new ImageAddon({ term.loadAddon(new ImageAddon({
enableSizeReports: true, enableSizeReports: true,
sixelSupport: true, sixelSupport: true,
@ -59,30 +67,24 @@
sixelPaletteLimit: 4096, sixelPaletteLimit: 4096,
showPlaceholder: true, showPlaceholder: true,
})); }));
// Defer open if container isn't visible yet (e.g., behind splash)
const tryOpen = () => {
try {
term.open(termEl);
fitAddon.fit();
} catch (e) { } catch (e) {
console.warn('[Terminal] open failed, retrying in 500ms:', (e as Error).message); console.warn('[Terminal] ImageAddon failed:', (e as Error).message);
setTimeout(tryOpen, 500);
} }
fitAddon.fit();
}; };
// Defer if container isn't visible yet (e.g., behind splash)
if (termEl.offsetParent !== null) { if (termEl.offsetParent !== null) {
tryOpen(); openAndLoadAddons();
} else { } else {
// Container not visible — wait for it
const observer = new IntersectionObserver((entries) => { const observer = new IntersectionObserver((entries) => {
if (entries[0]?.isIntersecting) { if (entries[0]?.isIntersecting) {
observer.disconnect(); observer.disconnect();
tryOpen(); openAndLoadAddons();
} }
}); });
observer.observe(termEl); observer.observe(termEl);
// Fallback: try after 2s regardless setTimeout(() => { observer.disconnect(); openAndLoadAddons(); }, 2000);
setTimeout(() => { observer.disconnect(); tryOpen(); }, 2000);
} }
// ── Read cursor/scrollback settings ───────────────────────────────── // ── Read cursor/scrollback settings ─────────────────────────────────