calabash-android 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.txt +4 -0
- data/lib/calabash-android/version.rb +2 -2
- data/test-server/calabash-js/src/calabash.js +125 -0
- data/test-server/calabash-js/src/set_text.js +133 -0
- metadata +3 -1
data/CHANGES.txt
CHANGED
@@ -0,0 +1,125 @@
|
|
1
|
+
(function () {
|
2
|
+
/** David Mark's isHostMethod function,
|
3
|
+
* http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting
|
4
|
+
* Modified to use strict equality
|
5
|
+
*/
|
6
|
+
function isHostMethod (object, property)
|
7
|
+
{
|
8
|
+
var t = typeof object[property];
|
9
|
+
return t==='function' ||
|
10
|
+
(!!(t==='object' && object[property])) ||
|
11
|
+
t==='unknown';
|
12
|
+
}
|
13
|
+
//http://www.w3.org/TR/DOM-Level-2-Core/core.html
|
14
|
+
var NODE_TYPES = {
|
15
|
+
/*ELEMENT_NODE : */ 1 : 'ELEMENT_NODE',
|
16
|
+
/*ATTRIBUTE_NODE : */ 2: 'ATTRIBUTE_NODE',
|
17
|
+
/*TEXT_NODE : */ 3 : 'TEXT_NODE',
|
18
|
+
/*DOCUMENT_NODE : */ 9 : 'DOCUMENT_NODE'
|
19
|
+
};
|
20
|
+
|
21
|
+
function computeRectForNode(object)
|
22
|
+
{
|
23
|
+
var res = {}, boundingBox;
|
24
|
+
if (isHostMethod(object,'getBoundingClientRect'))
|
25
|
+
{
|
26
|
+
boundingBox = object.getBoundingClientRect();
|
27
|
+
res['rect'] = boundingBox;
|
28
|
+
res['rect'].center_x = boundingBox.left + Math.floor(boundingBox.width/2);
|
29
|
+
res['rect'].center_y = boundingBox.top + Math.floor(boundingBox.height/2);
|
30
|
+
}
|
31
|
+
res.nodeType = NODE_TYPES[object.nodeType] || res.nodeType + ' (Unexpected)';
|
32
|
+
res.nodeName = object.nodeName;
|
33
|
+
res.id = object.id || '';
|
34
|
+
res['class'] = object.className || '';
|
35
|
+
if (object.href)
|
36
|
+
{
|
37
|
+
res.href = object.href;
|
38
|
+
}
|
39
|
+
res.html = object.outerHTML || '';
|
40
|
+
res.textContent = object.textContent;
|
41
|
+
return res;
|
42
|
+
}
|
43
|
+
function toJSON(object)
|
44
|
+
{
|
45
|
+
var res, i, N, spanEl, parentEl;
|
46
|
+
if (typeof object==='undefined')
|
47
|
+
{
|
48
|
+
throw {message:'Calling toJSON with undefined'};
|
49
|
+
}
|
50
|
+
else if (object instanceof Text)
|
51
|
+
{
|
52
|
+
parentEl = object.parentElement;
|
53
|
+
if (parentEl)
|
54
|
+
{
|
55
|
+
spanEl = document.createElement("calabash");
|
56
|
+
spanEl.style.display = "inline";
|
57
|
+
spanEl.innerHTML = object.textContent;
|
58
|
+
parentEl.replaceChild(spanEl, object);
|
59
|
+
res = computeRectForNode(spanEl);
|
60
|
+
res.nodeType = NODE_TYPES[object.nodeType];
|
61
|
+
delete res.nodeName;
|
62
|
+
delete res.id;
|
63
|
+
delete res['class'];
|
64
|
+
|
65
|
+
parentEl.replaceChild(object,spanEl);
|
66
|
+
}
|
67
|
+
else
|
68
|
+
{
|
69
|
+
res = object;
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
}
|
74
|
+
else if (object instanceof Node)//TODO: support for frames!
|
75
|
+
{
|
76
|
+
res = computeRectForNode(object);
|
77
|
+
}
|
78
|
+
else if (object instanceof NodeList || //TODO: support for frames!
|
79
|
+
(typeof object=='object' && object &&
|
80
|
+
typeof object.length === 'number' &&
|
81
|
+
object.length > 0 //array like
|
82
|
+
&& typeof object[0] !== 'undefined'))
|
83
|
+
{
|
84
|
+
res = [];
|
85
|
+
for (i=0,N=object.length;i<N;i++)
|
86
|
+
{
|
87
|
+
res[i] = toJSON(object[i]);
|
88
|
+
}
|
89
|
+
}
|
90
|
+
else
|
91
|
+
{
|
92
|
+
res = object;
|
93
|
+
}
|
94
|
+
return res;
|
95
|
+
}
|
96
|
+
///TODO: no support for now frames
|
97
|
+
//idea would be map XPath across window.frames
|
98
|
+
//must take care of visibility questions
|
99
|
+
|
100
|
+
var exp = '%@'/* dynamic */,
|
101
|
+
queryType = '%@',
|
102
|
+
nodes = null,
|
103
|
+
res = [],
|
104
|
+
i,N;
|
105
|
+
try
|
106
|
+
{
|
107
|
+
if (queryType==='xpath')
|
108
|
+
{
|
109
|
+
nodes = document.evaluate(exp, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
110
|
+
for (i=0,N=nodes.snapshotLength;i<N;i++)
|
111
|
+
{
|
112
|
+
res[i] = nodes.snapshotItem(i);
|
113
|
+
}
|
114
|
+
}
|
115
|
+
else
|
116
|
+
{
|
117
|
+
res = document.querySelectorAll(exp);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
catch (e)
|
121
|
+
{
|
122
|
+
return JSON.stringify({error:'Exception while running query: '+exp, details:e.toString()})
|
123
|
+
}
|
124
|
+
return JSON.stringify(toJSON(res));
|
125
|
+
})();
|
@@ -0,0 +1,133 @@
|
|
1
|
+
(function () {
|
2
|
+
function simulateKeyEvent(elem, character) {
|
3
|
+
var ch = character.charCodeAt(0);
|
4
|
+
|
5
|
+
var evt;
|
6
|
+
evt = document.createEvent('KeyboardEvent');
|
7
|
+
evt.initKeyboardEvent('keydown', true, true, window, 0, 0, 0, 0, 0, ch);
|
8
|
+
elem.dispatchEvent(evt);
|
9
|
+
|
10
|
+
evt = document.createEvent('KeyboardEvent');
|
11
|
+
evt.initKeyboardEvent('keyup', true, true, window, 0, 0, 0, 0, 0, ch);
|
12
|
+
elem.dispatchEvent(evt);
|
13
|
+
evt = document.createEvent('KeyboardEvent');
|
14
|
+
evt.initKeyboardEvent('keypress', true, true, window, 0, 0, 0, 0, 0, ch);
|
15
|
+
elem.dispatchEvent(evt);
|
16
|
+
}
|
17
|
+
|
18
|
+
|
19
|
+
function enterTextIntoInputField(elem, text) {
|
20
|
+
elem.value = "";
|
21
|
+
for (var i = 0; i < text.length; i++) {
|
22
|
+
var ch = text.charAt(i);
|
23
|
+
elem.value += ch;
|
24
|
+
simulateKeyEvent(elem, ch);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
function fireHTMLEvent(elem, eventName) {
|
30
|
+
var evt = document.createEvent("HTMLEvents");
|
31
|
+
evt.initEvent(eventName, true, true );
|
32
|
+
return !elem.dispatchEvent(evt);
|
33
|
+
}
|
34
|
+
|
35
|
+
function selectInputField(elem) {
|
36
|
+
elem.click();
|
37
|
+
elem.focus();
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
function deselectInputField(elem) {
|
42
|
+
fireHTMLEvent(elem, 'change');
|
43
|
+
fireHTMLEvent(elem, 'blur');
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
/** David Mark's isHostMethod function,
|
48
|
+
* http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting
|
49
|
+
* Modified to use strict equality
|
50
|
+
*/
|
51
|
+
function isHostMethod (object, property)
|
52
|
+
{
|
53
|
+
var t = typeof object[property];
|
54
|
+
return t==='function' ||
|
55
|
+
(!!(t==='object' && object[property])) ||
|
56
|
+
t==='unknown';
|
57
|
+
}
|
58
|
+
//http://www.w3.org/TR/DOM-Level-2-Core/core.html
|
59
|
+
var NODE_TYPES = {
|
60
|
+
/*ELEMENT_NODE : */ 1 : 'ELEMENT_NODE',
|
61
|
+
/*ATTRIBUTE_NODE : */ 2: 'ATTRIBUTE_NODE',
|
62
|
+
/*TEXT_NODE : */ 3 : 'TEXT_NODE',
|
63
|
+
/*DOCUMENT_NODE : */ 9 : 'DOCUMENT_NODE'
|
64
|
+
};
|
65
|
+
|
66
|
+
function toJSON(object)
|
67
|
+
{
|
68
|
+
var res, i, N;
|
69
|
+
if (typeof object==='undefined')
|
70
|
+
{
|
71
|
+
throw {message:'Calling toJSON with undefined'};
|
72
|
+
}
|
73
|
+
else if (object instanceof Node)//TODO: support for frames!
|
74
|
+
{
|
75
|
+
res = {}
|
76
|
+
if (isHostMethod(object,'getBoundingClientRect'))
|
77
|
+
{
|
78
|
+
res['rect'] = object.getBoundingClientRect();
|
79
|
+
}
|
80
|
+
res.nodeType = NODE_TYPES[object.nodeType] || res.nodeType + ' (Unexpected)';
|
81
|
+
res.nodeName = object.nodeName;
|
82
|
+
res.id = object.id || '';
|
83
|
+
res['class'] = object.className || '';
|
84
|
+
res.html = object.outerHTML || '';
|
85
|
+
res.nodeValue = object.nodeValue;
|
86
|
+
}
|
87
|
+
else if (object instanceof NodeList || //TODO: support for frames!
|
88
|
+
(typeof object=='object' && object &&
|
89
|
+
typeof object.length === 'number' &&
|
90
|
+
object.length > 0 //array like
|
91
|
+
&& typeof object[0] !== 'undefined'))
|
92
|
+
{
|
93
|
+
res = [];
|
94
|
+
for (i=0,N=object.length;i<N;i++)
|
95
|
+
{
|
96
|
+
res[i] = toJSON(object[i]);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
else
|
100
|
+
{
|
101
|
+
res = object;
|
102
|
+
}
|
103
|
+
return res;
|
104
|
+
}
|
105
|
+
|
106
|
+
///TODO: no support for now frames
|
107
|
+
//idea would be map XPath across window.frames
|
108
|
+
//must take care of visibility questions
|
109
|
+
|
110
|
+
try
|
111
|
+
{
|
112
|
+
var exp = JSON.parse('%@')/* dynamic */,
|
113
|
+
el,
|
114
|
+
text = '%@',
|
115
|
+
i,N;
|
116
|
+
|
117
|
+
el=document.elementFromPoint(exp.rect.left, exp.rect.top);
|
118
|
+
if (/input/i.test(el.tagName))
|
119
|
+
{
|
120
|
+
selectInputField(el);
|
121
|
+
enterTextIntoInputField(el, text);
|
122
|
+
}
|
123
|
+
else
|
124
|
+
{
|
125
|
+
|
126
|
+
}
|
127
|
+
}
|
128
|
+
catch (e)
|
129
|
+
{
|
130
|
+
return JSON.stringify({error:'Exception while running query: '+exp, details:e.toString()})
|
131
|
+
}
|
132
|
+
return JSON.stringify(toJSON(el));
|
133
|
+
})();
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-android
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -603,6 +603,8 @@ files:
|
|
603
603
|
- test-server/instrumentation-backend/src/sh/calaba/org/codehaus/jackson/util/TokenBuffer.java
|
604
604
|
- test-server/instrumentation-backend/src/sh/calaba/org/codehaus/jackson/util/VersionUtil.java
|
605
605
|
- test-server/instrumentation-backend/src/sh/calaba/org/codehaus/jackson/util/package-info.java
|
606
|
+
- test-server/calabash-js/src/calabash.js
|
607
|
+
- test-server/calabash-js/src/set_text.js
|
606
608
|
homepage: http://github.com/calabash
|
607
609
|
licenses: []
|
608
610
|
post_install_message:
|