diff --git a/electron/main.cjs b/electron/main.cjs index b210a7b7..18e13a97 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -955,7 +955,14 @@ function createWindow() { }); mainWindow.webContents.setWindowOpenHandler(({ url }) => { - shell.openExternal(url); + try { + const parsed = new URL(url); + if (parsed.protocol === "http:" || parsed.protocol === "https:") { + shell.openExternal(url); + } + } catch { + // invalid URL, ignore + } return { action: "deny" }; }); } diff --git a/src/ui/features/terminal/Terminal.tsx b/src/ui/features/terminal/Terminal.tsx index d1c5a571..ca87af83 100644 --- a/src/ui/features/terminal/Terminal.tsx +++ b/src/ui/features/terminal/Terminal.tsx @@ -1970,7 +1970,12 @@ const TerminalInner = forwardRef( const clipboardProvider = new RobustClipboardProvider(); const clipboardAddon = new ClipboardAddon(undefined, clipboardProvider); const unicode11Addon = new Unicode11Addon(); - const webLinksAddon = new WebLinksAddon(); + const webLinksAddon = new WebLinksAddon((_event, uri) => { + const url = uri.startsWith("http://") || uri.startsWith("https://") + ? uri + : `https://${uri}`; + window.open(url, "_blank"); + }); fitAddonRef.current = fitAddon; terminal.loadAddon(fitAddon);