Completely overrides selection blocks and link-dragging to allow text selection everywhere.
// ==UserScript==
// @name Universal Text Force-Select
// @version 2.1
// @author Dunamis
// @namespace https://dunamiss.xyz
// @license MIT
// @description Completely overrides selection blocks and link-dragging to allow text selection everywhere.
// @match *://*/*
// @grant GM_addStyle
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// Force the browser to treat all text as selectable via CSS
const css = `
* {
-webkit-user-select: text !important;
-moz-user-select: text !important;
-ms-user-select: text !important;
user-select: text !important;
}
a {
cursor: text !important;
}
`;
// Inject CSS as early as possible
if (typeof GM_addStyle !== 'undefined') {
GM_addStyle(css);
} else {
const style = document.createElement('style');
style.textContent = css;
document.head.appendChild(style);
}
let isSelecting = false;
let startX, startY;
// Stop sites from "grabbing" the link to drag it as an icon
document.addEventListener('dragstart', (e) => {
e.preventDefault();
return false;
}, true);
document.addEventListener('mousedown', (e) => {
if (e.button === 0) { // Left click only
startX = e.pageX;
startY = e.pageY;
isSelecting = false;
}
}, true);
document.addEventListener('mousemove', (e) => {
if (startX !== undefined) {
const moveX = Math.abs(e.pageX - startX);
const moveY = Math.abs(e.pageY - startY);
if (moveX > 4 || moveY > 4) {
isSelecting = true;
}
}
}, true);
document.addEventListener('click', (e) => {
if (isSelecting) {
// If the user was highlighting text, don't follow the link
const target = e.target.closest('a');
if (target) {
e.preventDefault();
e.stopImmediatePropagation();
}
}
// Reset for next click
startX = undefined;
isSelecting = false;
}, true);
})();