Stop Stealing My Shortcuts

Prevent websites from hijacking specific keyboard shortcuts, like Chrome Tab Switcher

// ==UserScript==
// @name         Stop Stealing My Shortcuts
// @namespace    https://github.com/mariczne/stop-stealing-my-shortcuts
// @version      0.1.2
// @description  Prevent websites from hijacking specific keyboard shortcuts, like Chrome Tab Switcher
// @license      MIT
// @author       mariczne
// @match        https://discord.com/*
// @match        https://www.facebook.com
// @match        https://app.slack.com/*
// @icon         https://github.githubassets.com/pinned-octocat.svg
// @supportURL   https://github.com/mariczne/stop-stealing-my-shortcuts/issues
// @grant        none
// ==/UserScript==

(function () {
  "use strict";

  // List of shortcuts to prevent from hijacking
  const blockedShortcuts = [
    { key: "a", ctrl: false, shift: true, alt: false, meta: true }, // Cmd+Shift+A
    { key: "a", ctrl: true, shift: true, alt: false, meta: false }, // Ctrl+Shift+A
    // Add other shortcuts as needed
  ];

  window.addEventListener(
    "keydown",
    function (event) {
      if (!event.isTrusted) return; // Ignore events dispatched by this script

      for (const shortcut of blockedShortcuts) {
        if (
          event.key.toLowerCase() === shortcut.key.toLowerCase() &&
          event.ctrlKey === shortcut.ctrl &&
          event.shiftKey === shortcut.shift &&
          event.altKey === shortcut.alt &&
          event.metaKey === shortcut.meta
        ) {
          event.stopImmediatePropagation();

          if (document.activeElement) {
            document.activeElement.blur(); // Remove focus from any element
          }

          const newEvent = new KeyboardEvent("keydown", {
            key: event.key,
            code: event.code,
            ctrlKey: event.ctrlKey,
            shiftKey: event.shiftKey,
            altKey: event.altKey,
            metaKey: event.metaKey,
            bubbles: true,
            cancelable: true,
          });

          window.setTimeout(() => {
            document.dispatchEvent(newEvent);
          }, 0);

          return;
        }
      }
    },
    true
  );
})();