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();
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({
enableSizeReports: true,
sixelSupport: true,
@ -59,30 +67,24 @@
sixelPaletteLimit: 4096,
showPlaceholder: true,
}));
// Defer open if container isn't visible yet (e.g., behind splash)
const tryOpen = () => {
try {
term.open(termEl);
fitAddon.fit();
} catch (e) {
console.warn('[Terminal] open failed, retrying in 500ms:', (e as Error).message);
setTimeout(tryOpen, 500);
console.warn('[Terminal] ImageAddon failed:', (e as Error).message);
}
fitAddon.fit();
};
// Defer if container isn't visible yet (e.g., behind splash)
if (termEl.offsetParent !== null) {
tryOpen();
openAndLoadAddons();
} else {
// Container not visible — wait for it
const observer = new IntersectionObserver((entries) => {
if (entries[0]?.isIntersecting) {
observer.disconnect();
tryOpen();
openAndLoadAddons();
}
});
observer.observe(termEl);
// Fallback: try after 2s regardless
setTimeout(() => { observer.disconnect(); tryOpen(); }, 2000);
setTimeout(() => { observer.disconnect(); openAndLoadAddons(); }, 2000);
}
// ── Read cursor/scrollback settings ─────────────────────────────────