diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index 5a32b19..0000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,11 +0,0 @@ -env: - browser: true - greasemonkey: true - es2021: true -extends: - - airbnb-base -parserOptions: - ecmaVersion: 12 -rules: - no-console: off - no-multi-str: off diff --git a/package.json b/package.json index e51a286..e8ddf48 100644 --- a/package.json +++ b/package.json @@ -18,5 +18,10 @@ "homepage": "https://eskander.tn/ultra-popup-blocker/", "devDependencies": { "standard": "^17.1.2" + }, + "standard": { + "env": [ + "greasemonkey" + ] } -} +} \ No newline at end of file diff --git a/src/ultra-popup-blocker.user.js b/src/ultra-popup-blocker.user.js index cd11ff7..e4e5657 100644 --- a/src/ultra-popup-blocker.user.js +++ b/src/ultra-popup-blocker.user.js @@ -20,154 +20,154 @@ /* ---------------------------------------------------------------- */ -const PERMISSION_DIALOG_ID = 'ultra_popup_blocker'; // HTML ID in the page -const CONTROL_PANEL = 'https://eskander.tn/ultra-popup-blocker/settings.html'; +const PERMISSION_DIALOG_ID = 'ultra_popup_blocker' // HTML ID in the page +const CONTROL_PANEL = 'https://eskander.tn/ultra-popup-blocker/settings.html' // Reference to page's "window" through GreaseMonkey -const global = unsafeWindow; -global.upb_counter = 0; +const global = unsafeWindow +global.upb_counter = 0 // Storing a reference to real "window.open" method in case we wanted it -const realWindowOpen = global.open; +const realWindowOpen = global.open // We need to return the fake window to not encounter JS runtime error when the popup originator // page wants to call focus() or blur(). const FakeWindow = { - blur() { - return false; + blur () { + return false }, - focus() { - return false; - }, -}; + focus () { + return false + } +} // Timeout before confirmation dialog closes automatically -let timeleft = 15; +let timeleft = 15 /* ---------------------------------------------------------------- */ // Add @domain to local storage -function addDomainToLocalStorage(domain) { - GM_setValue(`trusted_${domain}`, true); +function addDomainToLocalStorage (domain) { + GM_setValue(`trusted_${domain}`, true) } // Remove @domain from local storage -function removeDomainFromLocalStorage(domain) { - GM_deleteValue(`trusted_${domain}`); - GM_deleteValue(`${domain}`); +function removeDomainFromLocalStorage (domain) { + GM_deleteValue(`trusted_${domain}`) + GM_deleteValue(`${domain}`) } // Return true if @domain is trusted -function isDomainTrusted(domain) { - return GM_getValue(`trusted_${domain}`); +function isDomainTrusted (domain) { + return GM_getValue(`trusted_${domain}`) } // Return an Array of trusted domains -function getTrustedDomains() { - return GM_listValues(); +function getTrustedDomains () { + return GM_listValues() } // Open permission manager in new tab -function openControlPanel() { - GM_openInTab(CONTROL_PANEL, false); +function openControlPanel () { + GM_openInTab(CONTROL_PANEL, false) } // Add a link to permission manager in extensions' popup menu -function attachToExtensionMenu(name, callback) { - GM_registerMenuCommand(name, callback); +function attachToExtensionMenu (name, callback) { + GM_registerMenuCommand(name, callback) } // Permission bar; Return permission dialog, or create it if needed. -function getLogDiv() { - let logDiv = document.getElementById(PERMISSION_DIALOG_ID); +function getLogDiv () { + let logDiv = document.getElementById(PERMISSION_DIALOG_ID) if (!logDiv) { - logDiv = document.createElement('div'); - logDiv.setAttribute('id', PERMISSION_DIALOG_ID); - logDiv.style.cssText = 'position: fixed;\ - bottom: 0;\ - left: 0;\ - z-index: 99999;\ - width: 100%;\ - padding: 5px 5px 5px 5px;\ - font: status-bar;\ - background-color: black;\ - color: white;\ - cursor: help'; - document.body.appendChild(logDiv); + logDiv = document.createElement('div') + logDiv.setAttribute('id', PERMISSION_DIALOG_ID) + logDiv.style.cssText = `position: fixed; + bottom: 0; + left: 0; + z-index: 99999; + width: 100%; + padding: 5px 5px 5px 5px; + font: status-bar; + background-color: black; + color: white; + cursor: help` + document.body.appendChild(logDiv) } - return logDiv; + return logDiv } // Permission bar; Hide dialog -function closeLogDiv(logDiv) { - const currentLogDiv = logDiv; - currentLogDiv.style.display = 'none'; +function closeLogDiv (logDiv) { + const currentLogDiv = logDiv + currentLogDiv.style.display = 'none' } // Return current top domain. eg: github.com -function getCurrentTopDomain() { - const hostnameArray = document.location.hostname.split('.'); - const topLevelDomain = hostnameArray[hostnameArray.length - 1]; - const domainName = hostnameArray[hostnameArray.length - 2]; - const currentDomain = `${domainName}.${topLevelDomain}`; - return currentDomain; +function getCurrentTopDomain () { + const hostnameArray = document.location.hostname.split('.') + const topLevelDomain = hostnameArray[hostnameArray.length - 1] + const domainName = hostnameArray[hostnameArray.length - 2] + const currentDomain = `${domainName}.${topLevelDomain}` + return currentDomain } // Return true if current domain has been trusted by the user -function isCurrentDomainTrusted() { - const domain = getCurrentTopDomain(); - return isDomainTrusted(domain); +function isCurrentDomainTrusted () { + const domain = getCurrentTopDomain() + return isDomainTrusted(domain) } // Permission manager; Create a button to remove domain from permissions list -function removeDomainFromPermissionList() { - const div = this.parentElement; - console.log(div); - const domain = div.innerText.replace('\n\u00D7', ''); - removeDomainFromLocalStorage(domain); - div.style.display = 'none'; - console.log(`[UPB] Domain removed from trust: ${domain}`); +function removeDomainFromPermissionList () { + const div = this.parentElement + console.log(div) + const domain = div.innerText.replace('\n\u00D7', '') + removeDomainFromLocalStorage(domain) + div.style.display = 'none' + console.log(`[UPB] Domain removed from trust: ${domain}`) } // Permission manager; Add a new domain to permissions list -function addDomainToPermissionList(domain) { - const domainName = domain.replace('trusted_', ''); - const li = document.createElement('li'); - const t = document.createTextNode(domainName); - li.appendChild(t); - document.getElementById('List').appendChild(li); +function addDomainToPermissionList (domain) { + const domainName = domain.replace('trusted_', '') + const li = document.createElement('li') + const t = document.createTextNode(domainName) + li.appendChild(t) + document.getElementById('List').appendChild(li) // Add a remove button to li - const span = document.createElement('SPAN'); - const txt = document.createTextNode('\u00D7'); - span.className = 'close'; - span.appendChild(txt); - span.onclick = removeDomainFromPermissionList; - li.appendChild(span); + const span = document.createElement('SPAN') + const txt = document.createTextNode('\u00D7') + span.className = 'close' + span.appendChild(txt) + span.onclick = removeDomainFromPermissionList + li.appendChild(span) // Add domain to localStorage - addDomainToLocalStorage(domainName); - console.log(`[UPB] Domain added to trust: ${domainName}`); + addDomainToLocalStorage(domainName) + console.log(`[UPB] Domain added to trust: ${domainName}`) } // Permission manager; Button to add a new domain to permissions list -function addNewDomainButton() { +function addNewDomainButton () { document.getElementsByClassName('addBtn')[0].addEventListener( 'click', () => { - const DOMAIN = document.getElementById('Input').value; + const DOMAIN = document.getElementById('Input').value if (DOMAIN !== '') { - addDomainToPermissionList(DOMAIN); + addDomainToPermissionList(DOMAIN) } - document.getElementById('Input').value = ''; - }, - ); + document.getElementById('Input').value = '' + } + ) } // Permission bar; Create a button with inner text @text executing onclick // @clickCallback, appended as a child of @logDiv, with style @inlineStyle. -function createButton(logDiv, text, id, clickCallback, inlineStyle) { - const button = document.createElement('button'); - button.innerHTML = text; - button.id = id; +function createButton (logDiv, text, id, clickCallback, inlineStyle) { + const button = document.createElement('button') + button.innerHTML = text + button.id = id button.style.cssText = `text-decoration: none;\ color: black;\ cursor: pointer;\ @@ -177,165 +177,165 @@ function createButton(logDiv, text, id, clickCallback, inlineStyle) { border-width: 0px;\ border-radius: 5px;\ color: black;\ - ${inlineStyle}`; - logDiv.appendChild(button); - button.addEventListener('click', clickCallback); + ${inlineStyle}` + logDiv.appendChild(button) + button.addEventListener('click', clickCallback) } // Permission bar; Create a button (child of @logDiv) which onclick trusts @domain -function createTrustButton(logDiv, domain, a, b, c) { +function createTrustButton (logDiv, domain, a, b, c) { createButton( logDiv, 'Always Allow 🗸', 'upb_trust', () => { - addDomainToLocalStorage(domain); - realWindowOpen(a, b, c); - closeLogDiv(logDiv); - global.open = realWindowOpen; + addDomainToLocalStorage(domain) + realWindowOpen(a, b, c) + closeLogDiv(logDiv) + global.open = realWindowOpen }, - '', - ); + '' + ) } // Permission bar; Create a button (child of @logDiv) which onclick opens @domain -function createOpenPopupButton(logDiv, a, b, c) { +function createOpenPopupButton (logDiv, a, b, c) { createButton( logDiv, 'Allow ↗', 'upb_open', () => { - realWindowOpen(a, b, c); - closeLogDiv(logDiv); + realWindowOpen(a, b, c) + closeLogDiv(logDiv) }, - '', - ); + '' + ) } // Permission bar; Create a button (child of @logDiv) which onclick hides @logDiv -function createCloseButton(logDiv) { +function createCloseButton (logDiv) { createButton( logDiv, `Deny (${timeleft})`, 'upb_close', () => { - closeLogDiv(logDiv); + closeLogDiv(logDiv) }, - ' background-color: #a00;\ - color: white;', - ); + `background-color: #a00; + color: white;` + ) } // Permission bar; Create a button (child of @logDiv) which onclick opens @controlPanel -function createConfigButton(logDiv) { +function createConfigButton (logDiv) { createButton( logDiv, 'Config ⚙', 'upb_config', () => { - openControlPanel(); + openControlPanel() }, - ' float: right;\ - margin: 0 10px 0 0;', - ); + `float: right; + margin: 0 10px 0 0;` + ) } // Permission bar; Display a permission prompt when a new popup is detected -function createDialogMessage(logDiv, url) { - const currentLogDiv = logDiv; - const domain = getCurrentTopDomain(); - let msg; - let popupUrl; +function createDialogMessage (logDiv, url) { + const currentLogDiv = logDiv + const domain = getCurrentTopDomain() + let msg + let popupUrl - global.upb_counter += 1; + global.upb_counter += 1 if (global.upb_counter === 1) { - msg = `[UPB] Allow ${domain} to open a popup ?`; + msg = `[UPB] Allow ${domain} to open a popup ?` } else { - msg = `[UPB] Allow ${domain} to open a popup ? (${global.upb_counter})`; + msg = `[UPB] Allow ${domain} to open a popup ? (${global.upb_counter})` } if (url[0] === '/') { - popupUrl = document.domain + url; + popupUrl = document.domain + url } else { - popupUrl = url; + popupUrl = url } - currentLogDiv.innerHTML = msg; - currentLogDiv.title = popupUrl; - console.log(msg); - currentLogDiv.style.display = 'block'; + currentLogDiv.innerHTML = msg + currentLogDiv.title = popupUrl + console.log(msg) + currentLogDiv.style.display = 'block' } -function createTimer(logDiv) { - console.log(timeleft); +function createTimer (logDiv) { + console.log(timeleft) if (timeleft === 15) { const Timer = setInterval(() => { - document.getElementById('upb_close').innerHTML = `Deny (${timeleft})`; - timeleft -= 1; + document.getElementById('upb_close').innerHTML = `Deny (${timeleft})` + timeleft -= 1 if (timeleft < 0) { - clearInterval(Timer); - closeLogDiv(logDiv); - timeleft = 15; + clearInterval(Timer) + closeLogDiv(logDiv) + timeleft = 15 } - console.log(timeleft); - }, 1000); + console.log(timeleft) + }, 1000) } } // This function will be called each time a script wants to open a new window -function fakeWindowOpen(a, b, c) { - const domain = getCurrentTopDomain(); - const popupURL = a; - const logDiv = getLogDiv(); - console.log(a, b, c); - createDialogMessage(logDiv, popupURL); - createOpenPopupButton(logDiv, a, b, c); - createTrustButton(logDiv, domain, a, b, c); - createCloseButton(logDiv); - createConfigButton(logDiv); - createTimer(logDiv); - return FakeWindow; +function fakeWindowOpen (a, b, c) { + const domain = getCurrentTopDomain() + const popupURL = a + const logDiv = getLogDiv() + console.log(a, b, c) + createDialogMessage(logDiv, popupURL) + createOpenPopupButton(logDiv, a, b, c) + createTrustButton(logDiv, domain, a, b, c) + createCloseButton(logDiv) + createConfigButton(logDiv) + createTimer(logDiv) + return FakeWindow } // Override browser's "window.open" with our own implementation. -function activateBlocker() { - const TRUSTED = isCurrentDomainTrusted(); +function activateBlocker () { + const TRUSTED = isCurrentDomainTrusted() if (!TRUSTED) { - global.open = fakeWindowOpen; - console.log('[UPB] Current domain Not trusted.'); + global.open = fakeWindowOpen + console.log('[UPB] Current domain Not trusted.') } else { - console.log('[UPB] Current domain Trusted. UPB disabled.'); + console.log('[UPB] Current domain Trusted. UPB disabled.') } } -function activateControlPanel() { +function activateControlPanel () { if (window.location.href === CONTROL_PANEL) { // Add listener to the add button - addNewDomainButton(); + addNewDomainButton() // Show already stored elements in the list - const storedTrust = getTrustedDomains(); - storedTrust.forEach(addDomainToPermissionList); - console.log(storedTrust); + const storedTrust = getTrustedDomains() + storedTrust.forEach(addDomainToPermissionList) + console.log(storedTrust) } } -function activateExtensionMenu() { +function activateExtensionMenu () { attachToExtensionMenu( 'Configure popup permissions', () => { - openControlPanel(); - }, - ); + openControlPanel() + } + ) } /* ---------------------------------------------------------------- */ // Add configure link to Tampermonkey's menu -activateExtensionMenu(); +activateExtensionMenu() // Initiate Control Panel logic -activateControlPanel(); +activateControlPanel() // Start Popup Blocker -activateBlocker(); +activateBlocker()