// ==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();
})();