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() {