// ==UserScript== // @name Safeguard // @description Unbreak the web by preventing sites from blocking default browser behavior such as copy-paste, context menus, text selection, etc. // @match // @run-at document-start // @version 2023.08.21.1 // @downloadURL https://gist.github.com/msanders/76923c70348086108ca47e7b46ffc97c/raw/safeguard.user.js // @updateURL https://gist.github.com/msanders/76923c70348086108ca47e7b46ffc97c/raw/safeguard.user.js // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAMAAADwSaEZAAAARVBMVEVHcEzZOy8AAAAAAADfTz4AAAAAAAAAAAAAAAABAQElFxY0NDNwcG+mpaRSUlLPzs27urnqWkeSkpGuLCRxIhvSLyfDSzsFvPdkAAAACXRSTlMA+eU8+8J0G6R5tfGAAAACbElEQVR4Xu2X25bqMAxD6b1yrr3A/3/qwfFAVsmcJpm+okcoG0l2utrbmb766qupG8dxHp/qpkuccWhxUDuM3Z9Is4BAygYpggDnWl43MEdp412U80arwBtrXDFKrf7NWNdINZZxxe5GADaQvJZwIlL651MAcxlrBhSjvCUkop+vgKHQl2ZUaIf2R98vS3N/atv2QCfGrWXehKWZ9OgX0f2tjXlWaPneBtCTpRi1vMTOogjhEp0POgHeOQvsgonWojZAOeeBKbdgQLhuY8QJbXUO6EpgCrR8qD/QdraWdzYxDOC+Tq0R27/9EXZPYAZtwWYYl1bWpLC1YG0HaKewJ40lnemCrR3DdXQWkmHWWYxZWBcS0LkzYvsMywlwnmFnNCl2KoRhOZvAJtcUHfQ1sxtxmFnNsOk4l6Z2mHECOplAdf/xDJjP0pL+vfRfeAYeSchD/3KY8hrS0prM/hevbUoDtCOurLA0D/RpaTGlVFaiNvzz/r9x7oVbJhqR5uyrU8ac3n/Msz5lzGmdBf0+AOJZSsrieRqxlg4T8A4xZdlhl1VLjaW3//zt9mjteCsj2djyERinQOkwCST1V2gWa9tn0I0bU1x/pbXjQF8hVbUxseaA/eiMAOeIjdVaW936Dtq/QhpOX8mSM+UsTzT2D1i2O9+qFX6pgP4dEgDz21u9Os7kKNAiy8tTWbVmDurBtObFcpD269VCCe3R3DdhUQxZH1QHAPbXQ3FuxfKvBBbxcX1MADW09QkxRCZ5kajXHGiiVcq/RtPC0sK6SrPMstcyxt7IGJLuL6trEV9XL2uak4iXcPlV/eqrr/4BhvZnD6AVFs0AAAAASUVORK5CYII= // ==/UserScript== // Tested on Greasemonkey and Violentmonkey for Firefox, and Userscripts for // Safari. // // When using Violentmonkey, the Synchronous page mode or Alternative page mode // in Firefox setting is recommended for earlier injection. (() => { "use strict"; const BLOCKED_EVENT_TYPES = new Set([ // Protect text selection. "selectstart", "selectionchange", // Protect copy, cut and paste. "copy", "cut", "paste", ]); const BLOCKED_META_EVENT_TYPES = new Set([ // Protect command-click. "mousedown", "mouseup", "click", ]); const BLOCKED_ALT_EVENT_TYPES = new Set([ // Protect contextual menus with option key. // Protect option-click. "contextmenu", "mousedown", ]); const BLOCKED_META_ALT_CTRL_EVENT_TYPES = new Set([ // Protect command-key, option-key, and control-key shortcuts. "keydown", "keyup", "keypress", ]); const DRAG_EVENT_TYPES = new Set([ // Protect drag. "dragstart", "drag", ]); const DROP_EVENT_TYPES = new Set([ // Protect drop. "dragenter", "dragexit", "dragleave", "drop", ]); const blockEvent = event => { event.stopImmediatePropagation(); }; const blockMetaEvent = event => { if (event.metaKey) { blockEvent(event); } }; const blockAltEvent = event => { if (event.altKey) { blockEvent(event); } }; const blockMetaAltCtrlEvent = event => { if (event.metaKey || event.altKey || event.ctrlKey) { blockEvent(event); } }; const protectDragEvent = event => { const selectionNode = window.getSelection().anchorNode; // Preserve default drag behavior for links, images, and selected text. if ( (event.target.nodeName === "A" && !event.target.isContentEditable) || event.target.nodeName === "IMG" || selectionNode === event.target || selectionNode?.parentNode === event.target ) { blockEvent(event); } }; const protectDropEvent = event => { // Preserve default drop behavior onto and