Files
BetterSEQTA-Plus/src/seqta/utils/CreateEnable/CreateCustomShortcutDiv.ts
T
AdenMGB 8a5424c5a4 fix: harden extension security and plugin reliability
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.
2026-06-17 10:52:43 +09:30

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);
}