71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
/*
|
|
* SPDX-License-Identifier: GPL-3.0
|
|
* Vesktop, a desktop app aiming to give you a snappier Discord Experience
|
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
|
*/
|
|
|
|
import { BrowserWindow, shell } from "electron";
|
|
import { DISCORD_HOSTNAMES } from "main/constants";
|
|
|
|
import { Settings } from "../settings";
|
|
import { createOrFocusPopup, setupPopout } from "./popout";
|
|
import { execSteamURL, isDeckGameMode, steamOpenURL } from "./steamOS";
|
|
|
|
export function handleExternalUrl(url: string, protocol?: string): { action: "deny" | "allow" } {
|
|
if (protocol == null) {
|
|
try {
|
|
protocol = new URL(url).protocol;
|
|
} catch {
|
|
return { action: "deny" };
|
|
}
|
|
}
|
|
|
|
switch (protocol) {
|
|
case "http:":
|
|
case "https:":
|
|
if (Settings.store.openLinksWithElectron) {
|
|
return { action: "allow" };
|
|
}
|
|
// eslint-disable-next-line no-fallthrough
|
|
case "mailto:":
|
|
case "spotify:":
|
|
if (isDeckGameMode) {
|
|
steamOpenURL(url);
|
|
} else {
|
|
shell.openExternal(url);
|
|
}
|
|
break;
|
|
case "steam:":
|
|
if (isDeckGameMode) {
|
|
execSteamURL(url);
|
|
} else {
|
|
shell.openExternal(url);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return { action: "deny" };
|
|
}
|
|
|
|
export function makeLinksOpenExternally(win: BrowserWindow) {
|
|
win.webContents.setWindowOpenHandler(({ url, frameName, features }) => {
|
|
try {
|
|
var { protocol, hostname, pathname } = new URL(url);
|
|
} catch {
|
|
return { action: "deny" };
|
|
}
|
|
|
|
if (frameName.startsWith("DISCORD_") && pathname === "/popout" && DISCORD_HOSTNAMES.includes(hostname)) {
|
|
return createOrFocusPopup(frameName, features);
|
|
}
|
|
|
|
if (url === "about:blank" || (frameName === "authorize" && DISCORD_HOSTNAMES.includes(hostname)))
|
|
return { action: "allow" };
|
|
|
|
return handleExternalUrl(url, protocol);
|
|
});
|
|
|
|
win.webContents.on("did-create-window", (win, { frameName }) => {
|
|
if (frameName.startsWith("DISCORD_")) setupPopout(win, frameName);
|
|
});
|
|
}
|