From 6f8bcf847870016d565011d7f0b7bafd67971403 Mon Sep 17 00:00:00 2001 From: Koala <6156589+Shik3i@users.noreply.github.com> Date: Mon, 25 May 2026 12:52:32 +0200 Subject: [PATCH] fix(popup): replace innerHTML with DOM API to fix Firefox warnings Firefox flagged unsafe innerHTML assignments: - renderEmpty() container.innerHTML with template literal - renderOnboardingStep() dots.innerHTML with mapped content - updateLastActionUI() lastActionCard.innerHTML static string - refreshRooms click handler publicRooms.innerHTML Replaced all with createElement + textContent/replaceChildren. --- extension/popup.js | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/extension/popup.js b/extension/popup.js index 0b956fb..46d3abd 100644 --- a/extension/popup.js +++ b/extension/popup.js @@ -171,7 +171,11 @@ function updateUI(roomId, password, useCustomServer = false, serverUrl = '') { function updateLastActionUI(state, peers) { if (!state || !state.action) { - elements.lastActionCard.innerHTML = '
No recent commands
'; + elements.lastActionCard.replaceChildren(); + const el = document.createElement('div'); + el.style.cssText = 'text-align:center; color: var(--text-muted); font-size: 10px;'; + el.textContent = 'No recent commands'; + elements.lastActionCard.appendChild(el); return; } @@ -304,13 +308,21 @@ function renderEmpty(container, type) { rooms: { icon: '\u{1F50D}', title: 'No active rooms', hint: 'Create a room or refresh to find public ones' } }; const state = states[type] || { icon: '', title: '', hint: '' }; - container.innerHTML = ` -
-
${state.icon}
-
${state.title}
-
${state.hint}
-
- `; + const wrapper = document.createElement('div'); + wrapper.style.cssText = 'text-align:center; padding:16px 8px; color:var(--text-muted);'; + const iconDiv = document.createElement('div'); + iconDiv.style.cssText = 'font-size:24px; margin-bottom:6px;'; + iconDiv.textContent = state.icon; + const titleDiv = document.createElement('div'); + titleDiv.style.cssText = 'font-size:12px; font-weight:600; margin-bottom:4px;'; + titleDiv.textContent = state.title; + const hintDiv = document.createElement('div'); + hintDiv.style.cssText = 'font-size:10px; opacity:0.7;'; + hintDiv.textContent = state.hint; + wrapper.appendChild(iconDiv); + wrapper.appendChild(titleDiv); + wrapper.appendChild(hintDiv); + container.replaceChildren(wrapper); } function updatePeerList(peers) { @@ -925,7 +937,11 @@ elements.createRoomBtn.addEventListener('click', () => { }); elements.refreshRooms.addEventListener('click', () => { - elements.publicRooms.innerHTML = '
Refreshing...
'; + elements.publicRooms.replaceChildren(); + const el = document.createElement('div'); + el.style.cssText = 'text-align:center; padding: 10px; color:var(--text-muted);'; + el.textContent = 'Refreshing...'; + elements.publicRooms.appendChild(el); chrome.runtime.sendMessage({ type: 'GET_ROOM_LIST' }); }); @@ -1344,9 +1360,12 @@ function renderOnboardingStep() { title.textContent = step.title; text.textContent = step.text; - dots.innerHTML = onboardingSteps.map((_, i) => - `
` - ).join(''); + dots.replaceChildren(); + onboardingSteps.forEach((_, i) => { + const dot = document.createElement('div'); + dot.style.cssText = `width:8px; height:8px; border-radius:50%; background:${i === onboardingStep ? 'var(--accent)' : '#475569'};`; + dots.appendChild(dot); + }); nextBtn.textContent = onboardingStep === onboardingSteps.length - 1 ? 'Done!' : 'Next'; }