Anti key and mouse hijacking on sites

Prevent web apps from capturing and muting vital keyboard shortcuts. This will break some sites so use it on case by case situation.

当前为 2022-07-13 提交的版本,查看 最新版本

// ==UserScript==
// @name Anti key and mouse hijacking on sites
// @description Prevent web apps from capturing and muting vital keyboard shortcuts. This will break some sites so use it on case by case situation.
// @author        Someone
// @version       1.8.9
// @grant         GM_registerMenuCommand
// @license       BSD
// @include     *example.com*
// @namespace https://greasyfork.org/users/927418
// ==/UserScript==

//Right Click
window.pointers = window.pointers || {
  run: new Set(),
  scripts: new Set(),
  cache: new Map(),
  status: ''
};

window.pointers.record = (e, name, value) => {
  window.pointers.cache.set(e, {name, value});
};

window.pointers.inject = code => {
  const script = document.createElement('script');
  script.textContent = 'document.currentScript.dataset.injected = true;' + code;
  document.documentElement.appendChild(script);
  script.remove();
  if (script.dataset.injected !== 'true') {
    const s = document.createElement('script');
    s.src = 'data:text/javascript;charset=utf-8;base64,' + btoa(code);
    s.onload = () => s.remove();
    document.documentElement.appendChild(s);

    window.pointers.scripts.add(s);
    return s;
  }
  else {
    window.pointers.scripts.add(script);
    return script;
  }
};


// allow context-menu
window.pointers.inject(`
  try {
    const ogs = {
      removed: false,
      misc: {}
    };

    // alert
    ogs.misc.alert = window.alert;
    Object.defineProperty(window, 'alert', {
      get() {
        return ogs.removed ? ogs.misc.alert : (...args) => console.log('[alert is blocked]', ...args);
      },
      set(c) {
        ogs.misc.alert ||= c;
      }
    });

    // unblock contextmenu and more
    ogs.misc.mp = MouseEvent.prototype.preventDefault;
    Object.defineProperty(MouseEvent.prototype, 'preventDefault', {
      get() {
        return ogs.removed ? ogs.misc.mp : () => {};
      },
      set(c) {
        console.log('a try to overwrite "preventDefault"', c);
        ogs.misc.mp ||= c;
      }
    });
    Object.defineProperty(MouseEvent.prototype, 'returnValue', {
      get() {
        return ogs.removed && 'v' in this ? this.v : true;
      },
      set(c) {
        console.log('a try to overwrite "returnValue"', c);
        this.v = c;
      }
    });

    ogs.misc.cp = ClipboardEvent.prototype.preventDefault;
    Object.defineProperty(ClipboardEvent.prototype, 'preventDefault', {
      get() {
        return ogs.removed ? ogs.misc.cp : () => {};
      },
      set(c) {
        ogs.misc.cp ||= c;
      }
    });

    document.currentScript.addEventListener('remove', () => ogs.removed = true);
    document.currentScript.addEventListener('install', () => ogs.removed = false);
  }
  catch (e) {}
`);


{
  const skip = e => e.stopPropagation();
  // bypass all registered listeners
  document.addEventListener('dragstart', skip, true);
  document.addEventListener('selectstart', skip, true);
  document.addEventListener('copy', skip, true);
  document.addEventListener('paste', skip, true);
  document.addEventListener('contextmenu', skip, true);
  document.addEventListener('mousedown', skip, true);

  window.pointers.run.add(() => {
    document.removeEventListener('dragstart', skip, true);
    document.removeEventListener('selectstart', skip, true);
    document.removeEventListener('copy', skip, true);
    document.removeEventListener('paste', skip, true);
    document.removeEventListener('contextmenu', skip, true);
    document.removeEventListener('mousedown', skip, true);
  });
}





function handler(e){
	if(e.button == 1 || (e.button == 0 && e.ctrlKey)){
		e.stopPropagation();
	}
}

function handler(e){
	if(e.button == 1 || (e.button == 0 && e.AltlKey)){
		e.stopPropagation();
	}
}
 
addEventListener('click', handler, true);
addEventListener('mousedown', handler, true);
addEventListener('mouseup', handler, true);



document.addEventListener("click", function(e){
    if (e.button === 1 || e.button === 2){
        e.stopPropagation();
    }
}, true);


ctrlkeycodes = [70, 78, 82, 83, 84];  
keycodes = [70, 76, 78, 82, 83, 84];  
 
 
(window.opera ? document.body : document).addEventListener('keydown', function(e) {
reclaim_all = false; // Turn this to true to kill ALL keyboard shortcuts
allow = true;
 
    if (keycodes.indexOf(e.keyCode) != -1)
    {
        allow = false;
    }
    
    if(ctrlkeycodes.indexOf(e.keyCode) != -1 && e.ctrlKey)
    {
        allow = false;
    }
    
    if (reclaim_all  || (! allow))
    {
        e.cancelBubble = true;
        e.stopImmediatePropagation();
    
    }
    return false;
}, !window.opera);