diff --git a/electron/main.cjs b/electron/main.cjs index d536bdfd..1330e5f5 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -953,7 +953,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 901bb2cd..6c263ff3 100644 --- a/src/ui/features/terminal/Terminal.tsx +++ b/src/ui/features/terminal/Terminal.tsx @@ -1938,7 +1938,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);