diff --git a/common/modules/main.jsm b/common/modules/main.jsm index bc0a2da6..80e64a79 100644 --- a/common/modules/main.jsm +++ b/common/modules/main.jsm @@ -110,34 +110,49 @@ var Modules = function Modules(window) { const BASES = [BASE, "resource://dactyl-local-content/"]; - var traps = { - get: function window_get(target, prop) { - // `in`, not `hasOwnProperty`, because we want to return - // unbound methods in `Object.prototype` - if (prop in proxyCache) - return proxyCache[prop]; - - let p = target[prop]; - if (callable(p)) - return proxyCache[prop] = p.bind(target); - - return p; - }, - - set: function window_set(target, prop, val) { - return target[prop] = val; - } - }; - let proxyCache = {}; if (config.haveGecko(29)) - var proxy = new Proxy(window, traps); + var proxy = new Proxy(window, { + get: function window_get(target, prop) { + // `in`, not `hasOwnProperty`, because we want to return + // unbound methods in `Object.prototype` + if (prop in proxyCache) + return proxyCache[prop]; + + let p = target[prop]; + if (callable(p)) + return proxyCache[prop] = p.bind(target); + + return p; + }, + + set: function window_set(target, prop, val) { + return target[prop] = val; + } + }); else { // Bug 814892 let o = {}; // Oh, the brokenness... See bug 793210 Object.preventExtensions(o); - proxy = new Proxy(o, update(traps, { + proxy = new Proxy(o, { + get: function window_get(target, prop) { + // `in`, not `hasOwnProperty`, because we want to return + // unbound methods in `Object.prototype` + if (prop in proxyCache) + return proxyCache[prop]; + + let p = window[prop]; + if (callable(p)) + return proxyCache[prop] = p.bind(window); + + return p; + }, + + set: function window_set(target, prop, val) { + return window[prop] = val; + }, + getOwnPropertyDescriptor: function (target, prop) Object.getOwnPropertyDescriptor(window, prop), getOwnPropertyNames: function (target, prop) Object.getOwnPropertyNames(window), defineProperty: function (target, prop, desc) Object.defineProperty(window, prop, desc), @@ -146,7 +161,7 @@ var Modules = function Modules(window) { hasOwn: function (target, prop) hasOwnProperty(window, prop), enumerate: function (target) (p for (p in window)), iterate: function (target) (p for (p of window)) - })); + }); } var jsmodules = newContext(proxy, false, "Dactyl `jsmodules`");