lib/capybara/poltergeist/client/compiled/agent.js in poltergeist-0.6.0 vs lib/capybara/poltergeist/client/compiled/agent.js in poltergeist-0.7.0
- old
+ new
@@ -1,149 +1,235 @@
var PoltergeistAgent;
-var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+
PoltergeistAgent = (function() {
+
function PoltergeistAgent() {
this.elements = [];
this.nodes = {};
this.windows = [];
this.pushWindow(window);
}
- PoltergeistAgent.prototype.externalCall = function(name, arguments) {
- return {
- value: this[name].apply(this, arguments)
- };
+
+ PoltergeistAgent.prototype.externalCall = function(name, args) {
+ try {
+ return {
+ value: this[name].apply(this, args)
+ };
+ } catch (error) {
+ return {
+ error: {
+ message: error.toString(),
+ stack: error.stack
+ }
+ };
+ }
};
+
+ PoltergeistAgent.stringify = function(object) {
+ return JSON.stringify(object, function(key, value) {
+ if (Array.isArray(this[key])) {
+ return this[key];
+ } else {
+ return value;
+ }
+ });
+ };
+
PoltergeistAgent.prototype.pushWindow = function(new_window) {
this.windows.push(new_window);
this.window = new_window;
this.document = this.window.document;
return null;
};
+
PoltergeistAgent.prototype.popWindow = function() {
this.windows.pop();
this.window = this.windows[this.windows.length - 1];
this.document = this.window.document;
return null;
};
+
PoltergeistAgent.prototype.pushFrame = function(id) {
return this.pushWindow(this.document.getElementById(id).contentWindow);
};
+
PoltergeistAgent.prototype.popFrame = function() {
return this.popWindow();
};
+
PoltergeistAgent.prototype.currentUrl = function() {
return window.location.toString();
};
+
PoltergeistAgent.prototype.find = function(selector, within) {
- var i, ids, results, _ref;
+ var i, ids, results, _i, _ref;
if (within == null) {
within = this.document;
}
results = this.document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
ids = [];
- for (i = 0, _ref = results.snapshotLength; 0 <= _ref ? i < _ref : i > _ref; 0 <= _ref ? i++ : i--) {
+ for (i = _i = 0, _ref = results.snapshotLength; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
ids.push(this.register(results.snapshotItem(i)));
}
return ids;
};
+
PoltergeistAgent.prototype.register = function(element) {
this.elements.push(element);
return this.elements.length - 1;
};
+
PoltergeistAgent.prototype.documentSize = function() {
return {
height: this.document.documentElement.scrollHeight,
width: this.document.documentElement.scrollWidth
};
};
+
PoltergeistAgent.prototype.get = function(id) {
var _base;
return (_base = this.nodes)[id] || (_base[id] = new PoltergeistAgent.Node(this, this.elements[id]));
};
- PoltergeistAgent.prototype.nodeCall = function(id, name, arguments) {
+
+ PoltergeistAgent.prototype.nodeCall = function(id, name, args) {
var node;
node = this.get(id);
if (node.isObsolete()) {
throw new PoltergeistAgent.ObsoleteNode;
}
- return node[name].apply(node, arguments);
+ return node[name].apply(node, args);
};
+
return PoltergeistAgent;
+
})();
+
PoltergeistAgent.ObsoleteNode = (function() {
+
function ObsoleteNode() {}
+
ObsoleteNode.prototype.toString = function() {
return "PoltergeistAgent.ObsoleteNode";
};
+
return ObsoleteNode;
+
})();
+
PoltergeistAgent.Node = (function() {
+
Node.EVENTS = {
FOCUS: ['blur', 'focus', 'focusin', 'focusout'],
MOUSE: ['click', 'dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseover', 'mouseout', 'mouseup']
};
+
function Node(agent, element) {
this.agent = agent;
this.element = element;
}
+
Node.prototype.parentId = function() {
return this.agent.register(this.element.parentNode);
};
+
Node.prototype.find = function(selector) {
return this.agent.find(selector, this.element);
};
+
Node.prototype.isObsolete = function() {
- var obsolete;
- obsolete = __bind(function(element) {
+ var obsolete,
+ _this = this;
+ obsolete = function(element) {
if (element.parentNode != null) {
- if (element.parentNode === this.agent.document) {
+ if (element.parentNode === _this.agent.document) {
return false;
} else {
return obsolete(element.parentNode);
}
} else {
return true;
}
- }, this);
+ };
return obsolete(this.element);
};
+
Node.prototype.changed = function() {
var event;
event = document.createEvent('HTMLEvents');
- event.initEvent("change", true, false);
+ event.initEvent('change', true, false);
return this.element.dispatchEvent(event);
};
+
+ Node.prototype.input = function() {
+ var event;
+ event = document.createEvent('HTMLEvents');
+ event.initEvent('input', true, false);
+ return this.element.dispatchEvent(event);
+ };
+
+ Node.prototype.keyupdowned = function(eventName, keyCode) {
+ var event;
+ event = document.createEvent('UIEvents');
+ event.initEvent(eventName, true, true);
+ event.keyCode = keyCode;
+ event.which = keyCode;
+ event.charCode = 0;
+ return this.element.dispatchEvent(event);
+ };
+
+ Node.prototype.keypressed = function(altKey, ctrlKey, shiftKey, metaKey, keyCode, charCode) {
+ var event;
+ event = document.createEvent('UIEvents');
+ event.initEvent('keypress', true, true);
+ event.window = this.agent.window;
+ event.altKey = altKey;
+ event.ctrlKey = ctrlKey;
+ event.shiftKey = shiftKey;
+ event.metaKey = metaKey;
+ event.keyCode = keyCode;
+ event.charCode = charCode;
+ event.which = keyCode;
+ return this.element.dispatchEvent(event);
+ };
+
Node.prototype.insideBody = function() {
return this.element === this.agent.document.body || this.agent.document.evaluate('ancestor::body', this.element, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
};
+
Node.prototype.text = function() {
- var el, i, node, results, text, _ref;
+ var el, i, node, results, text, _i, _ref;
if (!this.isVisible()) {
return '';
}
if (this.insideBody()) {
el = this.element;
} else {
el = this.agent.document.body;
}
results = this.agent.document.evaluate('.//text()[not(ancestor::script)]', el, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
text = '';
- for (i = 0, _ref = results.snapshotLength; 0 <= _ref ? i < _ref : i > _ref; 0 <= _ref ? i++ : i--) {
+ for (i = _i = 0, _ref = results.snapshotLength; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
node = results.snapshotItem(i);
if (this.isVisible(node.parentNode)) {
text += node.textContent;
}
}
return text;
};
+
Node.prototype.getAttribute = function(name) {
if (name === 'checked' || name === 'selected') {
return this.element[name];
} else {
return this.element.getAttribute(name);
}
};
+
+ Node.prototype.scrollIntoView = function() {
+ return this.element.scrollIntoViewIfNeeded();
+ };
+
Node.prototype.value = function() {
var option, _i, _len, _ref, _results;
if (this.element.tagName === 'SELECT' && this.element.multiple) {
_ref = this.element.children;
_results = [];
@@ -156,38 +242,57 @@
return _results;
} else {
return this.element.value;
}
};
+
Node.prototype.set = function(value) {
+ var char, keyCode, _i, _len;
if (this.element.maxLength >= 0) {
value = value.substr(0, this.element.maxLength);
}
- this.element.value = value;
- return this.changed();
+ this.element.value = '';
+ this.trigger('focus');
+ for (_i = 0, _len = value.length; _i < _len; _i++) {
+ char = value[_i];
+ this.element.value += char;
+ keyCode = this.characterToKeyCode(char);
+ this.keyupdowned('keydown', keyCode);
+ this.keypressed(false, false, false, false, char.charCodeAt(0), char.charCodeAt(0));
+ this.keyupdowned('keyup', keyCode);
+ }
+ this.changed();
+ this.input();
+ return this.trigger('blur');
};
+
Node.prototype.isMultiple = function() {
return this.element.multiple;
};
+
Node.prototype.setAttribute = function(name, value) {
return this.element.setAttribute(name, value);
};
+
Node.prototype.removeAttribute = function(name) {
return this.element.removeAttribute(name);
};
+
Node.prototype.select = function(value) {
if (value === false && !this.element.parentNode.multiple) {
return false;
} else {
this.element.selected = value;
this.changed();
return true;
}
};
+
Node.prototype.tagName = function() {
return this.element.tagName;
};
+
Node.prototype.isVisible = function(element) {
if (!element) {
element = this.element;
}
if (this.agent.window.getComputedStyle(element).display === 'none') {
@@ -196,10 +301,11 @@
return this.isVisible(element.parentElement);
} else {
return true;
}
};
+
Node.prototype.position = function() {
var rect;
rect = this.element.getClientRects()[0];
return {
top: rect.top,
@@ -208,10 +314,11 @@
bottom: rect.bottom,
width: rect.width,
height: rect.height
};
};
+
Node.prototype.trigger = function(name) {
var event;
if (Node.EVENTS.MOUSE.indexOf(name) !== -1) {
event = document.createEvent('MouseEvent');
event.initMouseEvent(name, true, true, this.agent.window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
@@ -221,10 +328,11 @@
} else {
throw "Unknown event";
}
return this.element.dispatchEvent(event);
};
+
Node.prototype.clickTest = function(x, y) {
var el, origEl;
el = origEl = document.elementFromPoint(x, y);
while (el) {
if (el === this.element) {
@@ -238,10 +346,11 @@
return {
status: 'failure',
selector: origEl && this.getSelector(origEl)
};
};
+
Node.prototype.getSelector = function(el) {
var className, selector, _i, _len, _ref;
selector = el.tagName !== 'HTML' ? this.getSelector(el.parentNode) + ' ' : '';
selector += el.tagName.toLowerCase();
if (el.id) {
@@ -252,17 +361,68 @@
className = _ref[_i];
selector += "." + className;
}
return selector;
};
+
+ Node.prototype.characterToKeyCode = function(character) {
+ var code, specialKeys;
+ code = character.toUpperCase().charCodeAt(0);
+ specialKeys = {
+ 96: 192,
+ 45: 189,
+ 61: 187,
+ 91: 219,
+ 93: 221,
+ 92: 220,
+ 59: 186,
+ 39: 222,
+ 44: 188,
+ 46: 190,
+ 47: 191,
+ 127: 46,
+ 126: 192,
+ 33: 49,
+ 64: 50,
+ 35: 51,
+ 36: 52,
+ 37: 53,
+ 94: 54,
+ 38: 55,
+ 42: 56,
+ 40: 57,
+ 41: 48,
+ 95: 189,
+ 43: 187,
+ 123: 219,
+ 125: 221,
+ 124: 220,
+ 58: 186,
+ 34: 222,
+ 60: 188,
+ 62: 190,
+ 63: 191
+ };
+ return specialKeys[code] || code;
+ };
+
+ Node.prototype.isDOMEqual = function(other_id) {
+ return this.element === this.agent.get(other_id).element;
+ };
+
return Node;
+
})();
+
window.__poltergeist = new PoltergeistAgent;
+
document.addEventListener('DOMContentLoaded', function() {
return console.log('__DOMContentLoaded');
});
+
window.confirm = function(message) {
return true;
};
+
window.prompt = function(message, _default) {
return _default || null;
-};
\ No newline at end of file
+};