Replaces Object.watch shim with polyfill by Eli Grey

Fixes issues where objects get hijacked by the shim.
This commit is contained in:
Roel Walraven 2016-08-04 15:20:23 +02:00
parent 211f9a5e1c
commit 309c9d90c8

View File

@ -418,34 +418,58 @@ window.checkArguments = function(args, length, types) {
* Object.watch shim * * Object.watch shim *
*******************************************************************************/ *******************************************************************************/
if(!Object.prototype.watch) { /*
Object.prototype.watch = function (prop, handler) { * object.watch polyfill
var oldval = this[prop]; *
var newval; * 2012-04-03
var getter = function() { *
return newval; * By Eli Grey, http://eligrey.com
}; * Public Domain.
var setter = function(val) { * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
oldval = newval; */
newval = handler.call(this, prop, oldval, val);
return newval;
};
if(delete this[prop]) { // object.watch
Object.defineProperty(this, prop, { if (!Object.prototype.watch) {
get: getter, Object.defineProperty(Object.prototype, "watch", {
set: setter enumerable: false,
}); configurable: true,
writable: false,
value: function(prop, handler) {
var oldval = this[prop],
newval = oldval,
getter = function () {
return newval;
},
setter = function (val) {
oldval = newval;
newval = handler.call(this, prop, oldval, val);
return newval;
};
if(delete this[prop]) { // can't watch constants
Object.defineProperty(this, prop, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
} }
}; });
} }
// object.unwatch
if(!Object.prototype.unwatch) { if(!Object.prototype.unwatch) {
Object.prototype.unwatch = function (prop) { Object.defineProperty(Object.prototype, "unwatch", {
var val = this[prop]; enumerable: false,
delete this[prop]; configurable: true,
this[prop] = val; writable: false,
}; value: function (prop) {
var val = this[prop];
delete this[prop]; // remove accessors
this[prop] = val;
}
});
} }
LightDMMock.watch('default_language', function() { LightDMMock.watch('default_language', function() {