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.

  1. // ==UserScript==
  2. // @name Anti key and mouse hijacking on sites
  3. // @description Prevent web apps from capturing and muting vital keyboard shortcuts. This will break some sites so use it on case by case situation.
  4. // @author Someone
  5. // @version 1.8.9
  6. // @grant GM_registerMenuCommand
  7. // @license BSD
  8. // @include *example.com*
  9. // @namespace https://greasyfork.org/users/927418
  10. // ==/UserScript==
  11.  
  12. //Right Click
  13. window.pointers = window.pointers || {
  14. run: new Set(),
  15. scripts: new Set(),
  16. cache: new Map(),
  17. status: ''
  18. };
  19.  
  20. window.pointers.record = (e, name, value) => {
  21. window.pointers.cache.set(e, {name, value});
  22. };
  23.  
  24. window.pointers.inject = code => {
  25. const script = document.createElement('script');
  26. script.textContent = 'document.currentScript.dataset.injected = true;' + code;
  27. document.documentElement.appendChild(script);
  28. script.remove();
  29. if (script.dataset.injected !== 'true') {
  30. const s = document.createElement('script');
  31. s.src = 'data:text/javascript;charset=utf-8;base64,' + btoa(code);
  32. s.onload = () => s.remove();
  33. document.documentElement.appendChild(s);
  34.  
  35. window.pointers.scripts.add(s);
  36. return s;
  37. }
  38. else {
  39. window.pointers.scripts.add(script);
  40. return script;
  41. }
  42. };
  43.  
  44.  
  45. // allow context-menu
  46. window.pointers.inject(`
  47. try {
  48. const ogs = {
  49. removed: false,
  50. misc: {}
  51. };
  52.  
  53. // alert
  54. ogs.misc.alert = window.alert;
  55. Object.defineProperty(window, 'alert', {
  56. get() {
  57. return ogs.removed ? ogs.misc.alert : (...args) => console.log('[alert is blocked]', ...args);
  58. },
  59. set(c) {
  60. ogs.misc.alert ||= c;
  61. }
  62. });
  63.  
  64. // unblock contextmenu and more
  65. ogs.misc.mp = MouseEvent.prototype.preventDefault;
  66. Object.defineProperty(MouseEvent.prototype, 'preventDefault', {
  67. get() {
  68. return ogs.removed ? ogs.misc.mp : () => {};
  69. },
  70. set(c) {
  71. console.log('a try to overwrite "preventDefault"', c);
  72. ogs.misc.mp ||= c;
  73. }
  74. });
  75. Object.defineProperty(MouseEvent.prototype, 'returnValue', {
  76. get() {
  77. return ogs.removed && 'v' in this ? this.v : true;
  78. },
  79. set(c) {
  80. console.log('a try to overwrite "returnValue"', c);
  81. this.v = c;
  82. }
  83. });
  84.  
  85. ogs.misc.cp = ClipboardEvent.prototype.preventDefault;
  86. Object.defineProperty(ClipboardEvent.prototype, 'preventDefault', {
  87. get() {
  88. return ogs.removed ? ogs.misc.cp : () => {};
  89. },
  90. set(c) {
  91. ogs.misc.cp ||= c;
  92. }
  93. });
  94.  
  95. document.currentScript.addEventListener('remove', () => ogs.removed = true);
  96. document.currentScript.addEventListener('install', () => ogs.removed = false);
  97. }
  98. catch (e) {}
  99. `);
  100.  
  101.  
  102. {
  103. const skip = e => e.stopPropagation();
  104. // bypass all registered listeners
  105. document.addEventListener('dragstart', skip, true);
  106. document.addEventListener('selectstart', skip, true);
  107. document.addEventListener('copy', skip, true);
  108. document.addEventListener('paste', skip, true);
  109. document.addEventListener('contextmenu', skip, true);
  110. document.addEventListener('mousedown', skip, true);
  111.  
  112. window.pointers.run.add(() => {
  113. document.removeEventListener('dragstart', skip, true);
  114. document.removeEventListener('selectstart', skip, true);
  115. document.removeEventListener('copy', skip, true);
  116. document.removeEventListener('paste', skip, true);
  117. document.removeEventListener('contextmenu', skip, true);
  118. document.removeEventListener('mousedown', skip, true);
  119. });
  120. }
  121.  
  122.  
  123.  
  124.  
  125.  
  126. function handler(e){
  127. if(e.button == 1 || (e.button == 0 && e.ctrlKey)){
  128. e.stopPropagation();
  129. }
  130. }
  131.  
  132. function handler(e){
  133. if(e.button == 1 || (e.button == 0 && e.AltlKey)){
  134. e.stopPropagation();
  135. }
  136. }
  137. addEventListener('click', handler, true);
  138. addEventListener('mousedown', handler, true);
  139. addEventListener('mouseup', handler, true);
  140.  
  141.  
  142.  
  143. document.addEventListener("click", function(e){
  144. if (e.button === 1 || e.button === 2){
  145. e.stopPropagation();
  146. }
  147. }, true);
  148.  
  149.  
  150. ctrlkeycodes = [70, 78, 82, 83, 84];
  151. keycodes = [70, 76, 78, 82, 83, 84];
  152. (window.opera ? document.body : document).addEventListener('keydown', function(e) {
  153. reclaim_all = false; // Turn this to true to kill ALL keyboard shortcuts
  154. allow = true;
  155. if (keycodes.indexOf(e.keyCode) != -1)
  156. {
  157. allow = false;
  158. }
  159. if(ctrlkeycodes.indexOf(e.keyCode) != -1 && e.ctrlKey)
  160. {
  161. allow = false;
  162. }
  163. if (reclaim_all || (! allow))
  164. {
  165. e.cancelBubble = true;
  166. e.stopImmediatePropagation();
  167. }
  168. return false;
  169. }, !window.opera);