mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-06-17 17:07:07 +00:00
8a5424c5a4
Address audit findings across background handlers, openers, plugins, and UI: URL allowlists, XSS reductions, popup lifecycle fixes, plugin dispose/cleanup, cloud sync hardening, global search mathjs sandbox, and settings storage fixes.
68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
import stringToHTML from "../stringToHTML";
|
|
|
|
function isSafeShortcutHref(url: string): boolean {
|
|
if (typeof url !== "string" || !url.trim()) return false;
|
|
try {
|
|
const parsed = new URL(url, window.location.href);
|
|
return ["http:", "https:", "mailto:"].includes(parsed.protocol);
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function CreateCustomShortcutDiv(element: any) {
|
|
// Creates the stucture and element information for each seperate shortcut
|
|
const container = document.getElementById("shortcuts");
|
|
if (!container) return;
|
|
|
|
var shortcut = document.createElement("a");
|
|
if (isSafeShortcutHref(element.url)) {
|
|
shortcut.setAttribute("href", element.url);
|
|
shortcut.setAttribute("target", "_blank");
|
|
} else {
|
|
shortcut.setAttribute("href", "#");
|
|
shortcut.setAttribute("aria-disabled", "true");
|
|
}
|
|
var shortcutdiv = document.createElement("div");
|
|
shortcutdiv.classList.add("shortcut");
|
|
shortcutdiv.classList.add("customshortcut");
|
|
|
|
let image: ChildNode | null = null;
|
|
|
|
if (typeof element.icon === "string" && element.icon.trim().startsWith("<")) {
|
|
image = stringToHTML(element.icon).firstChild;
|
|
} else if (typeof element.icon === "string" && element.icon.startsWith("data:image")) {
|
|
const img = document.createElement("img");
|
|
img.src = element.icon;
|
|
img.style.width = "39px";
|
|
img.style.height = "39px";
|
|
image = img;
|
|
} else {
|
|
image = stringToHTML(
|
|
/* html */`
|
|
<svg style="width:39px;height:39px" viewBox="0 0 40 40" class="shortcuticondiv">
|
|
<text
|
|
text-anchor="middle"
|
|
x="50%"
|
|
y="50%"
|
|
dy=".35em"
|
|
fill="var(--text-primary)"
|
|
font-weight="bold"
|
|
font-size="32"
|
|
dominant-baseline="middle">
|
|
${element.icon}
|
|
</text>
|
|
</svg>
|
|
`,
|
|
).firstChild;
|
|
}
|
|
(image as HTMLElement).classList.add("shortcuticondiv");
|
|
var text = document.createElement("p");
|
|
text.textContent = element.name;
|
|
shortcutdiv.append(image!);
|
|
shortcutdiv.append(text);
|
|
shortcut.append(shortcutdiv);
|
|
|
|
container.append(shortcut);
|
|
}
|