Anti key and mouse hijacking on sites

Prevent web apps from capturing and muting vital keyboard shortcuts

当前为 2022-06-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Anti key and mouse hijacking on sites
  3. // @description Prevent web apps from capturing and muting vital keyboard shortcuts
  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, 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);