Pull merge.
[yaffs-website] / vendor / jcalderonzumba / gastonjs / src / Client / node.js
1 var __slice = [].slice;
2
3 Poltergeist.Node = (function () {
4   var name, _fn, _i, _len, _ref;
5   var xpathStringLiteral;
6
7   Node.DELEGATES = ['allText', 'visibleText', 'getAttribute', 'value', 'set', 'checked',
8     'setAttribute', 'isObsolete', 'removeAttribute', 'isMultiple',
9     'select', 'tagName', 'find', 'getAttributes', 'isVisible',
10     'position', 'trigger', 'input', 'parentId', 'parentIds', 'mouseEventTest',
11     'scrollIntoView', 'isDOMEqual', 'isDisabled', 'deleteText', 'selectRadioValue',
12     'containsSelection', 'allHTML', 'changed', 'getXPathForElement', 'deselectAllOptions'];
13
14   function Node(page, id) {
15     this.page = page;
16     this.id = id;
17   }
18
19   /**
20    * Returns the parent Node of this Node
21    * @return {Poltergeist.Node}
22    */
23   Node.prototype.parent = function () {
24     return new Poltergeist.Node(this.page, this.parentId());
25   };
26
27   _ref = Node.DELEGATES;
28
29   _fn = function (name) {
30     return Node.prototype[name] = function () {
31       var args = [];
32       if (arguments.length >= 1) {
33         args = __slice.call(arguments, 0)
34       }
35       return this.page.nodeCall(this.id, name, args);
36     };
37   };
38
39   //Adding all the delegates from the agent Node to this Node
40   for (_i = 0, _len = _ref.length; _i < _len; _i++) {
41     name = _ref[_i];
42     _fn(name);
43   }
44
45   xpathStringLiteral = function (s) {
46     if (s.indexOf('"') === -1)
47       return '"' + s + '"';
48     if (s.indexOf("'") === -1)
49       return "'" + s + "'";
50     return 'concat("' + s.replace(/"/g, '",\'"\',"') + '")';
51   };
52
53   /**
54    *  Gets an x,y position tailored for mouse event actions
55    * @return {{x, y}}
56    */
57   Node.prototype.mouseEventPosition = function () {
58     var middle, pos, viewport;
59
60     viewport = this.page.viewportSize();
61     pos = this.position();
62     middle = function (start, end, size) {
63       return start + ((Math.min(end, size) - start) / 2);
64     };
65
66     return {
67       x: middle(pos.left, pos.right, viewport.width),
68       y: middle(pos.top, pos.bottom, viewport.height)
69     };
70   };
71
72   /**
73    * Executes a phantomjs native mouse event
74    * @param name
75    * @return {{x, y}}
76    */
77   Node.prototype.mouseEvent = function (name) {
78     var pos, test;
79
80     this.scrollIntoView();
81     pos = this.mouseEventPosition();
82     test = this.mouseEventTest(pos.x, pos.y);
83
84     if (test.status === 'success') {
85       if (name === 'rightclick') {
86         this.page.mouseEvent('click', pos.x, pos.y, 'right');
87         this.trigger('contextmenu');
88       } else {
89         this.page.mouseEvent(name, pos.x, pos.y);
90       }
91       return pos;
92     } else {
93       throw new Poltergeist.MouseEventFailed(name, test.selector, pos);
94     }
95   };
96
97   /**
98    * Executes a mouse based drag from one node to another
99    * @param other
100    * @return {{x, y}}
101    */
102   Node.prototype.dragTo = function (other) {
103     var otherPosition, position;
104
105     this.scrollIntoView();
106     position = this.mouseEventPosition();
107     otherPosition = other.mouseEventPosition();
108     this.page.mouseEvent('mousedown', position.x, position.y);
109     return this.page.mouseEvent('mouseup', otherPosition.x, otherPosition.y);
110   };
111
112   /**
113    * Checks if one node is equal to another
114    * @param other
115    * @return {boolean}
116    */
117   Node.prototype.isEqual = function (other) {
118     return this.page === other.page && this.isDOMEqual(other.id);
119   };
120
121
122   /**
123    * The value to select
124    * @param value
125    * @param multiple
126    */
127   Node.prototype.select_option = function (value, multiple) {
128     var tagName = this.tagName().toLowerCase();
129
130     if (tagName === "select") {
131       var escapedOption = xpathStringLiteral(value);
132       // The value of an option is the normalized version of its text when it has no value attribute
133       var optionQuery = ".//option[@value = " + escapedOption + " or (not(@value) and normalize-space(.) = " + escapedOption + ")]";
134       var ids = this.find("xpath", optionQuery);
135       var polterNode = this.page.get(ids[0]);
136
137       if (multiple || !this.getAttribute('multiple')) {
138         if (!polterNode.getAttribute('selected')) {
139           polterNode.select(value);
140           this.trigger('click');
141           this.input();
142         }
143         return true;
144       }
145
146       this.deselectAllOptions();
147       polterNode.select(value);
148       this.trigger('click');
149       this.input();
150       return true;
151     } else if (tagName === "input" && this.getAttribute("type").toLowerCase() === "radio") {
152       return this.selectRadioValue(value);
153     }
154
155     throw new Poltergeist.BrowserError("The element is not a select or radio input");
156
157   };
158
159   return Node;
160
161 }).call(this);