From f1720448c79318990572846d846eb4b8aaa24638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enes=20Yak=C4=B1=C5=9Ft=C4=B1r?= Date: Fri, 4 Sep 2026 07:07:34 +0300 Subject: [PATCH] fix(auth): preserve incompatible-browser DOM element for Angular loadUser and restore native auth links (v1.4.25) --- client.js | 48 +++++++++++++++++++++--------------------------- package.json | 2 +- style.css | 21 --------------------- 3 files changed, 22 insertions(+), 49 deletions(-) diff --git a/client.js b/client.js index 576bd52..dfa5d58 100644 --- a/client.js +++ b/client.js @@ -1,26 +1,37 @@ // 100% Incompatible Browser Suppression & Error Guardian + // CRITICAL: PeerTube's Angular app (my-app ngOnInit) relies on document.getElementById('incompatible-browser') + // to exist so it can do .className += " browser-ok" before calling this.loadUser()! + // Removing it from DOM causes a null pointer crash that breaks user session initialization! if (typeof window !== 'undefined') { try { window.displayIncompatibleBrowser = function () {}; var neuterIncompatible = function () { var el = document.getElementById('incompatible-browser'); if (el) { - el.classList.add('browser-ok'); + if (!el.classList.contains('browser-ok')) { + el.classList.add('browser-ok'); + } el.style.setProperty('display', 'none', 'important'); - if (el.parentNode) el.parentNode.removeChild(el); + el.style.setProperty('visibility', 'hidden', 'important'); + el.style.setProperty('height', '0px', 'important'); + el.style.setProperty('width', '0px', 'important'); + el.style.setProperty('opacity', '0', 'important'); + el.style.setProperty('pointer-events', 'none', 'important'); + } else { + try { + var dummy = document.createElement('div'); + dummy.id = 'incompatible-browser'; + dummy.className = 'browser-ok'; + dummy.style.display = 'none'; + (document.body || document.documentElement).appendChild(dummy); + } catch (e) {} } }; neuterIncompatible(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', neuterIncompatible); } - try { - var incompObserver = new MutationObserver(function () { - neuterIncompatible(); - }); - incompObserver.observe(document.documentElement || document.body, { childList: true, subtree: true }); - } catch (e) {} setInterval(neuterIncompatible, 1000); } catch (e) {} } @@ -365,10 +376,7 @@ try { var uEmail = localStorage.getItem('email'); var displayName = localStorage.getItem('displayName') || uName || ''; var emailStr = uEmail || ''; - var isAuth = - (!!token && !!uName) || - (liveWidget && liveWidget.querySelector('yaknet-account[authenticated="true"]')) || - !!document.querySelector('yaknet-account[authenticated="true"]'); + var isAuth = !!token && !!uName; if (headerRight) { var liveWidget = headerRight.querySelector('#yaknet-header-account-widget'); @@ -581,10 +589,7 @@ try { // Check auth status for login button rendering var tokenVal = localStorage.getItem('access_token'); var userVal = localStorage.getItem('username'); - var isAlreadyAuth = - (!!tokenVal && !!userVal) || - document.body.classList.contains('yaktube-user-logged-in') || - !!document.querySelector('yaknet-account[authenticated="true"]'); + var isAlreadyAuth = !!tokenVal && !!userVal; if (!isAlreadyAuth) { // Replace all login buttons labels and titles ONLY for guests @@ -615,17 +620,6 @@ try { }); } }); - } else { - // Guarantee all login links are hidden when user is logged in - document - .querySelectorAll( - 'my-login-link, a[href*="/login"], .login-button, [class*="login-link"]' - ) - .forEach(function (el) { - el.style.setProperty('display', 'none', 'important'); - el.setAttribute('aria-hidden', 'true'); - el.setAttribute('tabindex', '-1'); - }); } // Aggressively remove generic Framasoft Open-in-App / Play Store banners diff --git a/package.json b/package.json index 5f2889e..f674cd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "peertube-plugin-yaktube-ondemand", - "version": "1.4.24", + "version": "1.4.25", "description": "Accessible On-Demand YouTube Import, Live Streams, Smart Recommendations and A11y Engine for PeerTube", "main": "main.js", "library": "./main.js", diff --git a/style.css b/style.css index bb391cf..2230afc 100644 --- a/style.css +++ b/style.css @@ -24,27 +24,6 @@ button[title*='Dismiss'], clip: rect(0, 0, 0, 0) !important; } -/* Permanent suppression of native login links when user is authenticated */ -body.yaktube-user-logged-in my-login-link, -body.yaktube-user-logged-in a[href*="/login"], -body.yaktube-user-logged-in .login-button, -body.yaktube-user-logged-in [class*="login-link"], -body.yaktube-user-logged-in .peertube-button-link[href*="/login"], -body.yaktube-user-logged-in a[title*="Giriş"], -body.yaktube-user-logged-in a[aria-label*="Giriş"] { - display: none !important; - visibility: hidden !important; - height: 0 !important; - width: 0 !important; - margin: 0 !important; - padding: 0 !important; - pointer-events: none !important; - opacity: 0 !important; - position: absolute !important; - z-index: -99999 !important; - clip: rect(0, 0, 0, 0) !important; -} - /* Permanent Aggressive Suppression of Generic JoinPeerTube / Framasoft Open-in-App Banners */ my-open-app, my-open-in-app,