- // ==UserScript==
- // @name Universal Bypass
- // @namespace https://github.com/x3ric
- // @version 1.1
- // @description Bypass common web restrictions: right-click, copy-paste, text selection, drag/drop, scrolling, video controls, console, debugger, and more.
- // @author x3ric
- // @license MIT
- // @match *://*/*
- // @run-at document-start
- // @grant unsafeWindow
- // @grant GM_registerMenuCommand
- // ==/UserScript==
-
- (function () {
- 'use strict';
- const settings = {
- rightClick: true, copyPaste: true, textSelection: true, dragDrop: false, keyboardShortcuts: false,
- pointerEvents: false, scrolling: true, unlockInputs: false, stopAutoPlay: false, enableVideoControls: false,
- removeOverlays: false, removeNoCopy: true, allowPasteInPassword: false, consoleBypass: false, debuggerBypass: false
- };
-
- const saveSettings = () => localStorage.setItem('universalBypassSettings', JSON.stringify(settings));
- const loadSettings = () => { const storedSettings = localStorage.getItem('universalBypassSettings'); if (storedSettings) Object.assign(settings, JSON.parse(storedSettings)); };
-
- const applyBypasses = () => {
- const unblockEvents = () => {
- const eventsToUnblock = [];
- if (settings.rightClick) eventsToUnblock.push('contextmenu');
- if (settings.copyPaste) eventsToUnblock.push('copy', 'paste', 'cut');
- if (settings.textSelection) eventsToUnblock.push('selectstart');
- if (settings.dragDrop) eventsToUnblock.push('dragstart', 'drop');
- if (settings.keyboardShortcuts) eventsToUnblock.push('keydown', 'keypress', 'keyup');
- if (settings.pointerEvents) eventsToUnblock.push('pointerdown', 'pointerup', 'mousedown', 'mouseup', 'click');
- if (settings.scrolling) eventsToUnblock.push('wheel', 'touchmove', 'scroll');
- eventsToUnblock.forEach(eventType => document.addEventListener(eventType, e => e.stopPropagation(), true));
- };
-
- const removeBlockingAttributes = () => {
- const attrsToRemove = ['oncontextmenu', 'oncopy', 'onpaste', 'oncut', 'onselectstart', 'ondragstart', 'ondrop', 'onkeydown', 'onkeypress', 'onkeyup', 'onpointerdown', 'onpointerup', 'onclick', 'onscroll'];
- attrsToRemove.forEach(attr => document.querySelectorAll(`[${attr}]`).forEach(el => el.removeAttribute(attr)));
- if (settings.removeNoCopy) document.querySelectorAll('[class*="no-copy"], [class*="unselectable"]').forEach(el => el.classList.remove('no-copy', 'unselectable'));
- if (settings.allowPasteInPassword) document.querySelectorAll('input[type="password"]').forEach(input => input.onpaste = null);
- };
-
- if (settings.removeOverlays) document.querySelectorAll('.overlay, .modal, .popup, .lightbox, [role="dialog"]').forEach(el => el.style.display = 'none');
- if (settings.unlockInputs) document.querySelectorAll('input[disabled], textarea[disabled], select[disabled], input[readonly], textarea[readonly]').forEach(input => { input.disabled = false; input.readOnly = false; });
- if (settings.stopAutoPlay) document.querySelectorAll('video, audio').forEach(media => { media.autoplay = false; media.pause(); });
- if (settings.enableVideoControls) document.querySelectorAll('video').forEach(video => video.controls = true);
- if (settings.consoleBypass) console.clear = () => console.log("Console clear has been blocked.");
- if (settings.debuggerBypass) {
- const injectDebugger = `debugger;`;
- unsafeWindow.eval = new Proxy(unsafeWindow.eval, { apply: (target, thisArg, args) => { if (typeof args[0] === 'string') args[0] = `${injectDebugger} ${args[0]}`; return Reflect.apply(target, thisArg, args); } });
- unsafeWindow.Function = new Proxy(unsafeWindow.Function, { construct: (target, args) => { if (typeof args[args.length - 1] === 'string') args[args.length - 1] = `${injectDebugger} ${args[args.length - 1]}`; return Reflect.construct(target, args); } });
- }
- unblockEvents();
- removeBlockingAttributes();
- };
-
- const observeDOMChanges = () => { const observer = new MutationObserver(() => applyBypasses()); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); };
-
- const toggleSetting = (settingKey, settingName, menuCommandId) => {
- settings[settingKey] = !settings[settingKey];
- applyBypasses();
- saveSettings();
- GM_unregisterMenuCommand(menuCommandId);
- createMenu(settingKey, settingName);
- };
-
- const createMenu = (settingKey, settingName) => {
- const status = settings[settingKey] ? 'ON' : 'OFF';
- const menuCommandId = GM_registerMenuCommand(`${settingName} (${status})`, () => toggleSetting(settingKey, settingName, menuCommandId));
- };
-
- const init = () => {
- loadSettings();
- applyBypasses();
- observeDOMChanges();
- createMenu('rightClick', 'Right-Click');
- createMenu('copyPaste', 'Copy-Paste');
- createMenu('textSelection', 'Text Selection');
- createMenu('dragDrop', 'Drag-and-Drop');
- createMenu('keyboardShortcuts', 'Keyboard Shortcuts');
- createMenu('pointerEvents', 'Pointer Events');
- createMenu('scrolling', 'Scrolling');
- createMenu('unlockInputs', 'Unlock Inputs');
- createMenu('stopAutoPlay', 'Stop Auto-Play');
- createMenu('enableVideoControls', 'Enable Video Controls');
- createMenu('removeOverlays', 'Remove Overlays');
- createMenu('removeNoCopy', 'Remove No-Copy Classes');
- createMenu('allowPasteInPassword', 'Allow Paste in Password Fields');
- createMenu('consoleBypass', 'Console Bypass');
- createMenu('debuggerBypass', 'Debugger Bypass');
- };
-
- init();
- })();