diff --git a/packages/extension/src/popup.js b/packages/extension/src/popup.js index 304aedd..a847585 100644 --- a/packages/extension/src/popup.js +++ b/packages/extension/src/popup.js @@ -1,6 +1,7 @@ /* ExtensionShield – popup (self-contained, no service worker needed) */ (function () { 'use strict'; + document.addEventListener("DOMContentLoaded", () => { var API = 'https://extensionshield.com'; var CACHE_TTL = 6 * 3600 * 1000; @@ -153,13 +154,15 @@ function handleScanUrlSubmit() { var raw = scanUrlInput && scanUrlInput.value ? scanUrlInput.value.trim() : ''; var extId = extractExtensionIdFromInput(raw); - if (!extId) { - setScanUrlMessage('Enter a Chrome Web Store URL.', 'error'); - return; - } - + if (!extId) { + setScanUrlMessage('Please enter a valid Chrome Web Store URL or Extension ID.', 'error'); + return; +} setScanUrlMessage('Scanning…', ''); setScanSearchLoading(true); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = true; +} if (scanResultsContent) scanResultsContent.hidden = true; renderScanResult({ @@ -177,6 +180,9 @@ renderScanResult(result); setScanUrlMessage('', ''); setScanSearchLoading(false); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = false; +} return; } @@ -186,6 +192,9 @@ if (triggerResult.status === 'error') { setScanUrlMessage('Could not start scan. Try on the website.', 'error'); setScanSearchLoading(false); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = false; +} return; } if (triggerResult.status === 'completed' || triggerResult.already_scanned) { @@ -194,11 +203,17 @@ renderScanResult(result); setScanUrlMessage('', ''); setScanSearchLoading(false); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = false; +} }); } setScanUrlMessage('Scan in progress…', ''); return waitForScan(extId).then(function (p2) { setScanSearchLoading(false); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = false; +} if (p2._st === 'timeout') { setScanUrlMessage('Scan is taking longer. Check again soon.', 'error'); renderScanResult({ @@ -221,9 +236,15 @@ setScanUrlMessage('Could not fetch results.', 'error'); setScanSearchLoading(false); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = false; +} }).catch(function () { setScanUrlMessage('Network error. Check your connection.', 'error'); setScanSearchLoading(false); + if (scanUrlSubmit) { + scanUrlSubmit.disabled = false; +} }); } @@ -275,11 +296,16 @@ return new Promise(function (resolve) { setTimeout(resolve, ms); }); } - function esc(s) { +function esc(s) { + if (s === null || s === undefined) return ''; + try { var d = document.createElement('div'); - d.textContent = s; + d.textContent = String(s); return d.innerHTML; + } catch (e) { + return ''; } +} function getIconUrl(ext) { var icons = ext && ext.icons; @@ -619,34 +645,37 @@ } } - function scan(force) { - showStatus('Getting extensions…'); + function scan(force) { + showStatus('Getting extensions…'); - chrome.runtime.sendMessage({ action: 'getAllExtensions' }, function (all) { + try { + chrome.management.getAll(function (all) { if (chrome.runtime.lastError || !all) { - chrome.management.getAll(function (fallbackAll) { - if (chrome.runtime.lastError) { - hideStatus(); - showError('Cannot access extensions: ' + (chrome.runtime.lastError.message || 'unknown')); - return; - } - var selfId = chrome.runtime.id; - var filtered = []; - for (var j = 0; j < fallbackAll.length; j++) { - if (fallbackAll[j].type === 'extension' && fallbackAll[j].id !== selfId && fallbackAll[j].enabled) filtered.push(fallbackAll[j]); - } - runScanWithExtensions(filtered, force); - }); + hideStatus(); + showError('Cannot access extensions'); return; } + var selfId = chrome.runtime.id; var exts = []; + for (var i = 0; i < all.length; i++) { - if (all[i].enabled) exts.push(all[i]); + if ( + all[i].type === 'extension' && + all[i].id !== selfId && + all[i].enabled + ) { + exts.push(all[i]); + } } + runScanWithExtensions(exts, force); }); + } catch (e) { + hideStatus(); + showError('Unexpected error while scanning'); } +} function runScanWithExtensions(exts, force) { if (!exts || exts.length === 0) { @@ -731,6 +760,7 @@ nextExt(); } - initTheme(); - scan(false); + initTheme(); +scan(false); +}); })();