1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 06:58:00 +01:00

Use Object.defineProperty instead of __defineGetter__/__defineSetter__

In Firefox 48+, the __defineSetter__/__defineSetter__ is deprecated,
so use Object.defineProperty instead.
This commit is contained in:
Zheng Chaoping
2016-05-04 20:00:59 +08:00
parent 1a4290d92a
commit 195ea78efb
20 changed files with 291 additions and 146 deletions

6
common/bootstrap.js vendored
View File

@@ -17,7 +17,11 @@ function module(uri) {
const DEBUG = true; const DEBUG = true;
__defineGetter__("BOOTSTRAP", () => "resource://" + moduleName + "/bootstrap.jsm"); Object.defineProperty(global, "BOOTSTRAP", {
get: () => "resource://" + moduleName + "/bootstrap.jsm",
enumerable: true,
configurable: true
});
var { AddonManager } = module("resource://gre/modules/AddonManager.jsm"); var { AddonManager } = module("resource://gre/modules/AddonManager.jsm");
var { XPCOMUtils } = module("resource://gre/modules/XPCOMUtils.jsm"); var { XPCOMUtils } = module("resource://gre/modules/XPCOMUtils.jsm");

View File

@@ -180,8 +180,16 @@ var CommandWidgets = Class("CommandWidgets", {
return (obj.getElement || identity)(map[id] || document.getElementById(prefix + id)); return (obj.getElement || identity)(map[id] || document.getElementById(prefix + id));
} }
this.active.__defineGetter__(obj.name, () => this.activeGroup[obj.name][obj.name]); Object.defineProperty(this.active, obj.name, {
this.activeGroup.__defineGetter__(obj.name, () => this.getGroup(obj.name)); get: () => this.activeGroup[obj.name][obj.name],
enumerable: true,
configurable: true,
});
Object.defineProperty(this.activeGroup, obj.name, {
get: () => this.getGroup(obj.name),
enumerable: true,
configurable: true,
});
memoize(this.statusbar, obj.name, () => get("dactyl-statusline-field-", statusline.widgets, (obj.id || obj.name))); memoize(this.statusbar, obj.name, () => get("dactyl-statusline-field-", statusline.widgets, (obj.id || obj.name)));
memoize(this.commandbar, obj.name, () => get("dactyl-", {}, (obj.id || obj.name))); memoize(this.commandbar, obj.name, () => get("dactyl-", {}, (obj.id || obj.name)));

View File

@@ -16,13 +16,17 @@ var Editor = Module("editor", XPCOM(Ci.nsIEditActionListener, ModuleBase), {
if (elem) if (elem)
this.element = elem; this.element = elem;
else else
this.__defineGetter__("element", () => { Object.defineProperty(this, "element", {
get: () => {
let elem = dactyl.focusedElement; let elem = dactyl.focusedElement;
if (elem) if (elem)
return elem.inputField || elem; return elem.inputField || elem;
let win = document.commandDispatcher.focusedWindow; let win = document.commandDispatcher.focusedWindow;
return DOM(win).isEditable && win || null; return DOM(win).isEditable && win || null;
},
enumerable: true,
configurable: true
}); });
}, },

View File

@@ -762,9 +762,13 @@ var Hints = Module("hints", {
events.listen(appContent, "scroll", this.resizeTimer.bound.tell, false); events.listen(appContent, "scroll", this.resizeTimer.bound.tell, false);
const Mode = Hints.Mode; const Mode = Hints.Mode;
Mode.prototype.__defineGetter__("matcher", function () { Object.defineProperty(Mode.prototype, "matcher", {
get() {
return options.get("extendedhinttags") return options.get("extendedhinttags")
.getKey(this.name, options.get("hinttags").matcher); .getKey(this.name, options.get("hinttags").matcher);
},
enumerable: true,
configurable: true
}); });
function cleanLoc(loc) { function cleanLoc(loc) {

View File

@@ -63,8 +63,12 @@ var History = Module("history", {
let sh = webNav.sessionHistory; let sh = webNav.sessionHistory;
let obj = []; let obj = [];
obj.__defineGetter__("index", () => sh.index); Object.defineProperty(obj, "index", {
obj.__defineSetter__("index", val => { webNav.gotoIndex(val); }); get: () => sh.index,
set: val => webNav.gotoIndex(val),
enumerable: true,
configurable: true
});
obj[Symbol.iterator] = function () { return this.entries(); }; obj[Symbol.iterator] = function () { return this.entries(); };
for (let item of iter(sh.SHistoryEnumerator, Ci.nsISHEntry)) for (let item of iter(sh.SHistoryEnumerator, Ci.nsISHEntry))

View File

@@ -26,8 +26,7 @@ try {
catch (e) {} catch (e) {}
let objproto = Object.prototype; let objproto = Object.prototype;
var { __lookupGetter__, __lookupSetter__, __defineGetter__, __defineSetter__, var { hasOwnProperty, propertyIsEnumerable } = objproto;
hasOwnProperty, propertyIsEnumerable } = objproto;
var hasOwnProp = Function.call.bind(hasOwnProperty); var hasOwnProp = Function.call.bind(hasOwnProperty);
@@ -780,7 +779,7 @@ function memoize(obj, key, getter) {
if (arguments.length == 1) { if (arguments.length == 1) {
let res = update(Object.create(obj), obj); let res = update(Object.create(obj), obj);
for (let prop of Object.getOwnPropertyNames(obj)) { for (let prop of Object.getOwnPropertyNames(obj)) {
let get = __lookupGetter__.call(obj, prop); let get = Object.getOwnPropertyDescriptor(obj, prop).get;
if (get) if (get)
memoize(res, prop, get); memoize(res, prop, get);
} }
@@ -847,8 +846,12 @@ function update(target) {
let func = desc.value.wrapped || desc.value; let func = desc.value.wrapped || desc.value;
if (!func.superapply) { if (!func.superapply) {
func.__defineGetter__("super", function get_super() { Object.defineProperty(func, "super", {
get: function get_super() {
return Object.getPrototypeOf(target)[k]; return Object.getPrototypeOf(target)[k];
},
enumerable: true,
configurable: true
}); });
func.superapply = function superapply(self, args) { func.superapply = function superapply(self, args) {
@@ -1169,7 +1172,11 @@ Class.prototype = {
if (typeof desc.value === "function") { if (typeof desc.value === "function") {
let func = desc.value.wrapped || desc.value; let func = desc.value.wrapped || desc.value;
if (!func.superapply) { if (!func.superapply) {
func.__defineGetter__("super", () => Object.getPrototypeOf(this)[k]); Object.defineProperty(func, "super", {
get: () => Object.getPrototypeOf(this)[k],
enumerable: true,
configurable: true
});
func.superapply = function superapply(self, args) { func.superapply = function superapply(self, args) {
let meth = Object.getPrototypeOf(self)[k]; let meth = Object.getPrototypeOf(self)[k];
@@ -1403,11 +1410,15 @@ function Struct(...args) {
members: Ary.toObject(args.map((v, k) => [v, k])), members: Ary.toObject(args.map((v, k) => [v, k])),
}); });
args.forEach(function (name, i) { args.forEach(function (name, i) {
Struct.prototype.__defineGetter__(name, function () { Object.defineProperty(Struct.prototype, name, {
get() {
return this[i]; return this[i];
}); },
Struct.prototype.__defineSetter__(name, function (val) { set(val) {
this[i] = val; this[i] = val;
},
enumerable: true,
configurable: true
}); });
}); });
return Struct; return Struct;
@@ -1467,11 +1478,15 @@ var StructBase = Class("StructBase", Array, {
*/ */
defaultValue: function defaultValue(key, val) { defaultValue: function defaultValue(key, val) {
let i = this.prototype.members[key]; let i = this.prototype.members[key];
this.prototype.__defineGetter__(i, function () { Object.defineProperty(this.prototype, i, {
get() {
return this[i] = val.call(this); return this[i] = val.call(this);
}); },
this.prototype.__defineSetter__(i, function (value) { set(value) {
return Class.replaceProperty(this, i, value); Class.replaceProperty(this, i, value);
},
enumerable: true,
configurable: true
}); });
return this; return this;
}, },

View File

@@ -61,7 +61,13 @@ update(Bookmark.prototype, {
} }
}); });
Bookmark.prototype.members.uri = Bookmark.prototype.members.url; Bookmark.prototype.members.uri = Bookmark.prototype.members.url;
Bookmark.setter = function (key, func) { return this.prototype.__defineSetter__(key, func); }; Bookmark.setter = function (key, func) {
return Object.defineProperty(this.prototype, key, {
set: func,
enumerable: true,
configurable: true
});
};
Bookmark.setter("url", function (val) { this.uri = isString(val) ? newURI(val) : val; }); Bookmark.setter("url", function (val) { this.uri = isString(val) ? newURI(val) : val; });
Bookmark.setter("title", function (val) { services.bookmarks.setItemTitle(this.id, val); }); Bookmark.setter("title", function (val) { services.bookmarks.setItemTitle(this.id, val); });
Bookmark.setter("post", function (val) { bookmarkcache.annotate(this.id, bookmarkcache.POST, val); }); Bookmark.setter("post", function (val) { bookmarkcache.annotate(this.id, bookmarkcache.POST, val); });

View File

@@ -62,8 +62,12 @@ var CompletionContext = Class("CompletionContext", {
["anchored", "compare", "editor", "_filter", "filterFunc", "forceAnchored", "top"] ["anchored", "compare", "editor", "_filter", "filterFunc", "forceAnchored", "top"]
.forEach(key => self[key] = parent[key]); .forEach(key => self[key] = parent[key]);
self.__defineGetter__("value", function get_value() { Object.defineProperty(self, "value", {
get() {
return this.top.value; return this.top.value;
},
enumerable: true,
configurable: true
}); });
self.offset = parent.offset; self.offset = parent.offset;
@@ -90,11 +94,15 @@ var CompletionContext = Class("CompletionContext", {
if (self != this) if (self != this)
return self; return self;
["_caret", "contextList", "maxItems", "onUpdate", "selectionTypes", "tabPressed", "updateAsync", "value"].forEach(function fe(key) { ["_caret", "contextList", "maxItems", "onUpdate", "selectionTypes", "tabPressed", "updateAsync", "value"].forEach(function fe(key) {
self.__defineGetter__(key, function () { Object.defineProperty(self, key, {
get() {
return this.top[key]; return this.top[key];
}); },
self.__defineSetter__(key, function (val) { set(val) {
this.top[key] = val; this.top[key] = val;
},
enumerable: true,
configurable: true
}); });
}); });
} }
@@ -175,19 +183,29 @@ var CompletionContext = Class("CompletionContext", {
* @property {CompletionContext} The top-level completion context. * @property {CompletionContext} The top-level completion context.
*/ */
this.top = this; this.top = this;
this.__defineGetter__("incomplete", function get_incomplete() { Object.defineProperties(this, {
"incomplete": {
get() {
return this._incomplete || return this._incomplete ||
this.contextList.some(c => c.parent && c.incomplete); this.contextList.some(c => c.parent && c.incomplete);
}); },
this.__defineGetter__("waitingForTab", function get_waitingForTab() { set(val) {
this._incomplete = val;
},
enumerable: true,
configurable: true
},
"waitingForTab": {
get() {
return this._waitingForTab || return this._waitingForTab ||
this.contextList.some(c => c.parent && c.waitingForTab); this.contextList.some(c => c.parent && c.waitingForTab);
}); },
this.__defineSetter__("incomplete", function get_incomplete(val) { set(val) {
this._incomplete = val;
});
this.__defineSetter__("waitingForTab", function get_waitingForTab(val) {
this._waitingForTab = val; this._waitingForTab = val;
},
enumerable: true,
configurable: true
}
}); });
this.reset(); this.reset();
} }
@@ -432,17 +450,22 @@ var CompletionContext = Class("CompletionContext", {
// This is only allowed to be a simple accessor, and shouldn't // This is only allowed to be a simple accessor, and shouldn't
// reference any variables. Don't bother with eval context. // reference any variables. Don't bother with eval context.
v = Function("i", "return i" + v); v = Function("i", "return i" + v);
let descriptor = {
enumerable: true,
configurable: true
};
if (typeof v == "function") if (typeof v == "function")
res.__defineGetter__(k, function p_gf() { descriptor.get = function p_gf() {
return Class.replaceProperty(this, k, v.call(this, this.item, self)); return Class.replaceProperty(this, k, v.call(this, this.item, self));
}); };
else else
res.__defineGetter__(k, function p_gp() { descriptor.get = function p_gp() {
return Class.replaceProperty(this, k, this.item[v]); return Class.replaceProperty(this, k, this.item[v]);
}); };
res.__defineSetter__(k, function p_s(val) { descriptor.set = function p_s(val) {
Class.replaceProperty(this, k, val); Class.replaceProperty(this, k, val);
}); };
Object.defineProperty(res, k, descriptor);
} }
return res; return res;
}, },
@@ -811,8 +834,12 @@ var CompletionContext = Class("CompletionContext", {
split: function split(name, obj, fn, ...args) { split: function split(name, obj, fn, ...args) {
let context = this.fork(name); let context = this.fork(name);
let alias = prop => { let alias = prop => {
context.__defineGetter__(prop, () => this[prop]); Object.defineProperty(context, prop, {
context.__defineSetter__(prop, val => this[prop] = val); get: () => this[prop],
set: val => this[prop] = val,
enumerable: true,
configurable: true,
});
}; };
alias("_cache"); alias("_cache");
alias("_completions"); alias("_completions");

View File

@@ -459,8 +459,12 @@ var Contexts = Module("contexts", {
group = this.Group(name, description, filter, persist); group = this.Group(name, description, filter, persist);
this.groupList.unshift(group); this.groupList.unshift(group);
this.groupMap[name] = group; this.groupMap[name] = group;
this.hiveProto.__defineGetter__(name, function () { Object.defineProperty(this.hiveProto, name, {
get() {
return group[this._hive]; return group[this._hive];
},
enumerable: true,
configurable: true
}); });
} }

View File

@@ -17,10 +17,11 @@ var Highlight = Struct("class", "selector", "sites",
"value", "extends", "agent", "value", "extends", "agent",
"base", "baseClass", "style"); "base", "baseClass", "style");
Highlight.liveProperty = function (name, prop) { Highlight.liveProperty = function (name, prop) {
this.prototype.__defineGetter__(name, function () { Object.defineProperty(this.prototype, name, {
get() {
return this.get(name); return this.get(name);
}); },
this.prototype.__defineSetter__(name, function (val) { set(val) {
if (isObject(val) && name !== "style") { if (isObject(val) && name !== "style") {
if (isArray(val)) if (isArray(val))
val = Array.slice(val); val = Array.slice(val);
@@ -38,6 +39,9 @@ Highlight.liveProperty = function (name, prop) {
this.style[prop || name] = this[prop || name]; this.style[prop || name] = this[prop || name];
if (this.onChange) if (this.onChange)
this.onChange(); this.onChange();
},
enumerable: true,
configurable: true,
}); });
}; };
Highlight.liveProperty("agent"); Highlight.liveProperty("agent");
@@ -155,7 +159,8 @@ var Highlights = Module("Highlight", {
if (!old && obj.base && obj.base.style.enabled) if (!old && obj.base && obj.base.style.enabled)
obj.style.enabled = true; obj.style.enabled = true;
else else
this.loaded.__defineSetter__(obj.class, function () { Object.defineProperty(this.loaded, obj.class, {
set() {
Object.defineProperty(this, obj.class, { Object.defineProperty(this, obj.class, {
value: true, value: true,
configurable: true, configurable: true,
@@ -168,6 +173,9 @@ var Highlights = Module("Highlight", {
if (h.baseClass === obj.class) if (h.baseClass === obj.class)
this[h.class] = true; this[h.class] = true;
obj.style.enabled = true; obj.style.enabled = true;
},
enumerable: true,
configurable: true
}); });
return obj; return obj;
}, },

View File

@@ -886,8 +886,11 @@ unlet s:cpo_save
sep = sep || " "; sep = sep || " ";
let width = 0; let width = 0;
let lines = []; let lines = [];
lines.__defineGetter__("last", function () { Object.defineProperty(lines, "last", {
get() {
return this[this.length - 1]; return this[this.length - 1];
},
configurable: true
}); });
for (let item of values(items.array || items)) { for (let item of values(items.array || items)) {

View File

@@ -253,15 +253,19 @@ overlay.overlayWindow(Object.keys(config.overlays),
this.initDependencies(className); this.initDependencies(className);
} }
else else
modules.__defineGetter__(className, () => { Object.defineProperty(modules, className, {
get: () => {
let module = modules.jsmodules[className]; let module = modules.jsmodules[className];
Class.replaceProperty(modules, className, module); Class.replaceProperty(modules, className, module);
if (module.reallyInit) if (module.reallyInit)
module.reallyInit(); // :( module.reallyInit(); // :(
if (!module.lazyDepends) if (!module.lazyDepends)
self.initDependencies(className); this.initDependencies(className);
return module; return module;
},
enumerable: true,
configurable: true,
}); });
}, this); }, this);
}, },
@@ -380,9 +384,12 @@ overlay.overlayWindow(Object.keys(config.overlays),
Module.list.forEach(mod => { Module.list.forEach(mod => {
if (!mod.frobbed) { if (!mod.frobbed) {
modules.__defineGetter__(mod.className, () => { Object.defineProperty(modules, mod.className, {
delete modules[mod.className]; get: () => {
return this.loadModule(mod.className, null, Components.stack.caller); return this.loadModule(mod.className, null, Components.stack.caller);
},
enumerable: true,
configurable: true
}); });
Object.keys(mod.prototype.INIT) Object.keys(mod.prototype.INIT)
.forEach(name => { this.deferInit(name, mod.prototype.INIT, mod); }); .forEach(name => { this.deferInit(name, mod.prototype.INIT, mod); });

View File

@@ -1060,11 +1060,15 @@ var Options = Module("options", {
memoize(this._options, this._options.length, closure); memoize(this._options, this._options.length, closure);
// quickly access options with options["wildmode"]: // quickly access options with options["wildmode"]:
this.__defineGetter__(name, function () { Object.defineProperty(this, name, {
get() {
return this._optionMap[name].value; return this._optionMap[name].value;
}); },
this.__defineSetter__(name, function (value) { set(value) {
this._optionMap[name].value = value; this._optionMap[name].value = value;
},
enumerable: true,
configurable: true
}); });
} }
}; };

View File

@@ -160,7 +160,7 @@ var Services = Module("Services", {
add: function add(name, class_, ifaces, meth) { add: function add(name, class_, ifaces, meth) {
const self = this; const self = this;
this.services[name] = { method: meth, class: class_, interfaces: Array.concat(ifaces || []) }; this.services[name] = { method: meth, class: class_, interfaces: Array.concat(ifaces || []) };
if (name in this && ifaces && !this.__lookupGetter__(name) && !(this[name] instanceof Ci.nsISupports)) if (name in this && ifaces && !Object.getOwnPropertyDescriptor(this, name).get && !(this[name] instanceof Ci.nsISupports))
throw TypeError(); throw TypeError();
memoize(this, name, () => self._create(name)); memoize(this, name, () => self._create(name));
}, },

View File

@@ -31,8 +31,20 @@ var StoreBase = Class("StoreBase", {
this._load = load; this._load = load;
this._options = options; this._options = options;
this.__defineGetter__("store", () => store); Object.defineProperties(this, {
this.__defineGetter__("name", () => name); "store": {
value: store,
writable: false,
enumerable: true,
configurable: true,
},
"name": {
value: name,
writable: false,
enumerable: true,
configurable: true,
}
});
for (let [k, v] of iter(options)) for (let [k, v] of iter(options))
if (this.OPTIONS.indexOf(k) >= 0) if (this.OPTIONS.indexOf(k) >= 0)
this[k] = v; this[k] = v;
@@ -301,8 +313,12 @@ var Storage = Module("Storage", {
this.keys[key] = new constructor(key, params.store, load, params); this.keys[key] = new constructor(key, params.store, load, params);
this.keys[key].timer = new Timer(1000, 10000, () => this.save(key)); this.keys[key].timer = new Timer(1000, 10000, () => this.save(key));
this.__defineGetter__(key, function () { Object.defineProperty(this, key, {
get() {
return this.keys[key]; return this.keys[key];
},
enumerable: true,
configurable: true,
}); });
} }
return this.keys[key]; return this.keys[key];

View File

@@ -19,14 +19,20 @@ var namespace = "@namespace html " + JSON.stringify(XHTML) + ";\n" +
var Sheet = Struct("name", "id", "sites", "css", "hive", "agent"); var Sheet = Struct("name", "id", "sites", "css", "hive", "agent");
Sheet.liveProperty = function (name) { Sheet.liveProperty = function (name) {
let i = this.prototype.members[name]; let i = this.prototype.members[name];
this.prototype.__defineGetter__(name, function () { return this[i]; }); Object.defineProperty(this.prototype, name, {
this.prototype.__defineSetter__(name, function (val) { get() {
return this[i];
},
set(val) {
if (isArray(val)) if (isArray(val))
val = Array.slice(val); val = Array.slice(val);
if (isArray(val)) if (isArray(val))
Object.freeze(val); Object.freeze(val);
this[i] = val; this[i] = val;
this.enabled = this.enabled; this.enabled = this.enabled;
},
enumerable: true,
configurable: true
}); });
}; };
Sheet.liveProperty("agent"); Sheet.liveProperty("agent");

View File

@@ -283,8 +283,11 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
compileFormat: function compileFormat(format) { compileFormat: function compileFormat(format) {
let stack = [frame()]; let stack = [frame()];
stack.__defineGetter__("top", function () { Object.defineProperty(stack, "top", {
get() {
return this[this.length - 1]; return this[this.length - 1];
},
configurable: true
}); });
function frame() { function frame() {
@@ -370,8 +373,11 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
*/ */
compileMacro: function compileMacro(macro, keepUnknown) { compileMacro: function compileMacro(macro, keepUnknown) {
let stack = [frame()]; let stack = [frame()];
stack.__defineGetter__("top", function () { Object.defineProperty(stack, "top", {
get() {
return this[this.length - 1]; return this[this.length - 1];
},
configurable: true,
}); });
let unknown = identity; let unknown = identity;

View File

@@ -69,10 +69,13 @@ function privateBrowsing(controller) {
this._pbMenuItem = new elementslib.Elem(this._controller.menus['tools-menu'].privateBrowsingItem); this._pbMenuItem = new elementslib.Elem(this._controller.menus['tools-menu'].privateBrowsingItem);
this._pbTransitionItem = new elementslib.ID(this._controller.window.document, "Tools:PrivateBrowsing"); this._pbTransitionItem = new elementslib.ID(this._controller.window.document, "Tools:PrivateBrowsing");
this.__defineGetter__('_pbs', function() { Object.defineProperty(this, '_pbs', {
delete this._pbs; enumerable: true,
return this._pbs = Cc["@mozilla.org/privatebrowsing;1"]. configurable: true,
get() {
return Cc["@mozilla.org/privatebrowsing;1"].
getService(Ci.nsIPrivateBrowsingService); getService(Ci.nsIPrivateBrowsingService);
}
}); });
} }

View File

@@ -62,9 +62,13 @@ let init = function init_() {
UserAgent = Struct("name", "useragent", "appname", "appcodename", UserAgent = Struct("name", "useragent", "appname", "appcodename",
"appversion", "platform", "vendor", "vendorsub", "userset"); "appversion", "platform", "vendor", "vendorsub", "userset");
UserAgent.prototype.__defineGetter__("options", function () { Object.defineProperty(UserAgent.prototype, "options", {
get() {
return opts.slice(1).map(opt => [opt.name, this[opt.name]]) return opts.slice(1).map(opt => [opt.name, this[opt.name]])
.filter(opt => opt[1]); .filter(opt => opt[1]);
},
enumerable: true,
configurable: true
}); });
useragents = array([ useragents = array([

View File

@@ -98,7 +98,8 @@ userContext.xpwrapper = function xpwrapper(obj, iface) {
try { try {
let shim = XPCOMShim([iface]); let shim = XPCOMShim([iface]);
iter.forEach(properties(shim), function (prop) { iter.forEach(properties(shim), function (prop) {
res.__defineGetter__(prop, function () { Object.defineProperty(res, prop, {
get() {
let res = obj.QueryInterface(Ci[iface])[prop]; let res = obj.QueryInterface(Ci[iface])[prop];
if (callable(res)) { if (callable(res)) {
let fn = (...args) => res.apply(obj, args); let fn = (...args) => res.apply(obj, args);
@@ -107,7 +108,10 @@ userContext.xpwrapper = function xpwrapper(obj, iface) {
return fn; return fn;
} }
return res; return res;
}) },
enumerable: true,
configurable: true
});
}); });
} }
catch (e if e === Cr.NS_ERROR_NO_INTERFACE) { catch (e if e === Cr.NS_ERROR_NO_INTERFACE) {
@@ -146,7 +150,11 @@ memoize(userContext, "xpclasses", function () {
return userContext.xpwrapper(cls); return userContext.xpwrapper(cls);
} }
Object.keys(Cc).forEach(function (k) { Object.keys(Cc).forEach(function (k) {
xpclasses.__defineGetter__(k, () => xpclasses(k)); Object.defineProperty(xpclasses, k, {
get: () => xpclasses(k),
enumerable: true,
configurable: true
});
}); });
JavaScript.setCompleter([xpclasses], Completer(Cc)); JavaScript.setCompleter([xpclasses], Completer(Cc));
return xpclasses; return xpclasses;
@@ -179,7 +187,11 @@ memoize(userContext, "xpservices", function () {
return userContext.xpwrapper(cls); return userContext.xpwrapper(cls);
} }
Object.keys(Cc).forEach(function (k) { Object.keys(Cc).forEach(function (k) {
xpservices.__defineGetter__(k, () => xpservices(k)); Object.defineProperty(xpservices, k, {
get: () => xpservices(k),
enumerable: true,
configurable: true
});
}); });
JavaScript.setCompleter([xpservices], Completer(Cc)); JavaScript.setCompleter([xpservices], Completer(Cc));
return xpservices; return xpservices;