Created
January 25, 2026 19:46
-
-
Save tycoi2005/b3adf9030b6bf5900a47bd5b6ef856c2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name MutationObserver Wrapper + Kill | |
| // @namespace http://tampermonkey.net/ | |
| // @version 2026-01-25 | |
| // @description Wrap and control MutationObserver | |
| // @match * | |
| // @run-at document-start | |
| // @grant none | |
| // ==/UserScript== | |
| (function () { | |
| const inject = document.createElement("script"); | |
| inject.textContent = ` | |
| (() => { | |
| console.log("[MO] Injected wrapper running"); | |
| if (window.__MO_WRAPPED__) return; | |
| window.__MO_WRAPPED__ = true; | |
| const NativeMO = window.MutationObserver; | |
| const registry = []; | |
| Object.defineProperty(window, "__MO_REGISTRY__", { | |
| value: registry, | |
| writable: false | |
| }); | |
| function WrappedMutationObserver(callback) { | |
| console.log("[MO] New MutationObserver created:", callback); | |
| console.trace("[MO] Created at"); | |
| const observer = new NativeMO(function(mutations, obs) { | |
| console.log("[MO] Callback fired:", mutations); | |
| return callback(mutations, obs); | |
| }); | |
| const entry = { | |
| observer, | |
| callback, | |
| observeCalls: [], | |
| createdAt: performance.now() | |
| }; | |
| registry.push(entry); | |
| const nativeObserve = observer.observe.bind(observer); | |
| const nativeDisconnect = observer.disconnect.bind(observer); | |
| const nativeTakeRecords = observer.takeRecords.bind(observer); | |
| observer.observe = function(target, options) { | |
| console.log("[MO] observe()", target, options); | |
| entry.observeCalls.push({ target, options, time: performance.now() }); | |
| return nativeObserve(target, options); | |
| }; | |
| observer.disconnect = function() { | |
| console.log("[MO] disconnect()", observer); | |
| return nativeDisconnect(); | |
| }; | |
| observer.takeRecords = function() { | |
| console.log("[MO] takeRecords()", observer); | |
| return nativeTakeRecords(); | |
| }; | |
| return observer; | |
| } | |
| WrappedMutationObserver.prototype = NativeMO.prototype; | |
| window.MutationObserver = WrappedMutationObserver; | |
| // ---- GLOBAL KILL SWITCH ---- | |
| window.disconnectAllMutationObservers = function () { | |
| console.warn("[MO] Disconnecting all observers..."); | |
| registry.forEach(e => { | |
| try { e.observer.disconnect(); } catch (err) {} | |
| }); | |
| console.warn("[MO] Done. Count:", registry.length); | |
| }; | |
| console.log("[MO] MutationObserver wrapped + registry enabled"); | |
| })(); | |
| `; | |
| document.documentElement.appendChild(inject); | |
| inject.remove(); | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment