From e588a69a78e364e5be9e9aea0a070ce77d25f0a0 Mon Sep 17 00:00:00 2001 From: Zac Gaetano Date: Mon, 6 Apr 2026 21:38:50 -0400 Subject: [PATCH] fix: Chrome extension MV3 CSP violations and missing alarms permission MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add "alarms" permission to manifest — chrome.alarms.create() was throwing "Cannot read properties of undefined" because the permission was missing; also removed invalid "sockets" permission (not a valid MV3 perm) - Remove all inline event handlers from popup.html (onclick, ondragover, ondragleave, ondrop, onchange) — MV3 CSP blocks inline JS entirely; all handlers moved to popup.js addEventListener() calls - Replace inline onclick="removeFile(i)" on dynamically generated remove buttons with data-idx attribute + delegated click listener on the list container — same CSP fix for runtime-generated elements Co-Authored-By: Claude Sonnet 4.6 --- chrome-extension/manifest.json | 2 +- chrome-extension/popup.html | 12 ++++++------ chrome-extension/popup.js | 25 ++++++++++++++++++++++--- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/chrome-extension/manifest.json b/chrome-extension/manifest.json index 18d53d1..3d410e1 100644 --- a/chrome-extension/manifest.json +++ b/chrome-extension/manifest.json @@ -7,7 +7,7 @@ "storage", "activeTab", "scripting", - "sockets" + "alarms" ], "host_permissions": [ "https://*/*", diff --git a/chrome-extension/popup.html b/chrome-extension/popup.html index 0f8fc0e..f34d57e 100644 --- a/chrome-extension/popup.html +++ b/chrome-extension/popup.html @@ -109,8 +109,8 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:#06080e;color:#e4e8f
- - + +
@@ -122,18 +122,18 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:#06080e;color:#e4e8f -
+
📂
Drop files or click to browse
Video, audio, image up to 50 GB
- +
- +
@@ -155,7 +155,7 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:#06080e;color:#e4e8f
- +
diff --git a/chrome-extension/popup.js b/chrome-extension/popup.js index 5fa9996..231ee2a 100644 --- a/chrome-extension/popup.js +++ b/chrome-extension/popup.js @@ -31,11 +31,24 @@ let connected = false; } })(); +// ==================== EVENT LISTENERS ==================== document.getElementById('settings-toggle').addEventListener('click', () => { - const panel = document.getElementById('settings-panel'); - panel.classList.toggle('open'); + document.getElementById('settings-panel').classList.toggle('open'); }); +document.getElementById('save-btn').addEventListener('click', saveSettings); +document.getElementById('upload-btn').addEventListener('click', startUpload); +document.getElementById('btn-http').addEventListener('click', () => setMode('http')); +document.getElementById('btn-udp').addEventListener('click', () => setMode('udp')); + +const dropZone = document.getElementById('drop-zone'); +dropZone.addEventListener('click', () => document.getElementById('file-input').click()); +dropZone.addEventListener('dragover', (e) => { e.preventDefault(); dropZone.classList.add('over'); }); +dropZone.addEventListener('dragleave', () => dropZone.classList.remove('over')); +dropZone.addEventListener('drop', onDrop); + +document.getElementById('file-input').addEventListener('change', onFileInputChange); + // ==================== CONNECTION ==================== async function tryConnect() { setConnStatus('grey', 'Connecting…'); @@ -187,12 +200,18 @@ function renderFileList() { ${item.status} - + `; list.appendChild(el); }); } +// Delegated listener for remove buttons (avoids inline onclick — CSP compliant) +document.getElementById('file-list').addEventListener('click', (e) => { + const btn = e.target.closest('.fi-rm'); + if (btn) removeFile(parseInt(btn.dataset.idx, 10)); +}); + function removeFile(i) { selectedFiles.splice(i, 1); renderFileList(); updateBtn(); } function updateBtn() {