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...