// ==UserScript== // @name A Universal Script to Re-Enable the Selection and Copying // @version 1.3.2 // @description Enables select, right-click, copy and drag on pages that disable them. // @include /^https?\:\/\// // @grant none // @run-at document-start // @namespace https://greasyfork.org/users/371179 // @downloadURL none // ==/UserScript== "use strict"; (function() { var wasRun = false; var cssStyle = '*, body *, div, span, body *::before, body *::after, *:hover, *:link, *:visited, *:active , *[style], *[class]{' + '-webkit-touch-callout: default !important; -webkit-user-select: auto !important; ' + '-khtml-user-select: auto !important; -moz-user-select: auto !important; ' + '-ms-user-select: auto !important; user-select: auto !important;}' + 'html body *:hover>img[src]{' + 'pointer-events:auto;' + '}'; function enableSelectClickCopy() { var mKey = 'dqzadwpujtct'; var enabledSCC = '___enabledSCC_' + mKey + '___'; var nonFalseFunc = '___nff_' + mKey + '___'; var rvSCC = '___returnValue_' + mKey + '___'; if (window[enabledSCC]) return; window[enabledSCC] = true; Event.prototype.preventDefault = (function(f) { var eys = ['copy', 'contextmenu', 'select', 'selectstart', 'dragstart', 'beforecopy']; return function() { if (eys.indexOf(this.type) >= 0) return; return f.apply(this); } })(Event.prototype.preventDefault); var exs = ['copy', 'contextmenu', 'select', 'selectstart', 'dragstart', 'beforecopy']; Object.defineProperty(Event.prototype, "returnValue", { get() { return rvSCC in this ? this[rvSCC] : true; }, set(newValue) { if (exs.indexOf(this.type) < 0 && newValue === false) this.preventDefault(); this[rvSCC] = newValue; }, enumerable: true, configurable: true }); var ezs = ['copy', 'contextmenu', 'select', 'selectstart', 'dragstart', 'beforecopy']; var eventsCount = ezs.length; function universaler(originalFunc) { return function wrapFunction(ev) { var pName = 'on' + ev.type; var func = this[pName]; if (typeof func == 'function' && func.name == 'wrapFunction') { var res = originalFunc.apply(this, arguments); if (res !== false) { originalFunc[nonFalseFunc] = true; this[pName] = originalFunc; return res; } } } } function disableAll(event) { var elmNode = event.target while (elmNode && elmNode.nodeType > 0) { var pName = 'on' + event.type var f = elmNode[pName]; if (f && f[nonFalseFunc] !== true) { var nf = universaler(f); nf[nonFalseFunc] = true; elmNode[pName] = nf; } elmNode = elmNode.parentNode; } } for (var i = 0; i < eventsCount; i++) { var event = ezs[i]; document.addEventListener(event, disableAll, true); } var _alert = window.alert var _mAlert = null; if (_alert && typeof _alert == 'function') { _mAlert = function alert(msg) { setTimeout(() => { alert._click.isDisabled() ? console.log("alert msg disabled: ", msg) : alert.alert.apply(this, arguments) }, 9); }; _mAlert._click = { isDisabled: function() { return this.status == 1 && this.last + 50 > +new Date; } } _mAlert.alert = _alert window.alert = _mAlert var cid_mouseup = 0; ["mousedown", "click", "dblclick", "contextmenu"].forEach(function(event) { document.addEventListener(event, function(evt) { if (evt.type != "contextmenu" && evt.which != 3) return; if (cid_mouseup > 0) { clearTimeout(cid_mouseup) cid_mouseup = 0; } _mAlert._click.last = +new Date; _mAlert._click.status = 1; }, true); }) document.addEventListener("mouseup", function(evt) { if (evt.which != 3) return; cid_mouseup = setTimeout(function() { _mAlert._click.last = +new Date; _mAlert._click.status = 0; }, 17); }, true); } } function loadedHandler() { if (wasRun) return; wasRun = true; console.log("Select-click-copy Enabler"); try { document.removeEventListener('beforescriptexecute', loadedHandler, true); document.removeEventListener('beforeload', loadedHandler, true); document.removeEventListener('DOMContentLoaded', loadedHandler, true); } catch (e) {} appendScript(document); } function isDocumentObj(x) { return x && x.nodeType == 9 } function isHTMLElementObj(x) { return x && x.nodeType == 1 } function makeScriptElm(documentObject) { if (!isDocumentObj(documentObject)) return null; var s = documentObject.createElement('script'); s.type = 'text/javascript'; s.innerHTML = '(' + enableSelectClickCopy.toString() + ')()'; return s } function appendScript(documentObject) { try { if (!isDocumentObj(documentObject)) return; var container = documentObject.head || documentObject.body; if (container) container.appendChild(makeScriptElm(documentObject)); } catch (e) {} } function appendCssEnabler(container) { if (!isHTMLElementObj(container)) return; try { var css = document.createElement('style'); css.type = 'text/css'; css.innerHTML = cssStyle; container.appendChild(css); } catch (e) {} } wasRun = false; if (document != null) { try { enableSelectClickCopy(); //try direct call } catch (e) {} try { if ('onbeforescriptexecute' in document) { //for firefox document.addEventListener('beforescriptexecute', loadedHandler, true); } else { //for chrome and opera document.addEventListener('beforeload', loadedHandler, true); } } catch (e) {} function onReady() { //in case all previous efforts fail try { loadedHandler(); } catch (e) {} appendCssEnabler(document.documentElement || document.body); } if (document.readyState !== 'loading') { onReady(); } else { document.addEventListener('DOMContentLoaded', onReady); } } })();