/* logoutPatch.js */ (function(global) { /** * Initialize the logout patch script. * @param {string} logoutUrlBase - Base logout URL (e.g., from your OIDC client). * @param {string} webProtocol - Protocol to use (e.g., "https"). * @param {string} primaryDomain - Primary domain (e.g., "example.com"). */ function initLogoutPatch(logoutUrlBase, webProtocol, primaryDomain) { const redirectUri = encodeURIComponent(webProtocol + '://' + primaryDomain); const logoutUrl = logoutUrlBase + '?redirect_uri=' + redirectUri; function matchesLogout(str) { return str && /(?:^|\W)log\s*out(?:\W|$)|logout/i.test(str); } /** * Returns true if any attribute name or value on the given element * contains the substring "logout" (case-insensitive). * * @param {Element} element – The DOM element to inspect. * @returns {boolean} – True if "logout" appears in any attribute name or value. */ function containsLogoutAttribute(element) { for (const attribute of element.attributes) { if (/logout/i.test(attribute.name) || /logout/i.test(attribute.value)) { return true; } } return false; } function matchesTechnicalIndicators(el) { const title = el.getAttribute('title'); const ariaLabel = el.getAttribute('aria-label'); const onclick = el.getAttribute('onclick'); if (matchesLogout(title) || matchesLogout(ariaLabel) || matchesLogout(onclick)) return true; for (const attr of el.attributes) { if (attr.name.startsWith('data-') && matchesLogout(attr.name + attr.value)) return true; } if (typeof el.onclick === 'function' && matchesLogout(el.onclick.toString())) return true; if (el.tagName.toLowerCase() === 'use') { const href = el.getAttribute('xlink:href') || el.getAttribute('href'); if (matchesLogout(href)) return true; } return false; } /** * Apply logout redirect behavior to a matching element: * – Installs a capturing click‐handler to force navigation to logoutUrl * – Always sets href/formaction/action to logoutUrl * – Marks the element as patched to avoid double‐binding * * @param {Element} el – The element to override (e.g. ,