IE8 XHR hacking for TrackJS

Alas, it did not work! :'(

by James Greene

CSS

h1 {
    color: green;
}
h2 {
    color: red;
}

JavaScript

if (window.ProgressEvent && (XMLHttpRequest.addEventListener || (new XMLHttpRequest()).addEventListener)) {
    document.body.innerHTML = "<h1>Using a modern browser, no need to hack XHR</h1>";
} else if (!Object.defineProperty) {
    document.body.innerHTML = "<h2>No `Object.defineProperty`</h2>";
} else if (!Object.getOwnPropertyDescriptor) {
    document.body.innerHTML = "<h2>No `Object.getOwnPropertyDescriptor`</h2>";
} else {
    // START Feature Test
    var canOverrideXhrProtoMethods = false;
    var canOverrideXhrProtoProps = false;
    var errorMsg = "";
    try {
        var __proto__open_descriptor = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "open");
        Object.defineProperty(XMLHttpRequest.prototype, "open", {
            value: function (method, url, async, user, pass) {
                canOverrideXhrProtoMethods = true;

                var _memo = {
                    onreadystatechange: this.onreadystatechange
                };
                Object.defineProperty(this, "onreadystatechange", {
                    get: function () {
                        return _memo.onreadystatechange;
                    },
                    set: function (val) {
                        canOverrideXhrProtoProps = true;                        
                        _memo.onreadystatechange = val;
                    },
                    configurable: true
                });

                return __proto__open_descriptor.value(method, url, async, user, pass);
            },
            writable: true,
            configurable: true,
            enumerable: true
        });
        var xhr = new XMLHttpRequest();
        xhr.open("GET", window.location.href);


        var old = xhr.onreadystatechange;
        var dummy1 = function() {};
        xhr.onreadystatechange = dummy1;
        var canOverrideXhrProtoProps1 = canOverrideXhrProtoProps && xhr.onreadystatechange === dummy1;
        canOverrideXhrProtoProps = false;
        var...