unlocks locked symbolab step-by-step instructions by overwriting XMLHttpRequest
当前为
// ==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);