//Element object //Wrapper around browser methods var __slice = Array.prototype.slice; var _ = require("lodash") , utils = require("./utils.js") , niceArgs = utils.niceArgs , niceResp = utils.niceResp , elementCommands = require('./element-commands'); var Element = function(value, browser) { this.value = value; this.browser = browser; if(!value){ throw new Error("no value passed to Element constructor"); } if(!browser){ throw new Error("no browser passed to Element constructor"); } }; Element.prototype.emit = function() { this.browser.emit.apply(this.browser, __slice.call(arguments, 0)); }; Element.prototype.toString = function () { return String(this.value); }; Element.prototype.toJSON = function () { return { ELEMENT: this.value }; }; _(elementCommands).each(function(fn, name) { Element.prototype[name] = function() { var _this = this; var fargs = utils.varargs(arguments); this.emit('command', "CALL" , "element." + name + niceArgs(fargs.all)); var cb = function(err) { if(err) { err.message = '[element.' + name + niceArgs(fargs.all) + "] " + err.message; fargs.callback(err); } else { var cbArgs = __slice.call(arguments, 0); _this.emit('command', "RESPONSE" , "element." + name + niceArgs(fargs.all), niceResp(_.drop(cbArgs))); fargs.callback.apply(null, cbArgs); } }; var args = fargs.all.concat([cb]); return fn.apply(this, args); }; }); module.exports = Element;