Greasy Fork镜像 is available in English.

Remove Restrictions and Restore Default Behavior

Allows you select, cut, copy, paste, save and open the DevTools on any website.

Pada tanggal 08 Mei 2024. Lihat %(latest_version_link).

// ==UserScript==
// @name                 Remove Restrictions and Restore Default Behavior
// @name:zh-CN           解除网页限制,恢复默认行为
// @name:en-US           Remove Restrictions and Restore Default Behavior
// @namespace            http://hl-bo.github.io/namespaces/user-script/remove-limits
// @source               https://github.com/HL-Bo/user-script
// @supportURL           https://github.com/HL-Bo/user-script/issues
// @version              2.5
// @license              AGPLv3
// @description          Allows you select, cut, copy, paste, save and open the DevTools on any website.
// @description:zh-CN    恢复选择、剪切、复制、粘贴、保存、右键菜单和打开开发者工具的默认行为。
// @description:en-US    Allows you select, cut, copy, paste, save and open the DevTools on any website.
// @author               HL-Bo
// @match                *://*/**
// @exclude              *://vscode.dev
// @exclude              *://vscode.dev/**
// @exclude              *://*.github.dev
// @exclude              *://*.github.dev/**
// @exclude              *://github.com/*/*/edit/**
// @exclude              *://gitee.com/*/*/edit/**
// @exclude              *://codeberg.org/*/*/_edit/**
// @exclude              *://www.figma.com/file/**
// @exclude              *://www.notion.so/**
// @exclude              *://outlook.live.com/**
// @exclude              *://mail.netease.com/**
// @exclude              *://mail.163.com/**
// @exclude              *://mail.126.com/**
// @exclude              *://www.yeah.net/**
// @exclude              *://mail.qq.com/**
// @exclude              *://uutool.cn/*
// @exclude              *://anytexteditor.com/*/online-notepad
// @exclude              *://*.zhihuishu.com/**
// @exclude              *://localhost
// @exclude              *://localhost:*
// @exclude              *://localhost/**
// @exclude              *://localhost:*/**
// @exclude              *://127.0.0.1
// @exclude              *://127.0.0.1:*
// @exclude              *://127.0.0.1/**
// @exclude              *://127.0.0.1:*/**
// @icon                 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAspJREFUWEfVl89PE1EQx7/TdpcabKFAoEKQH22ktEYSqRevXiRijEr8cSDe/DNM9D/xhPFn4oF4MeBZuJi0SiiQikTjD2gLCLS7jNmFLt2mu/uWYtB36G73zWQ+b2bevDeEijE5Od/Q3ut5CNA9gMOVc3bvG7+3MLeYRU9nhxqP9r2WURoPh8ObIvpUKTSbzkww6I6IYqWMAdAVxmCkF8z8zk/KFREIA2BmbilGu7tpZpigRGCqATQdAk3LKI46QRjGZtOZ6wx6KWKwWqYWgCbDzNN+UmwhDID3HxduEuP5UQKIQPx1gDJEnpTRoRqJaQnw/dcqVvPrANf2iST50N/dCSKCVQjMmjyVg3K1GsISILvyFT/X8pYRkXw+nD3TD4/HIwigp+ZUDkUThG0I9MVbeIAq9srW9g7SmSW0t4ZwPjHglEZvf3xZGkkmk6W93bI/qpNQUVVs7xRtPOBFgyzr88yM1PwidoolRE53oS3UbAuhMo8Mx/re2ALMZ5dRWLcuZlrsh2JReL1e3ZiWB5nsMlR118kDII/39v2xy09tAQobm8jrALVjIEsSOtpaTMZKioLVXAHaU/OK1fAAt65duvjMFsBxGXUIMGHswmDkhS2AtpK1wnodZg5UQ8EAWpqDxgchgIXPK8gdEUBzMKAnZ3kIAWgxLCmq9T4U9g1B8nn1gvV/ARx7CI49CYVDfAhBoSR0KkTidglNgUYETza6S0KtrO5VwvqHBhDt6XYH4HQYucHyN8jw7Z8Z+uElUgl1QePHjbkqWao4cvenhACcLiRukNpCTejpOuUuBE5XMmEAAlqaAmhvPTg5hTwgbOAQgv8mQD2NiVsnEPjGcDz6ynQfmPkwFyPJd6jWzA0AEZhLSjx5buCTCUD7M5temGDAdXPqCgB4MhyP3C3rmBrRVColb5H/kdv2XAyAvgH8+ARvP0gkEsZ1+w+ixcUwoQ+80AAAAABJRU5ErkJggg==
// @grant                none
// @run-at               document-start
// ==/UserScript==

(function () {
    'use strict';
    let in_frame = false;
    if (window.frameElement && window.frameElement.tagName === 'IFRAME' || window !== window.top) { in_frame = true; }
    if (!in_frame) {
        console.log(
            "  ____                                              _       _               _   _         \n" +
            " |  _ \\    ___   _ __ ___     ___   __   __   ___  | |     (_)  _ __ ___   (_) | |_   ___ \n" +
            " | |_) |  / _ \\ | '_ ` _ \\   / _ \\  \\ \\ / /  / _ \\ | |     | | | '_ ` _ \\  | | | __| / __|\n" +
            " |  _ <  |  __/ | | | | | | | (_) |  \\ V /  |  __/ | |___  | | | | | | | | | | | |_  \\__ \\\n" +
            " |_| \\_\\  \\___| |_| |_| |_|  \\___/    \\_/    \\___| |_____| |_| |_| |_| |_| |_|  \\__| |___/\n" +
            "                                                                                          \n" +
            " By HL-Bo"
        );
    }
    if (in_frame) {
        console.debug('Start the installation of user-script/remove-limits (IN-FRAME)');
    } else { console.info('Start the installation of user-script/remove-limits'); }

    // 尝试禁用 debugger
    // 仅在 eval('debugger') 或 setInterval('debugger', sec) 构造前执行才能阻止
    try {
        Function.prototype.$rl_constructor = Function.prototype.constructor;
        Function.prototype.constructor = function () {
            if (arguments && typeof arguments[0] === 'string') {
                if ('debugger' === arguments[0]) {
                    console.debug('Disable an function which may execute debugger');
                    return;
                }
            }
            return Function.prototype.$rl_constructor.apply(this, arguments);
        };
    } catch (error) { console.warn(error); } finally { }
    // 防止清空控制台
    console.$rl_clear = console.clear;
    console.clear = function () { };

    let logError = function (error) {
        let error_message = error.toString();
        if (document && document.body) {
            if (document.body.$rl_errors) {
                if (!document.body.$rl_errors.includes(error_message)) {
                    if (in_frame) { console.debug(error_message); } else { console.warn(error_message); }
                    document.body.$rl_errors.push(error_message);
                }
            } else { document.body.$rl_errors = new Array(); }
        }
    };
    let executeWithInterval = function (func, delay) {
        setTimeout(func, 0); // 异步执行,防止阻塞
        setInterval(func, delay);
    };
    let setEventListener = function (element, event_name, listener) {
        if (!element.$rl_lazy_events) { element.$rl_lazy_events = new Map(); }
        if (!element.$rl_events) { element.$rl_events = new Map(); }
        if (!element.$rl_lazy_events.has(event_name)) {
            element.$rl_lazy_events.set(event_name, listener);
            element.addEventListener(event_name, listener);
        }
        if (!element.$rl_events.has(event_name)) {
            element.removeEventListener(event_name, element.$rl_events.get(event_name));
            element.$rl_events.set(event_name, listener);
            element.addEventListener(event_name, listener);
        }
    };
    let copyEventType = function (old_event) {
        /*
        Event
        +-- ClipboardEvent (cut, copy, paste)
        +-- UIEvent
            +-- FocusEvent (focus, blur, focusin, focusout, ...)
            +-- InputEvent
            +-- CompositionEvent (compositionstart, compositionupdate, compositionend, ...)
            +-- KeyboardEvent (keydown, keypress, keyup)
            +-- TouchEvent
            +-- MouseEvent (click, dblclick, mouseup, mousedown, ...)
                +-- PointerEvent
                +-- WheelEvent
        */
        let new_event_type = Event;
        if (old_event instanceof ClipboardEvent) { new_event_type = ClipboardEvent; }
        if (old_event instanceof UIEvent) { new_event_type = UIEvent; }
        if (old_event instanceof FocusEvent) { new_event_type = FocusEvent; }
        if (old_event instanceof InputEvent) { new_event_type = InputEvent; }
        if (old_event instanceof CompositionEvent) { new_event_type = CompositionEvent; }
        if (old_event instanceof KeyboardEvent) { new_event_type = KeyboardEvent; }
        if (old_event instanceof TouchEvent) { new_event_type = TouchEvent; }
        if (old_event instanceof MouseEvent) { new_event_type = MouseEvent; }
        if (old_event instanceof PointerEvent) { new_event_type = PointerEvent; }
        if (old_event instanceof WheelEvent) { new_event_type = WheelEvent; }
        return new_event_type;
    };
    let copyEventAttr = function (old_event) {
        let new_event_init_dict = {};
        new_event_init_dict.cancelable = false;
        if (old_event.bubbles) { new_event_init_dict.bubbles = old_event.bubbles; } // Event
        if (old_event.composed) { new_event_init_dict.composed = old_event.composed; } // Event
        if (old_event.detail) { new_event_init_dict.detail = old_event.detail; } // UIEvent
        if (old_event.view) { new_event_init_dict.view = old_event.view; } // UIEvent
        if (old_event.sourceCapabilities) { new_event_init_dict.sourceCapabilities = old_event.sourceCapabilities; } // UIEvent
        if (old_event.relatedTarget) { new_event_init_dict.relatedTarget = old_event.relatedTarget; } // FocusEvent
        if (old_event.screenX) { new_event_init_dict.screenX = old_event.screenX; } // MouseEvent
        if (old_event.screenY) { new_event_init_dict.screenY = old_event.screenY; } // MouseEvent
        if (old_event.clientX) { new_event_init_dict.clientX = old_event.clientX; } // MouseEvent
        if (old_event.clientY) { new_event_init_dict.screenX = old_event.clientY; } // MouseEvent
        if (old_event.key) { new_event_init_dict.key = old_event.key; } // KeyboardEvent
        if (old_event.code) { new_event_init_dict.code = old_event.code; } // KeyboardEvent
        if (old_event.location) { new_event_init_dict.location = old_event.location; } // KeyboardEvent
        if (old_event.touches) { new_event_init_dict.touches = old_event.touches; } // TouchEvent
        if (old_event.targetTouches) { new_event_init_dict.targetTouches = old_event.targetTouches; } // TouchEvent
        if (old_event.changedTouches) { new_event_init_dict.changedTouches = old_event.changedTouches; } // TouchEvent
        if (old_event.ctrlKey) { new_event_init_dict.ctrlKey = old_event.ctrlKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.shiftKey) { new_event_init_dict.shiftKey = old_event.shiftKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.altKey) { new_event_init_dict.altKey = old_event.altKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.metaKey) { new_event_init_dict.metaKey = old_event.metaKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.repeat) { new_event_init_dict.repeat = old_event.repeat; } // KeyboardEvent
        if (old_event.inputType) { new_event_init_dict.inputType = old_event.inputType; } // InputEvent
        if (old_event.isComposing) { new_event_init_dict.isComposing = old_event.isComposing; } // KeyboardEvent & InputEvent
        if (old_event.charCode) { new_event_init_dict.charCode = old_event.charCode; } // KeyboardEvent
        if (old_event.keyCode) { new_event_init_dict.keyCode = old_event.keyCode; } // KeyboardEvent
        if (old_event.which) { new_event_init_dict.which = old_event.which; } // KeyboardEvent
        if (old_event.button) { new_event_init_dict.button = old_event.button; } // MouseEvent
        if (old_event.buttons) { new_event_init_dict.buttons = old_event.buttons; } // MouseEvent
        if (old_event.relatedTarget) { new_event_init_dict.relatedTarget = old_event.relatedTarget; } // MouseEvent
        if (old_event.region) { new_event_init_dict.region = old_event.region; } // MouseEvent
        if (old_event.deltaX) { new_event_init_dict.deltaX = old_event.deltaX; } // WheelEvent
        if (old_event.deltaY) { new_event_init_dict.deltaY = old_event.deltaY; } // WheelEvent
        if (old_event.deltaZ) { new_event_init_dict.deltaZ = old_event.deltaZ; } // WheelEvent
        if (old_event.deltaMode) { new_event_init_dict.deltaMode = old_event.deltaMode; } // WheelEvent
        if (old_event.pointerId) { new_event_init_dict.pointerId = old_event.pointerId; } // PointerEvent
        if (old_event.width) { new_event_init_dict.width = old_event.width; } // PointerEvent
        if (old_event.height) { new_event_init_dict.height = old_event.height; } // PointerEvent
        if (old_event.pressure) { new_event_init_dict.pressure = old_event.pressure; } // PointerEvent
        if (old_event.tangentialPressure) { new_event_init_dict.tangentialPressure = old_event.tangentialPressure; } // PointerEvent
        if (old_event.tiltX) { new_event_init_dict.tiltX = old_event.tiltX; } // PointerEvent
        if (old_event.tiltY) { new_event_init_dict.tiltY = old_event.tiltY; } // PointerEvent
        if (old_event.twist) { new_event_init_dict.twist = old_event.twist; } // PointerEvent
        if (old_event.pointerType) { new_event_init_dict.pointerType = old_event.pointerType; } // PointerEvent
        if (old_event.isPrimary) { new_event_init_dict.isPrimary = old_event.isPrimary; } // PointerEvent
        if (old_event.dataTransfer) { new_event_init_dict.dataTransfer = old_event.dataTransfer; } // DragEvent
        if (old_event.clipboardData) { new_event_init_dict.clipboardData = old_event.clipboardData; } // ClipboardEvent
        if (old_event.dataType) { new_event_init_dict.dataType = old_event.dataType; } // ClipboardEvent
        if (old_event.data) { new_event_init_dict.data = old_event.data; } // ClipboardEvent & InputEvent & CompositionEvent
        return new_event_init_dict;
    };
    let copyEvent = function (old_event) {
        let event_type = copyEventType(old_event);
        let event_init = copyEventAttr(old_event);
        let new_event = new event_type(old_event.type, event_init);
        return new_event;
    };
    let returnEventAllowed = function (event) {
        if (event.defaultPrevented) {
            // 如果调用了 Event.preventDefault() ,则重新构建一个不可取消的事件。
            event.stopPropagation(); // 停止原事件冒泡,以防重复新建事件。
            let new_event = copyEvent(event);
            if (event.target) { event.target.dispatchEvent(new_event); } else { event.currentTarget.dispatchEvent(new_event); }
            event = new_event;
        }
        event.stopImmediatePropagation(); // 防止其它事件处理器被调用
        try { event.returnValue = true; } catch (error) { logError(error); } finally { }
        if (event.currentTarget === document) { console.debug(`Allow ${event.type}`); }
    };
    let allowEvent = function (element, event_name) {
        setEventListener(element, event_name, function (event) { returnEventAllowed(event); return true; });
    };
    let onKeyEvents = function (event) {
        let keyCode = event.keyCode || event.which || event.charCode;
        let ctrlKey = event.ctrlKey || event.metaKey;
        let shiftKey = event.shiftKey;
        if (ctrlKey && (keyCode == 65 || keyCode == 88 || keyCode == 67 || keyCode == 86 || keyCode == 83 || keyCode == 85)) {
            // Ctrl+A (select-all), Ctrl+X (cut), Ctrl+C (copy), Ctrl+V (paste), Ctrl+S (save), Ctrl+U (view-source)
            returnEventAllowed(event);
        } else if (ctrlKey && shiftKey && (keyCode == 73 || keyCode == 74 || keyCode == 67)) {
            // Ctrl+Shift+I (devtools), Ctrl+Shift+J (console), Ctrl+Shift+C (elements)
            returnEventAllowed(event);
        } else if (keyCode && keyCode == 123) { // F12
            returnEventAllowed(event);
        }
        return true;
    };
    let allowKeyEvents = function (element, event_name) {
        setEventListener(element, event_name, onKeyEvents);
    };
    let preventEventChecks = function (element) {
        let all_events = ['onbeforecopy', 'oncopy', 'onbeforecut', 'oncut', 'onbeforepaste', 'onpaste', 'onselectstart', 'oncontextmenu', 'ondragstart', 'ondragenter', 'ondragover', 'ondragleave', 'ondragend', 'ondrop', 'onkeypress', 'onkeydown', 'onkeyup', 'onvisibilitychange', 'onmousedown', 'onmouseup', 'onmousewheel', 'onwheel', 'onmouseenter', 'onmousemove', 'onmouseover', 'onmouseout', 'onmouseleave', 'ongotpointercapture', 'onlostpointercapture', 'onpointerdown', 'onpointerrawupdate', 'onpointerup', 'onpointerenter', 'onpointermove', 'onpointerover', 'onpointerout', 'onpointerleave', 'onpointercancel', 'onfocus', 'onfocusin', 'onfocusout', 'onblur'];
        for (let i of all_events) {
            Object.defineProperty(element, i,
                {
                    get: () => { return (event) => false; },
                    set: (value) => { if (value !== null) { console.debug('Prevent to set property'); } }
                }
            );
        }
    };
    let allowElement = function (element) {
        // 取消通过 JavaScript 实现的禁止复制
        try { element.onbeforecopy = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforecopy'); }
        try { element.oncopy = null; } catch (error) { logError(error); } finally { allowEvent(element, 'copy'); }
        // 取消通过 JavaScript 实现的禁止剪切实现的禁止复制
        try { element.onbeforecut = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforecut'); }
        try { element.oncut = null; } catch (error) { logError(error); } finally { allowEvent(element, 'cut'); }
        // 取消通过 JavaScript 实现的禁止粘贴
        try { element.onbeforepaste = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforepaste'); }
        try { element.onpaste = null; } catch (error) { logError(error); } finally { allowEvent(element, 'paste'); }
        // 取消通过 JavaScript 实现的禁止文字选择
        try { element.onselectstart = null; } catch (error) { logError(error); } finally { allowEvent(element, 'selectstart'); }
        // 取消通过 JavaScript 实现的禁止右键菜单
        try { element.oncontextmenu = null; } catch (error) { logError(error); } finally { allowEvent(element, 'contextmenu'); }
        // 取消通过 JavaScript 实现的禁止拖动
        try { element.ondragstart = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragstart'); }
        try { element.ondragenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragenter'); }
        try { element.ondragover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragover'); }
        try { element.ondragleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragleave'); }
        try { element.ondragend = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragend'); }
        // try { element.ondrop = null; } catch (error) { logError(error); } finally { allowEvent(element, 'drop'); }
        // 取消通过 CSS 实现的禁止选中
        try { element.style.mozUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
        try { element.style.webkitUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
        try { element.style.msUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
        try { element.style.userSelect = 'auto'; } catch (error) { logError(error); } finally { }
        // 取消通过 JavaScript 实现的禁用快捷键
        try { element.onkeypress = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keypress'); }
        try { element.onkeydown = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keydown'); }
        try { element.onkeyup = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keyup'); }
        // 取消通过 JavaScript 实现的页面离开检测
        try { element.onvisibilitychange = null; } catch (error) { logError(error); } finally { allowEvent(element, 'visibilitychange'); }
        // 取消通过 JavaScript 实现的鼠标离开检测
        // try { element.onmousedown = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousedown'); }
        // try { element.onmouseup = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseup'); }
        // try { element.onmousewheel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousewheel'); }
        // try { element.onwheel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'wheel'); }
        // try { element.onmouseenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseenter'); }
        // try { element.onmousemove = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousemove'); }
        // try { element.onmouseover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseover'); }
        try { element.onmouseout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseout'); }
        try { element.onmouseleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseleave'); }
        // 取消通过 JavaScript 实现的指针离开检测
        // try { element.ongotpointercapture = null; } catch (error) { logError(error); } finally { allowEvent(element, 'gotpointercapture'); }
        try { element.onlostpointercapture = null; } catch (error) { logError(error); } finally { allowEvent(element, 'lostpointercapture'); }
        // try { element.onpointerdown = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerdown'); }
        // try { element.onpointerrawupdate = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerrawupdate'); }
        try { element.onpointerup = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerup'); }
        // try { element.onpointerenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerenter'); }
        // try { element.onpointermove = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointermove'); }
        // try { element.onpointerover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerover'); }
        try { element.onpointerout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerout'); }
        try { element.onpointerleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerleave'); }
        try { element.onpointercancel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointercancel'); }
        // 取消通过 JavaScript 实现的焦点离开检测
        try { element.onfocus = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focus'); }
        try { element.onfocusin = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focusin'); }
        try { element.onfocusout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focusout'); }
        try { element.onblur = null; } catch (error) { logError(error); } finally { allowEvent(element, 'blur'); }
        // 取消通过 HTML 实现的表单项禁用/禁止修改
        try { if (element instanceof Element && element.hasAttribute('disabled')) { element.removeAttribute('disabled'); } } catch (error) { logError(error); } finally { }
        try { if (element instanceof Element && element.hasAttribute('readonly')) { element.removeAttribute('readonly'); } } catch (error) { logError(error); } finally { }
        // 防止 JavaScript 事件检测
        preventEventChecks(element);
    };
    let allowElementRecursion = function (element) {
        allowElement(element);
        for (let i of element.children) { allowElementRecursion(i); }
    };
    // let removeAllListeners = function (old_element) {
    //     let new_element = old_element.cloneNode(true);
    //     old_element.parentNode.replaceChild(new_element, old_element);
    // };
    let removeHiddenElements = function (element, recursion) {
        if ((element.hidden || element.style.display == 'none' || element.style.visibility == 'hidden' || ((element.style.height <= 0 || element.style.width <= 0) && element.style.overflow == 'hidden') && element.children.length <= 0)) {
            console.info(`Remove <${element.tagName} id='${element.id}' class='${element.className}' />`);
            element.remove();
        } else if (recursion) { for (let i of element.children) { removeHiddenElements(i, recursion); } }
    };
    let getMainContainerElement = function () {
        // 获取正文节点
        let main_container_element = null;
        if (document) {
            if (main_container_element === null) { // 检查 main 标签
                let elements = document.getElementsByTagName('main');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 id='main' 的标签
                main_container_element = document.getElementById('main');
            }
            if (main_container_element === null) { // 检查 id='main-content' 的标签
                main_container_element = document.getElementById('main-content');
            }
            if (main_container_element === null) { // 检查 id='main-contents' 的标签
                main_container_element = document.getElementById('main-content');
            }
            if (main_container_element === null) { // 检查 id='content' 的标签
                main_container_element = document.getElementById('content');
            }
            if (main_container_element === null) { // 检查 id='contents' 的标签
                main_container_element = document.getElementById('contents');
            }
            if (main_container_element === null) { // 检查 class='main' 的标签
                let elements = document.getElementsByClassName('main');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='main-content' 的标签
                let elements = document.getElementsByClassName('content');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='main-contents' 的标签
                let elements = document.getElementsByClassName('content');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='content' 的标签
                let elements = document.getElementsByClassName('content');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='contents' 的标签
                let elements = document.getElementsByClassName('contents');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
        }
        return main_container_element;
    };

    // 对抗延迟运行(即在此脚本执行后运行)的禁用程序和循环执行的禁用程序,
    executeWithInterval( // 每 0.2 秒执行一次。
        (function () {
            if (document) {
                try { allowElement(document); } catch (error) { logError(error); } finally { }
            }
        }), 200
    );
    executeWithInterval( // 每 0.3 秒执行一次。
        (function () {
            if (document && document.body) {
                try { allowElement(document.body); } catch (error) { logError(error); } finally { }
            }
        }), 300
    );
    setTimeout(
        // 延迟 2.0 秒。
        function () {
            executeWithInterval( // 每 5.0 秒执行一次。
                (function () {
                    if (document && document.body) {
                        try { allowElementRecursion(document.body); } catch (error) { logError(error); } finally { }
                    }
                }), 5000
            );
        }, 2000
    );
    executeWithInterval( // 每 2.0 秒执行一次。
        (function () {
            let mce = getMainContainerElement();
            if (document && mce) {
                try { allowElementRecursion(mce); } catch (error) { logError(error); } finally { }
            }
        }), 2000
    );

    // 对抗延迟运行(即在此脚本执行后运行)的混淆程序和循环执行的混淆程序,
    setTimeout(
        // 延迟 1.0 秒,有助于动态加载的内容的显示。
        function () {
            executeWithInterval(
                // 每 3.0 秒执行一次。
                function () {
                    if (document) {
                        // 移除正文中的不可见元素
                        try {
                            let mce = getMainContainerElement();
                            // 移除不可见元素
                            if (mce) { removeHiddenElements(mce, true); }
                        } catch (error) { logError(error); } finally { }
                    }
                }, 3000
            );
        }, 1000
    );
    /*
    // 安装 Service Worker 以过滤请求
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker
            .register(
                'https://cdn.jsdelivr.net/gh/HL-Bo/user-script/remove-limits/service-worker.js',
                { scope: window.location.origin + window.location.pathname }
            )
            .then((registration) => {
                if (in_frame) {
                    console.debug(`Register service worker for ${registration.scope} (IN-FRAME)`);
                } else { console.info(`Register service worker for ${registration.scope}`); }
            })
            .catch((error) => { logError(error); });
    }
    */
    if (in_frame) {
        console.debug('Complete the installation of user-script/remove-limits (IN-FRAME)');
    } else { console.info('Complete the installation of user-script/remove-limits'); }
})();// ==UserScript==
// @name                 Remove Restrictions and Restore Default Behavior
// @name:zh-CN           解除网页限制,恢复默认行为
// @name:zh-TW           解除網頁限制,恢復默認行為
// @name:ja-JP           Webページの制限を削除し、デフォルトの動作に戻す
// @name:ko-KR           웹 페이지 제한 제거 및 기본 동작 복원
// @name:en-US           Remove Restrictions and Restore Default Behavior
// @name:fr-FR           Supprimer les restrictions de page Web et restaurer le comportement par défaut
// @name:de-DE           Entfernen von Webseiteneinschränkungen und Wiederherstellen des Standardverhaltens
// @name:it-IT           Rimuovi le restrizioni delle pagine Web e ripristina il comportamento predefinito
// @name:pt-BR           Remover restrições de página da Web e restaurar o comportamento padrão
// @name:es-ES           Levantar las restricciones de la página web y restaurar el comportamiento predeterminado
// @namespace            http://hl-bo.github.io/namespaces/user-script/remove-limits
// @source               https://github.com/HL-Bo/user-script
// @supportURL           https://github.com/HL-Bo/user-script/issues
// @version              2.5
// @license              AGPLv3
// @description          Allows you select, cut, copy, paste, save and open the DevTools on any website.
// @description:zh-CN    恢复选择、剪切、复制、粘贴、保存、右键菜单和打开开发者工具的默认行为。
// @description:en-US    Allows you select, cut, copy, paste, save and open the DevTools on any website.
// @author               HL-Bo
// @match                *://*/**
// @exclude              *://vscode.dev
// @exclude              *://vscode.dev/**
// @exclude              *://*.github.dev
// @exclude              *://*.github.dev/**
// @exclude              *://github.com/*/*/edit/**
// @exclude              *://gitee.com/*/*/edit/**
// @exclude              *://codeberg.org/*/*/_edit/**
// @exclude              *://www.figma.com/file/**
// @exclude              *://www.notion.so/**
// @exclude              *://outlook.live.com/**
// @exclude              *://mail.netease.com/**
// @exclude              *://mail.163.com/**
// @exclude              *://mail.126.com/**
// @exclude              *://www.yeah.net/**
// @exclude              *://mail.qq.com/**
// @exclude              *://uutool.cn/*
// @exclude              *://anytexteditor.com/*/online-notepad
// @exclude              *://*.zhihuishu.com/**
// @exclude              *://localhost
// @exclude              *://localhost:*
// @exclude              *://localhost/**
// @exclude              *://localhost:*/**
// @exclude              *://127.0.0.1
// @exclude              *://127.0.0.1:*
// @exclude              *://127.0.0.1/**
// @exclude              *://127.0.0.1:*/**
// @icon                 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAspJREFUWEfVl89PE1EQx7/TdpcabKFAoEKQH22ktEYSqRevXiRijEr8cSDe/DNM9D/xhPFn4oF4MeBZuJi0SiiQikTjD2gLCLS7jNmFLt2mu/uWYtB36G73zWQ+b2bevDeEijE5Od/Q3ut5CNA9gMOVc3bvG7+3MLeYRU9nhxqP9r2WURoPh8ObIvpUKTSbzkww6I6IYqWMAdAVxmCkF8z8zk/KFREIA2BmbilGu7tpZpigRGCqATQdAk3LKI46QRjGZtOZ6wx6KWKwWqYWgCbDzNN+UmwhDID3HxduEuP5UQKIQPx1gDJEnpTRoRqJaQnw/dcqVvPrANf2iST50N/dCSKCVQjMmjyVg3K1GsISILvyFT/X8pYRkXw+nD3TD4/HIwigp+ZUDkUThG0I9MVbeIAq9srW9g7SmSW0t4ZwPjHglEZvf3xZGkkmk6W93bI/qpNQUVVs7xRtPOBFgyzr88yM1PwidoolRE53oS3UbAuhMo8Mx/re2ALMZ5dRWLcuZlrsh2JReL1e3ZiWB5nsMlR118kDII/39v2xy09tAQobm8jrALVjIEsSOtpaTMZKioLVXAHaU/OK1fAAt65duvjMFsBxGXUIMGHswmDkhS2AtpK1wnodZg5UQ8EAWpqDxgchgIXPK8gdEUBzMKAnZ3kIAWgxLCmq9T4U9g1B8nn1gvV/ARx7CI49CYVDfAhBoSR0KkTidglNgUYETza6S0KtrO5VwvqHBhDt6XYH4HQYucHyN8jw7Z8Z+uElUgl1QePHjbkqWao4cvenhACcLiRukNpCTejpOuUuBE5XMmEAAlqaAmhvPTg5hTwgbOAQgv8mQD2NiVsnEPjGcDz6ynQfmPkwFyPJd6jWzA0AEZhLSjx5buCTCUD7M5temGDAdXPqCgB4MhyP3C3rmBrRVColb5H/kdv2XAyAvgH8+ARvP0gkEsZ1+w+ixcUwoQ+80AAAAABJRU5ErkJggg==
// @grant                none
// @run-at               document-start
// ==/UserScript==

(function () {
    'use strict';
    let in_frame = false;
    if (window.frameElement && window.frameElement.tagName === 'IFRAME' || window !== window.top) { in_frame = true; }
    if (!in_frame) {
        console.log(
            "  ____                                              _       _               _   _         \n" +
            " |  _ \\    ___   _ __ ___     ___   __   __   ___  | |     (_)  _ __ ___   (_) | |_   ___ \n" +
            " | |_) |  / _ \\ | '_ ` _ \\   / _ \\  \\ \\ / /  / _ \\ | |     | | | '_ ` _ \\  | | | __| / __|\n" +
            " |  _ <  |  __/ | | | | | | | (_) |  \\ V /  |  __/ | |___  | | | | | | | | | | | |_  \\__ \\\n" +
            " |_| \\_\\  \\___| |_| |_| |_|  \\___/    \\_/    \\___| |_____| |_| |_| |_| |_| |_|  \\__| |___/\n" +
            "                                                                                          \n" +
            " By HL-Bo"
        );
    }
    if (in_frame) {
        console.debug('Start the installation of user-script/remove-limits (IN-FRAME)');
    } else { console.info('Start the installation of user-script/remove-limits'); }

    // 尝试禁用 debugger
    // 仅在 eval('debugger') 或 setInterval('debugger', sec) 构造前执行才能阻止
    try {
        Function.prototype.$rl_constructor = Function.prototype.constructor;
        Function.prototype.constructor = function () {
            if (arguments && typeof arguments[0] === 'string') {
                if ('debugger' === arguments[0]) {
                    console.debug('Disable an function which may execute debugger');
                    return;
                }
            }
            return Function.prototype.$rl_constructor.apply(this, arguments);
        };
    } catch (error) { console.warn(error); } finally { }
    // 防止清空控制台
    console.$rl_clear = console.clear;
    console.clear = function () { };

    let logError = function (error) {
        let error_message = error.toString();
        if (document && document.body) {
            if (document.body.$rl_errors) {
                if (!document.body.$rl_errors.includes(error_message)) {
                    if (in_frame) { console.debug(error_message); } else { console.warn(error_message); }
                    document.body.$rl_errors.push(error_message);
                }
            } else { document.body.$rl_errors = new Array(); }
        }
    };
    let executeWithInterval = function (func, delay) {
        setTimeout(func, 0); // 异步执行,防止阻塞
        setInterval(func, delay);
    };
    let setEventListener = function (element, event_name, listener) {
        if (!element.$rl_lazy_events) { element.$rl_lazy_events = new Map(); }
        if (!element.$rl_events) { element.$rl_events = new Map(); }
        if (!element.$rl_lazy_events.has(event_name)) {
            element.$rl_lazy_events.set(event_name, listener);
            element.addEventListener(event_name, listener);
        }
        if (!element.$rl_events.has(event_name)) {
            element.removeEventListener(event_name, element.$rl_events.get(event_name));
            element.$rl_events.set(event_name, listener);
            element.addEventListener(event_name, listener);
        }
    };
    let copyEventType = function (old_event) {
        /*
        Event
        +-- ClipboardEvent (cut, copy, paste)
        +-- UIEvent
            +-- FocusEvent (focus, blur, focusin, focusout, ...)
            +-- InputEvent
            +-- CompositionEvent (compositionstart, compositionupdate, compositionend, ...)
            +-- KeyboardEvent (keydown, keypress, keyup)
            +-- TouchEvent
            +-- MouseEvent (click, dblclick, mouseup, mousedown, ...)
                +-- PointerEvent
                +-- WheelEvent
        */
        let new_event_type = Event;
        if (old_event instanceof ClipboardEvent) { new_event_type = ClipboardEvent; }
        if (old_event instanceof UIEvent) { new_event_type = UIEvent; }
        if (old_event instanceof FocusEvent) { new_event_type = FocusEvent; }
        if (old_event instanceof InputEvent) { new_event_type = InputEvent; }
        if (old_event instanceof CompositionEvent) { new_event_type = CompositionEvent; }
        if (old_event instanceof KeyboardEvent) { new_event_type = KeyboardEvent; }
        if (old_event instanceof TouchEvent) { new_event_type = TouchEvent; }
        if (old_event instanceof MouseEvent) { new_event_type = MouseEvent; }
        if (old_event instanceof PointerEvent) { new_event_type = PointerEvent; }
        if (old_event instanceof WheelEvent) { new_event_type = WheelEvent; }
        return new_event_type;
    };
    let copyEventAttr = function (old_event) {
        let new_event_init_dict = {};
        new_event_init_dict.cancelable = false;
        if (old_event.bubbles) { new_event_init_dict.bubbles = old_event.bubbles; } // Event
        if (old_event.composed) { new_event_init_dict.composed = old_event.composed; } // Event
        if (old_event.detail) { new_event_init_dict.detail = old_event.detail; } // UIEvent
        if (old_event.view) { new_event_init_dict.view = old_event.view; } // UIEvent
        if (old_event.sourceCapabilities) { new_event_init_dict.sourceCapabilities = old_event.sourceCapabilities; } // UIEvent
        if (old_event.relatedTarget) { new_event_init_dict.relatedTarget = old_event.relatedTarget; } // FocusEvent
        if (old_event.screenX) { new_event_init_dict.screenX = old_event.screenX; } // MouseEvent
        if (old_event.screenY) { new_event_init_dict.screenY = old_event.screenY; } // MouseEvent
        if (old_event.clientX) { new_event_init_dict.clientX = old_event.clientX; } // MouseEvent
        if (old_event.clientY) { new_event_init_dict.screenX = old_event.clientY; } // MouseEvent
        if (old_event.key) { new_event_init_dict.key = old_event.key; } // KeyboardEvent
        if (old_event.code) { new_event_init_dict.code = old_event.code; } // KeyboardEvent
        if (old_event.location) { new_event_init_dict.location = old_event.location; } // KeyboardEvent
        if (old_event.touches) { new_event_init_dict.touches = old_event.touches; } // TouchEvent
        if (old_event.targetTouches) { new_event_init_dict.targetTouches = old_event.targetTouches; } // TouchEvent
        if (old_event.changedTouches) { new_event_init_dict.changedTouches = old_event.changedTouches; } // TouchEvent
        if (old_event.ctrlKey) { new_event_init_dict.ctrlKey = old_event.ctrlKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.shiftKey) { new_event_init_dict.shiftKey = old_event.shiftKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.altKey) { new_event_init_dict.altKey = old_event.altKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.metaKey) { new_event_init_dict.metaKey = old_event.metaKey; } // MouseEvent & KeyboardEvent & TouchEvent
        if (old_event.repeat) { new_event_init_dict.repeat = old_event.repeat; } // KeyboardEvent
        if (old_event.inputType) { new_event_init_dict.inputType = old_event.inputType; } // InputEvent
        if (old_event.isComposing) { new_event_init_dict.isComposing = old_event.isComposing; } // KeyboardEvent & InputEvent
        if (old_event.charCode) { new_event_init_dict.charCode = old_event.charCode; } // KeyboardEvent
        if (old_event.keyCode) { new_event_init_dict.keyCode = old_event.keyCode; } // KeyboardEvent
        if (old_event.which) { new_event_init_dict.which = old_event.which; } // KeyboardEvent
        if (old_event.button) { new_event_init_dict.button = old_event.button; } // MouseEvent
        if (old_event.buttons) { new_event_init_dict.buttons = old_event.buttons; } // MouseEvent
        if (old_event.relatedTarget) { new_event_init_dict.relatedTarget = old_event.relatedTarget; } // MouseEvent
        if (old_event.region) { new_event_init_dict.region = old_event.region; } // MouseEvent
        if (old_event.deltaX) { new_event_init_dict.deltaX = old_event.deltaX; } // WheelEvent
        if (old_event.deltaY) { new_event_init_dict.deltaY = old_event.deltaY; } // WheelEvent
        if (old_event.deltaZ) { new_event_init_dict.deltaZ = old_event.deltaZ; } // WheelEvent
        if (old_event.deltaMode) { new_event_init_dict.deltaMode = old_event.deltaMode; } // WheelEvent
        if (old_event.pointerId) { new_event_init_dict.pointerId = old_event.pointerId; } // PointerEvent
        if (old_event.width) { new_event_init_dict.width = old_event.width; } // PointerEvent
        if (old_event.height) { new_event_init_dict.height = old_event.height; } // PointerEvent
        if (old_event.pressure) { new_event_init_dict.pressure = old_event.pressure; } // PointerEvent
        if (old_event.tangentialPressure) { new_event_init_dict.tangentialPressure = old_event.tangentialPressure; } // PointerEvent
        if (old_event.tiltX) { new_event_init_dict.tiltX = old_event.tiltX; } // PointerEvent
        if (old_event.tiltY) { new_event_init_dict.tiltY = old_event.tiltY; } // PointerEvent
        if (old_event.twist) { new_event_init_dict.twist = old_event.twist; } // PointerEvent
        if (old_event.pointerType) { new_event_init_dict.pointerType = old_event.pointerType; } // PointerEvent
        if (old_event.isPrimary) { new_event_init_dict.isPrimary = old_event.isPrimary; } // PointerEvent
        if (old_event.dataTransfer) { new_event_init_dict.dataTransfer = old_event.dataTransfer; } // DragEvent
        if (old_event.clipboardData) { new_event_init_dict.clipboardData = old_event.clipboardData; } // ClipboardEvent
        if (old_event.dataType) { new_event_init_dict.dataType = old_event.dataType; } // ClipboardEvent
        if (old_event.data) { new_event_init_dict.data = old_event.data; } // ClipboardEvent & InputEvent & CompositionEvent
        return new_event_init_dict;
    };
    let copyEvent = function (old_event) {
        let event_type = copyEventType(old_event);
        let event_init = copyEventAttr(old_event);
        let new_event = new event_type(old_event.type, event_init);
        return new_event;
    };
    let returnEventAllowed = function (event) {
        if (event.defaultPrevented) {
            // 如果调用了 Event.preventDefault() ,则重新构建一个不可取消的事件。
            event.stopPropagation(); // 停止原事件冒泡,以防重复新建事件。
            let new_event = copyEvent(event);
            if (event.target) { event.target.dispatchEvent(new_event); } else { event.currentTarget.dispatchEvent(new_event); }
            event = new_event;
        }
        event.stopImmediatePropagation(); // 防止其它事件处理器被调用
        try { event.returnValue = true; } catch (error) { logError(error); } finally { }
        if (event.currentTarget === document) { console.debug(`Allow ${event.type}`); }
    };
    let allowEvent = function (element, event_name) {
        setEventListener(element, event_name, function (event) { returnEventAllowed(event); return true; });
    };
    let onKeyEvents = function (event) {
        let keyCode = event.keyCode || event.which || event.charCode;
        let ctrlKey = event.ctrlKey || event.metaKey;
        let shiftKey = event.shiftKey;
        if (ctrlKey && (keyCode == 65 || keyCode == 88 || keyCode == 67 || keyCode == 86 || keyCode == 83 || keyCode == 85)) {
            // Ctrl+A (select-all), Ctrl+X (cut), Ctrl+C (copy), Ctrl+V (paste), Ctrl+S (save), Ctrl+U (view-source)
            returnEventAllowed(event);
        } else if (ctrlKey && shiftKey && (keyCode == 73 || keyCode == 74 || keyCode == 67)) {
            // Ctrl+Shift+I (devtools), Ctrl+Shift+J (console), Ctrl+Shift+C (elements)
            returnEventAllowed(event);
        } else if (keyCode && keyCode == 123) { // F12
            returnEventAllowed(event);
        }
        return true;
    };
    let allowKeyEvents = function (element, event_name) {
        setEventListener(element, event_name, onKeyEvents);
    };
    let preventEventChecks = function (element) {
        let all_events = ['onbeforecopy', 'oncopy', 'onbeforecut', 'oncut', 'onbeforepaste', 'onpaste', 'onselectstart', 'oncontextmenu', 'ondragstart', 'ondragenter', 'ondragover', 'ondragleave', 'ondragend', 'ondrop', 'onkeypress', 'onkeydown', 'onkeyup', 'onvisibilitychange', 'onmousedown', 'onmouseup', 'onmousewheel', 'onwheel', 'onmouseenter', 'onmousemove', 'onmouseover', 'onmouseout', 'onmouseleave', 'ongotpointercapture', 'onlostpointercapture', 'onpointerdown', 'onpointerrawupdate', 'onpointerup', 'onpointerenter', 'onpointermove', 'onpointerover', 'onpointerout', 'onpointerleave', 'onpointercancel', 'onfocus', 'onfocusin', 'onfocusout', 'onblur'];
        for (let i of all_events) {
            Object.defineProperty(element, i,
                {
                    get: () => { return (event) => false; },
                    set: (value) => { if (value !== null) { console.debug('Prevent to set property'); } }
                }
            );
        }
    };
    let allowElement = function (element) {
        // 取消通过 JavaScript 实现的禁止复制
        try { element.onbeforecopy = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforecopy'); }
        try { element.oncopy = null; } catch (error) { logError(error); } finally { allowEvent(element, 'copy'); }
        // 取消通过 JavaScript 实现的禁止剪切实现的禁止复制
        try { element.onbeforecut = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforecut'); }
        try { element.oncut = null; } catch (error) { logError(error); } finally { allowEvent(element, 'cut'); }
        // 取消通过 JavaScript 实现的禁止粘贴
        try { element.onbeforepaste = null; } catch (error) { logError(error); } finally { allowEvent(element, 'beforepaste'); }
        try { element.onpaste = null; } catch (error) { logError(error); } finally { allowEvent(element, 'paste'); }
        // 取消通过 JavaScript 实现的禁止文字选择
        try { element.onselectstart = null; } catch (error) { logError(error); } finally { allowEvent(element, 'selectstart'); }
        // 取消通过 JavaScript 实现的禁止右键菜单
        try { element.oncontextmenu = null; } catch (error) { logError(error); } finally { allowEvent(element, 'contextmenu'); }
        // 取消通过 JavaScript 实现的禁止拖动
        try { element.ondragstart = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragstart'); }
        try { element.ondragenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragenter'); }
        try { element.ondragover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragover'); }
        try { element.ondragleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragleave'); }
        try { element.ondragend = null; } catch (error) { logError(error); } finally { allowEvent(element, 'dragend'); }
        // try { element.ondrop = null; } catch (error) { logError(error); } finally { allowEvent(element, 'drop'); }
        // 取消通过 CSS 实现的禁止选中
        try { element.style.mozUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
        try { element.style.webkitUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
        try { element.style.msUserSelect = 'auto'; } catch (error) { logError(error); } finally { }
        try { element.style.userSelect = 'auto'; } catch (error) { logError(error); } finally { }
        // 取消通过 JavaScript 实现的禁用快捷键
        try { element.onkeypress = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keypress'); }
        try { element.onkeydown = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keydown'); }
        try { element.onkeyup = null; } catch (error) { logError(error); } finally { allowKeyEvents(element, 'keyup'); }
        // 取消通过 JavaScript 实现的页面离开检测
        try { element.onvisibilitychange = null; } catch (error) { logError(error); } finally { allowEvent(element, 'visibilitychange'); }
        // 取消通过 JavaScript 实现的鼠标离开检测
        // try { element.onmousedown = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousedown'); }
        // try { element.onmouseup = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseup'); }
        // try { element.onmousewheel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousewheel'); }
        // try { element.onwheel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'wheel'); }
        // try { element.onmouseenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseenter'); }
        // try { element.onmousemove = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mousemove'); }
        // try { element.onmouseover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseover'); }
        try { element.onmouseout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseout'); }
        try { element.onmouseleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'mouseleave'); }
        // 取消通过 JavaScript 实现的指针离开检测
        // try { element.ongotpointercapture = null; } catch (error) { logError(error); } finally { allowEvent(element, 'gotpointercapture'); }
        try { element.onlostpointercapture = null; } catch (error) { logError(error); } finally { allowEvent(element, 'lostpointercapture'); }
        // try { element.onpointerdown = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerdown'); }
        // try { element.onpointerrawupdate = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerrawupdate'); }
        try { element.onpointerup = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerup'); }
        // try { element.onpointerenter = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerenter'); }
        // try { element.onpointermove = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointermove'); }
        // try { element.onpointerover = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerover'); }
        try { element.onpointerout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerout'); }
        try { element.onpointerleave = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointerleave'); }
        try { element.onpointercancel = null; } catch (error) { logError(error); } finally { allowEvent(element, 'pointercancel'); }
        // 取消通过 JavaScript 实现的焦点离开检测
        try { element.onfocus = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focus'); }
        try { element.onfocusin = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focusin'); }
        try { element.onfocusout = null; } catch (error) { logError(error); } finally { allowEvent(element, 'focusout'); }
        try { element.onblur = null; } catch (error) { logError(error); } finally { allowEvent(element, 'blur'); }
        // 取消通过 HTML 实现的表单项禁用/禁止修改
        try { if (element instanceof Element && element.hasAttribute('disabled')) { element.removeAttribute('disabled'); } } catch (error) { logError(error); } finally { }
        try { if (element instanceof Element && element.hasAttribute('readonly')) { element.removeAttribute('readonly'); } } catch (error) { logError(error); } finally { }
        // 防止 JavaScript 事件检测
        preventEventChecks(element);
    };
    let allowElementRecursion = function (element) {
        allowElement(element);
        for (let i of element.children) { allowElementRecursion(i); }
    };
    // let removeAllListeners = function (old_element) {
    //     let new_element = old_element.cloneNode(true);
    //     old_element.parentNode.replaceChild(new_element, old_element);
    // };
    let removeHiddenElements = function (element, recursion) {
        if ((element.hidden || element.style.display == 'none' || element.style.visibility == 'hidden' || ((element.style.height <= 0 || element.style.width <= 0) && element.style.overflow == 'hidden') && element.children.length <= 0)) {
            console.info(`Remove <${element.tagName} id='${element.id}' class='${element.className}' />`);
            element.remove();
        } else if (recursion) { for (let i of element.children) { removeHiddenElements(i, recursion); } }
    };
    let getMainContainerElement = function () {
        // 获取正文节点
        let main_container_element = null;
        if (document) {
            if (main_container_element === null) { // 检查 main 标签
                let elements = document.getElementsByTagName('main');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 id='main' 的标签
                main_container_element = document.getElementById('main');
            }
            if (main_container_element === null) { // 检查 id='main-content' 的标签
                main_container_element = document.getElementById('main-content');
            }
            if (main_container_element === null) { // 检查 id='main-contents' 的标签
                main_container_element = document.getElementById('main-content');
            }
            if (main_container_element === null) { // 检查 id='content' 的标签
                main_container_element = document.getElementById('content');
            }
            if (main_container_element === null) { // 检查 id='contents' 的标签
                main_container_element = document.getElementById('contents');
            }
            if (main_container_element === null) { // 检查 class='main' 的标签
                let elements = document.getElementsByClassName('main');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='main-content' 的标签
                let elements = document.getElementsByClassName('content');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='main-contents' 的标签
                let elements = document.getElementsByClassName('content');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='content' 的标签
                let elements = document.getElementsByClassName('content');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
            if (main_container_element === null) { // 检查 class='contents' 的标签
                let elements = document.getElementsByClassName('contents');
                if (elements.length > 0) { main_container_element = elements[0]; }
            }
        }
        return main_container_element;
    };

    // 对抗延迟运行(即在此脚本执行后运行)的禁用程序和循环执行的禁用程序,
    executeWithInterval( // 每 0.2 秒执行一次。
        (function () {
            if (document) {
                try { allowElement(document); } catch (error) { logError(error); } finally { }
            }
        }), 200
    );
    executeWithInterval( // 每 0.3 秒执行一次。
        (function () {
            if (document && document.body) {
                try { allowElement(document.body); } catch (error) { logError(error); } finally { }
            }
        }), 300
    );
    setTimeout(
        // 延迟 2.0 秒。
        function () {
            executeWithInterval( // 每 5.0 秒执行一次。
                (function () {
                    if (document && document.body) {
                        try { allowElementRecursion(document.body); } catch (error) { logError(error); } finally { }
                    }
                }), 5000
            );
        }, 2000
    );
    executeWithInterval( // 每 2.0 秒执行一次。
        (function () {
            let mce = getMainContainerElement();
            if (document && mce) {
                try { allowElementRecursion(mce); } catch (error) { logError(error); } finally { }
            }
        }), 2000
    );

    // 对抗延迟运行(即在此脚本执行后运行)的混淆程序和循环执行的混淆程序,
    setTimeout(
        // 延迟 1.0 秒,有助于动态加载的内容的显示。
        function () {
            executeWithInterval(
                // 每 3.0 秒执行一次。
                function () {
                    if (document) {
                        // 移除正文中的不可见元素
                        try {
                            let mce = getMainContainerElement();
                            // 移除不可见元素
                            if (mce) { removeHiddenElements(mce, true); }
                        } catch (error) { logError(error); } finally { }
                    }
                }, 3000
            );
        }, 1000
    );
    /*
    // 安装 Service Worker 以过滤请求
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker
            .register(
                'https://cdn.jsdelivr.net/gh/HL-Bo/user-script/remove-limits/service-worker.js',
                { scope: window.location.origin + window.location.pathname }
            )
            .then((registration) => {
                if (in_frame) {
                    console.debug(`Register service worker for ${registration.scope} (IN-FRAME)`);
                } else { console.info(`Register service worker for ${registration.scope}`); }
            })
            .catch((error) => { logError(error); });
    }
    */
    if (in_frame) {
        console.debug('Complete the installation of user-script/remove-limits (IN-FRAME)');
    } else { console.info('Complete the installation of user-script/remove-limits'); }
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。