diff --git a/utils/objects.js b/utils/objects.js new file mode 100644 index 0000000..d4f00d4 --- /dev/null +++ b/utils/objects.js @@ -0,0 +1,107 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var o = null; + +// TODO: https://github.com/MozillaSecurity/octo/issues/7 + +function Objects() { + this.counter = 0; + this.container = {}; +} + +Objects.prototype.add = function (category, member) { + member = member ? member : "o" + this.counter; + if (!this.has(category)) { + this.container[category] = []; + } + this.container[category].push({type: category, name: member}); + ++this.counter; + return this.container[category].slice(-1)[0].name; +}; + +Objects.prototype.get = function (category, last) { + if (!(category in this.container)) { + //return {type:null, name:null}; + Utils.traceback(); + throw new Error(category + " is not available."); + } + if (last) { + return this.container[category].slice(-1)[0]; + } + return Random.index(this.container[category]); +}; + +Objects.prototype.pick = function (category, last) { + try { + return this.get(category, last).name; + } catch (e) { + Utils.traceback(); + throw Logger.JSError("Error: pick(" + category + ") " + category + " is undefined."); + } +}; + +Objects.prototype.pop = function (objectName) { + var self = this; + Utils.getKeysFromHash(this.container).forEach(function (category) { + self.container[category].forEach(function (obj) { + if (obj.name == objectName) { + self.container[category].splice(self.container[category].indexOf(obj), 1); + } + }); + }); +}; + +Objects.prototype.contains = function (categoryNames) { + var categories = [], self = this; + categoryNames.forEach(function (name) { + if (self.has(name)) { + categories.push(name); + } + }); + return (categories.length == 0) ? null : categories; +}; + +Objects.prototype.show = function (category) { + return (category in this.container) ? this.container[category] : this.container; +}; + +Objects.prototype.count = function (category) { + return (category in this.container) ? this.container[category].length : 0; +}; + +Objects.prototype.has = function (category) { + if (category in this.container) { + this.check(category); + return !!(this.container[category].length > 0); + } + return false; +}; + +Objects.prototype.valid = function () { + var items = [], self = this; + Utils.getKeysFromHash(self.container).forEach(function (category) { + self.check(category); + }); + Utils.getKeysFromHash(self.container).forEach(function (category) { + for (var i = 0; i < self.container[category].length; i++) { + items.push(self.container[category][i].name); + } + }); + return items; +}; + +Objects.prototype.check = function (category) { + var self = this; + self.container[category].forEach(function (object) { + try { + var x = /*frame.contentWindow.*/eval(object.name); + if (x === undefined || x == null) { + self.pop(object.name); + } + } catch (e) { + self.pop(object.name); + } + }); +};