TestGorilla Mouse Exit Bypass

Spoofs mouse behavior on TestGorilla to prevent detection of mouse movements outside the window. Clamps cursor position and blocks mouseleave/mouseout event listeners.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         TestGorilla Mouse Exit Bypass
// @namespace    https://greasyfork.org/en/users/1461725-scriptninja
// @version      1.0.1
// @description  Spoofs mouse behavior on TestGorilla to prevent detection of mouse movements outside the window. Clamps cursor position and blocks mouseleave/mouseout event listeners.
// @author       ScriptNinja
// @license      MIT
// @match        https://*.testgorilla.com/*
// @icon         https://www.google.com/s2/favicons?domain=testgorilla.com
// @grant        none
// @run-at       document-start
// ==/UserScript==


(function() {
    'use strict';

    // Define the boundaries of the "assessment window"
    const FAKE_WINDOW = {
        xMin: 0,          // Left edge
        xMax: window.innerWidth,  // Right edge
        yMin: 0,          // Top edge
        yMax: window.innerHeight // Bottom edge
    };

    // Override MouseEvent properties (clientX, clientY)
    const originalMouseEvent = MouseEvent.prototype;
    const originalClientX = Object.getOwnPropertyDescriptor(MouseEvent.prototype, 'clientX');
    const originalClientY = Object.getOwnPropertyDescriptor(MouseEvent.prototype, 'clientY');

    Object.defineProperty(MouseEvent.prototype, 'clientX', {
        get: function() {
            let x = originalClientX.get.call(this);
            // Clamp X to fake window boundaries
            return Math.max(FAKE_WINDOW.xMin, Math.min(x, FAKE_WINDOW.xMax));
        },
        configurable: true
    });

    Object.defineProperty(MouseEvent.prototype, 'clientY', {
        get: function() {
            let y = originalClientY.get.call(this);
            // Clamp Y to fake window boundaries
            return Math.max(FAKE_WINDOW.yMin, Math.min(y, FAKE_WINDOW.yMax));
        },
        configurable: true
    });

    // Block mouseleave events
    const originalAddEventListener = EventTarget.prototype.addEventListener;
    EventTarget.prototype.addEventListener = function(type, listener, options) {
        if (type === 'mouseleave' || type === 'mouseout') {
            console.log("Blocked mouseleave/mouseout listener");
            return; // Skip adding the listener
        }
        originalAddEventListener.call(this, type, listener, options);
    };

    console.log("Mouse spoofing active");
})();