diff --git a/common/modules/base.jsm b/common/modules/base.jsm index b0abfece..22a21efc 100644 --- a/common/modules/base.jsm +++ b/common/modules/base.jsm @@ -733,11 +733,9 @@ function Class() { if (callable(args[0])) superclass = args.shift(); - if (loaded.config && config.haveGecko("6.0a1")) // Bug 657418. + if (loaded.config && (config.haveGecko("5.*", "6.0") || config.haveGecko("8.0"))) // Bug 657418. var Constructor = function Constructor() { - var self = Object.create(Constructor.prototype, { - constructor: { value: Constructor }, - }); + var self = Object.create(Constructor.prototype); self.instance = self; if ("_metaInit_" in self && self._metaInit_) @@ -749,9 +747,7 @@ function Class() { else var Constructor = eval(String.replace(= 0, + haveGecko: function (min, max) let ({ compare } = services.versionCompare, + { platformVersion } = services.runtime) + (min == null || compare(platformVersion, min) >= 0) && + (max == null || compare(platformVersion, max) < 0), /** Dactyl's notion of the current operating system platform. */ OS: memoize({ diff --git a/common/modules/messages.jsm b/common/modules/messages.jsm index 43177bfe..0473e692 100644 --- a/common/modules/messages.jsm +++ b/common/modules/messages.jsm @@ -17,19 +17,13 @@ var Messages = Module("messages", { init: function init(name) { let self = this; - name = name || "messages"; - - this.bundles = array.uniq([JSMLoader.getTarget("dactyl://locale/" + name + ".properties"), - JSMLoader.getTarget("dactyl://locale-local/" + name + ".properties"), - "resource://dactyl-locale/en-US/" + name + ".properties", - "resource://dactyl-locale-local/en-US/" + name + ".properties"]) - .map(services.stringBundle.createBundle) - .filter(function (bundle) { try { bundle.getSimpleEnumeration(); return true; } catch (e) { return false; } }); + this.name = name || "messages"; this._ = Class("_", String, { init: function _(message) { this.args = arguments; }, + instance: {}, message: Class.Memoize(function () { let message = this.args[0]; @@ -42,18 +36,23 @@ var Messages = Module("messages", { valueOf: function valueOf() this.message, toString: function toString() this.message }); - - let seen = {}; - for (let { key } in this.iterate()) { - if (!Set.add(seen, key)) - this._[key] = this[key] = { - __noSuchMethod__: function __(prop, args) self._.apply(self, [prop].concat(args)) - }; - } }, - iterate: function () let (bundle = this.bundles[0]) - iter(prop.QueryInterface(Ci.nsIPropertyElement) for (prop in iter(bundle.getSimpleEnumeration()))), + bundles: Class.Memoize(function () + array.uniq([JSMLoader.getTarget("dactyl://locale/" + this.name + ".properties"), + JSMLoader.getTarget("dactyl://locale-local/" + this.name + ".properties"), + "resource://dactyl-locale/en-US/" + this.name + ".properties", + "resource://dactyl-locale-local/en-US/" + this.name + ".properties"]) + .map(services.stringBundle.createBundle) + .filter(function (bundle) { try { bundle.getSimpleEnumeration(); return true; } catch (e) { return false; } })), + + iterate: function () { + let seen = {}; + for (let bundle in values(this.bundles)) + for (let { key, value } in iter(bundle.getSimpleEnumeration(), Ci.nsIPropertyElement)) + if (!Set.add(seen, key)) + yield [key, value]; + }, cleanup: function cleanup() { services.stringBundle.flushBundles();