This repository has been archived on 2026-04-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
website/public/tools/tls-test/assets/tls-test-results.js
T
2026-04-22 14:58:18 +09:00

103 lines
3.8 KiB
JavaScript

(function () {
// ---- Tab switching ----
const tabs = document.querySelectorAll(".tls-tab");
const panels = document.querySelectorAll(".tls-tab-panel");
function activate(name) {
tabs.forEach((btn) => {
const active = btn.dataset.tab === name;
btn.classList.toggle("is-active", active);
btn.setAttribute("aria-selected", active ? "true" : "false");
});
panels.forEach((panel) => {
panel.classList.toggle("is-active", panel.dataset.panel === name);
});
try {
if (history.replaceState) {
history.replaceState(null, "", "#" + name);
}
} catch (_) {}
}
if (tabs.length && panels.length) {
tabs.forEach((btn) => {
btn.addEventListener("click", () => activate(btn.dataset.tab));
});
const hash = (location.hash || "").replace(/^#/, "");
const valid = ["summary", "reliability", "safety", "vulnerabilities", "compatibility", "log", "json"];
if (valid.indexOf(hash) !== -1) {
activate(hash);
}
}
// ---- Shared copy helper (clipboard API + textarea fallback) ----
async function copyText(text) {
try {
if (navigator.clipboard && navigator.clipboard.writeText) {
await navigator.clipboard.writeText(text);
return true;
}
const ta = document.createElement("textarea");
ta.value = text;
ta.style.position = "fixed";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.select();
try { document.execCommand("copy"); } catch (_) {}
document.body.removeChild(ta);
return true;
} catch (_) {
return false;
}
}
// Swap a button's label and is-done class for 1.5s based on action result.
function bindCopyButton(btn, getText) {
if (!btn) return;
const orig = btn.textContent;
btn.addEventListener("click", async () => {
const ok = await copyText(getText());
btn.textContent = ok ? "コピーしました" : "コピー失敗";
if (ok) btn.classList.add("is-done");
setTimeout(() => {
btn.textContent = orig;
btn.classList.remove("is-done");
}, 1500);
});
}
// ---- JSON-copy button (inside the JSON tab) ----
const rawJsonEl = document.getElementById("tls-raw-json");
bindCopyButton(document.getElementById("tls-copy-json"), () => (rawJsonEl && rawJsonEl.textContent) || "");
// ---- Copy-link button ----
const copyLinkBtn = document.getElementById("tls-copy-link");
bindCopyButton(copyLinkBtn, () => (copyLinkBtn && copyLinkBtn.dataset.link) || location.href);
// ---- PDF / print button ----
const printBtn = document.getElementById("tls-print-pdf");
if (printBtn) {
printBtn.addEventListener("click", () => {
// Expand all tab panels so the printed PDF contains every finding,
// then restore the previous state after the print dialog closes.
const prev = [];
panels.forEach((panel) => {
prev.push([panel, panel.classList.contains("is-active")]);
panel.classList.add("is-active");
});
const restore = () => {
prev.forEach(([panel, wasActive]) => {
panel.classList.toggle("is-active", wasActive);
});
window.removeEventListener("afterprint", restore);
};
window.addEventListener("afterprint", restore);
try {
window.print();
} catch (_) {
restore();
}
});
}
})();