Pop Up Blocker

Simple but effective popup window blocker. Also tries to deny unsolicited redirections.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name        Pop Up Blocker
// @namespace   http://tampermonkey.net/
// @description Simple but effective popup window blocker. Also tries to deny unsolicited redirections.
// @author      Sohag1192
// @include     *
// @version     2.1
// @grant       none
// @run-at      document-start
// ==/UserScript==

(function () {
    'use strict';

    // --- CONFIGURATION ---
    var BLOCK_MODE = {
        'ALL': 0,              // Block all popups
        'CONFIRM': 2,          // Confirm each popup (Useful for debugging)
        'GRANT_PERIOD': 4,     // Block popups NOT initiated by a mouse click (Recommended)
        'ALLOW_SECURE': 8,     // Always allow HTTPS popups
        'ALLOW_REDIRECTS': 16, // Allow redirects (Default: Block unsolicited redirects)
        'CONFIRM_UNLOAD': 32   // Confirm before leaving page (Default: Off)
    };

    // Best Setting: Block popups unless you clicked something recently
    var block_mode = BLOCK_MODE.GRANT_PERIOD; 
    var grant_period = 150;  // Time in ms to allow popup after a click
    var debug = false;       // Set to true to see logs in console

    // --- INTERNALS (DO NOT CHANGE) ---
    var allowed_elements = {'a': true, 'button': {'type': 'submit'}, 'input': true, 'select': true, 'option': true};
    var ts = 0;
    var originalOpen = window.open;
    var lastInteractedElement = null;
    var notifications = 0;

    // --- HELPER FUNCTIONS ---

    function grantperiod_exceeded() {
        if (!(block_mode & BLOCK_MODE.GRANT_PERIOD)) return true; // If mode is off, ignore
        return Date.now() > (ts + grant_period);
    }

    function protocol_allowed() {
        return (block_mode & BLOCK_MODE.ALLOW_SECURE) && location.protocol === 'https:';
    }

    function is_user_triggered() {
        return !grantperiod_exceeded() || protocol_allowed();
    }

    function element_allowed(element) {
        var allowed = element.tagName && allowed_elements[element.tagName.toLowerCase()];
        if (allowed && typeof allowed === "object") {
            for (var property in allowed) {
                if (element[property] !== element[property]) return false;
            }
        }
        return !!allowed;
    }

    // --- EVENT LISTENERS ---
    // Track user interaction to distinguish real clicks from spam scripts
    ['mousedown', 'click', 'change'].forEach(evt => {
        window.addEventListener(evt, function (event) {
            ts = Date.now();
            var element = event.target;
            // Traverse up to find if we clicked a valid link/button
            while (element.parentElement && !element_allowed(element)) {
                element = element.parentElement;
            }
            lastInteractedElement = element;
            if (debug) console.log('[Pop-Up Blocker] User interaction detected on:', element);
        }, true);
    });

    // --- CORE BLOCKING LOGIC ---

    // Override window.open
    window.open = function () {
        var args = Array.prototype.slice.call(arguments);
        var url = args[0];
        var target = args[1];

        if (debug) console.log('[Pop-Up Blocker] window.open called for:', url);

        // Allow if user clicked recently OR if we are in confirm mode and user says YES
        if (is_user_triggered()) {
            if (debug) console.log('[Pop-Up Blocker] Allowed (User Triggered)');
            return originalOpen.apply(window, args);
        } else if (block_mode & BLOCK_MODE.CONFIRM) {
            if (confirm('Pop-Up Blocker: Allow popup to ' + url + '?')) {
                return originalOpen.apply(window, args);
            }
        }

        // BLOCK ACTION
        console.warn('[Pop-Up Blocker] Blocked popup:', url);
        notify('Blocked popup window', url, target, 0, function() {
            // Callback if user clicks the notification to open it anyway
            originalOpen.apply(window, args);
        });

        return null; // Return null to break the script trying to open the popup
    };

    // --- NOTIFICATION UI ---
    function notify(text, uri, title, timeout, onclick, target) {
        var notification = document.createElement('div');
        notification.style.cssText = `
            position: fixed; top: 0; left: 0; width: 100%; z-index: 2147483647;
            background: #ffebee; color: #b71c1c; border-bottom: 2px solid #b71c1c;
            padding: 10px; font-family: sans-serif; font-size: 14px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1); display: flex; align-items: center; justify-content: space-between;
        `;
        
        var message = document.createElement('span');
        message.innerHTML = '<b>🛑 ' + text + ':</b> ';
        notification.appendChild(message);

        // Link to open it anyway
        var link = document.createElement('a');
        link.href = uri || '#';
        link.innerText = (uri && uri.length > 50) ? uri.substring(0, 50) + '...' : uri;
        link.style.cssText = 'color: #0d47a1; text-decoration: underline; margin-left: 10px; cursor: pointer; font-weight: bold;';
        link.onclick = function(e) {
            e.preventDefault();
            e.stopPropagation();
            removeNotification();
            if (onclick) onclick();
            else if (uri) window.location.href = uri;
        };
        notification.appendChild(link);

        // Close button
        var closeBtn = document.createElement('button');
        closeBtn.innerHTML = '&#10005;';
        closeBtn.style.cssText = 'background: none; border: none; font-size: 16px; cursor: pointer; color: #333; margin-left: 20px;';
        closeBtn.onclick = removeNotification;
        notification.appendChild(closeBtn);

        document.body.appendChild(notification);
        notifications++;

        function removeNotification() {
            if (notification.parentNode) notification.parentNode.removeChild(notification);
            notifications--;
        }

        if (timeout) setTimeout(removeNotification, timeout);
    }
})();