Greasy Fork

Unlock locked steps in Symbolab

unlocks locked symbolab step-by-step instructions by overwriting XMLHttpRequest

目前为 2020-09-04 提交的版本。查看 最新版本

// ==UserScript==
// @name         Unlock locked steps in Symbolab
// @namespace    http://*.symbolab.com/*
// @version      1.01
// @description  unlocks locked symbolab step-by-step instructions by overwriting XMLHttpRequest
// @author       joseph
// @match        *://*.symbolab.com/*
// @grant        none
// ==/UserScript==

(function(open) {

    function patchResponseLoop(obj) {
        for (var k in obj)
        {
            if (typeof obj[k] == "object" && obj[k] !== null) {
                patchResponseLoop(obj[k]);
            } else {
                if (k == "isLocked") {
                    obj[k] = false;
                    console.log("<PATCH> keyMatch [isLocked] OVERRIDE => FALSE");
                }
            }
        }
    }

    var open_prototype = XMLHttpRequest.prototype.open,
        intercept_response = function(urlpattern, callback) {
            XMLHttpRequest.prototype.open = function() {
                arguments['1'].match(urlpattern) && this.addEventListener('readystatechange', function(event) {
                    if ( this.readyState === 4 ) {
                        var response = callback(event.target.responseText);
                        // allow intercepted responses to be written to
                        Object.defineProperty(this, 'response', {writable: true});
                        Object.defineProperty(this, 'responseText', {writable: true});

                        this.response = this.responseText = response;
                    }
                });
                return open_prototype.apply(this, arguments);
            };
        };

    intercept_response(/steps/i, function(response) {
        console.log("[intercept] match rq, current RES ", JSON.parse(response));

        var parsedO = JSON.parse(response);

        patchResponseLoop(parsedO);

        console.log("=== PATCHSET COMPLETE, enjoy ===");

        return JSON.stringify(parsedO);
    });

})(XMLHttpRequest.prototype.open);