blob: e0a55b8d8a6c0ad3b082741c746a8550393511ab [file] [log] [blame]
var extend = require("./extend"),
ClientMethods = require("./client-methods");
module.exports = Node;
function Node(client, walker, node) {
this.initialize(client, node.actor);
this.walker = walker;
this.getNode = this.getNode.bind(this);
this.getNodeArray = this.getNodeArray.bind(this);
this.getNodeList = this.getNodeList.bind(this);
walker.on('newMutations', function(event) {
//console.log("on new mutations! ", JSON.stringify(event));
});
['nodeType', 'nodeName', 'namespaceURI', 'attrs']
.forEach(function(attr) {
this[attr] = node[attr];
}.bind(this));
}
Node.prototype = extend(ClientMethods, {
getAttribute: function(name) {
for (var i in this.attrs) {
var attr = this.attrs[i];
if (attr.name == name) {
return attr.value;
}
}
},
setAttribute: function(name, value, cb) {
var mods = [{
attributeName: name,
newValue: value
}];
this.request('modifyAttributes', { modifications: mods }, cb);
},
parentNode: function(cb) {
this.parents(function(err, nodes) {
if (err) {
return cb(err);
}
var node = null;
if (nodes.length) {
node = nodes[0];
}
cb(null, node);
})
},
parents: function(cb) {
this.nodeRequest('parents', this.getNodeArray, cb);
},
children: function(cb) {
this.nodeRequest('children', this.getNodeArray, cb);
},
siblings: function(cb) {
this.nodeRequest('siblings', this.getNodeArray, cb);
},
nextSibling: function(cb) {
this.nodeRequest('nextSibling', this.getNode, cb);
},
previousSibling: function(cb) {
this.nodeRequest('previousSibling', this.getNode, cb);
},
querySelector: function(selector, cb) {
this.nodeRequest('querySelector', { selector: selector },
this.getNode, cb);
},
querySelectorAll: function(selector, cb) {
this.nodeRequest('querySelectorAll', { selector: selector },
this.getNodeList, cb);
},
innerHTML: function(cb) {
this.nodeRequest('innerHTML', function(resp) {
return resp.value;
}, cb)
},
outerHTML: function(cb) {
this.nodeRequest('outerHTML', function(resp) {
return resp.value;
}, cb)
},
remove: function(cb) {
this.nodeRequest('removeNode', function(resp) {
return new Node(this.client, this.walker, resp.nextSibling);
}.bind(this), cb);
},
highlight: function(cb) {
this.nodeRequest('highlight', cb);
},
release: function(cb) {
this.nodeRequest('releaseNode', cb);
},
getNode: function(resp) {
if (resp.node) {
return new Node(this.client, this.walker, resp.node);
}
return null;
},
getNodeArray: function(resp) {
return resp.nodes.map(function(form) {
return new Node(this.client, this.walker, form);
}.bind(this));
},
getNodeList: function(resp) {
return new NodeList(this.client, this.walker, resp.list);
},
nodeRequest: function(type, message, transform, cb) {
if (!cb) {
cb = transform;
transform = message;
message = {};
}
message.node = this.actor;
this.walker.request(type, message, transform, cb);
}
});
function NodeList(client, walker, list) {
this.client = client;
this.walker = walker;
this.actor = list.actor;
this.length = list.length;
}
NodeList.prototype = extend(ClientMethods, {
items: function(start, end, cb) {
if (typeof start == "function") {
cb = start;
start = 0;
end = this.length;
}
else if (typeof end == "function") {
cb = end;
end = this.length;
}
this.request('items', { start: start, end: end },
this.getNodeArray.bind(this), cb);
},
// TODO: add this function to ClientMethods
getNodeArray: function(resp) {
return resp.nodes.map(function(form) {
return new Node(this.client, this.walker, form);
}.bind(this));
}
});