Skip to content

Instantly share code, notes, and snippets.

@tycoi2005
Created January 25, 2026 19:46
Show Gist options
  • Select an option

  • Save tycoi2005/b3adf9030b6bf5900a47bd5b6ef856c2 to your computer and use it in GitHub Desktop.

Select an option

Save tycoi2005/b3adf9030b6bf5900a47bd5b6ef856c2 to your computer and use it in GitHub Desktop.
// ==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