Always has focus

Tricks the page into thinking it is always focused

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==UserScript==
// @name        Always has focus
// @namespace   dev.tock.keepfocus
// @version     1.0
// @description Tricks the page into thinking it is always focused
// @author      Steve Persson
// @match       *://*/*
// @run-at      document-start
// @grant       unsafeWindow
// @license     MIT
// ==/UserScript==

(function() {
    'use strict';

    // Override the document.hasFocus() method to always return true
    document.hasFocus = function () {
        return true;
    };
    
    // Override the document.hidden property and visibilityState
    Object.defineProperty(Document.prototype, "hidden", { get: () => false });
    Object.defineProperty(Document.prototype, "visibilityState", { get: () => "visible" });

    // Override the Page Visibility API properties
    Object.defineProperty(document, "visibilityState", {
        get: function () {
            return "visible";
        }
    });

    Object.defineProperty(document, "hidden", {
        get: function () {
            return false;
        }
    });

    // Stop propagation of visibilitychange and blur events
    window.addEventListener('visibilitychange', function (event) {
        event.stopImmediatePropagation();
    }, true);

    window.addEventListener('blur', function (event) {
        event.stopImmediatePropagation();
    }, true);

    // Some sites might use window.onfocus/onblur
    window.onblur = null;
    window.onfocus = null;
    
    // Override the window.onblur event handler
    if (unsafeWindow) {
        unsafeWindow.onblur = null;
    }

})();