terminus 0.3.0 → 0.4.0
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/README.rdoc +25 -19
- data/bin/terminus +1 -1
- data/lib/capybara/driver/terminus.rb +28 -17
- data/lib/terminus.rb +29 -15
- data/lib/terminus/application.rb +5 -11
- data/lib/terminus/browser.rb +97 -44
- data/lib/terminus/client.rb +43 -0
- data/lib/terminus/client/browser.rb +30 -0
- data/lib/terminus/client/phantom.js +6 -0
- data/lib/terminus/client/phantomjs.rb +20 -0
- data/lib/terminus/connector.rb +9 -0
- data/lib/terminus/connector/server.rb +142 -0
- data/lib/terminus/connector/socket_handler.rb +72 -0
- data/lib/terminus/controller.rb +22 -5
- data/lib/terminus/host.rb +7 -2
- data/lib/terminus/node.rb +11 -5
- data/lib/terminus/proxy.rb +35 -1
- data/lib/terminus/proxy/driver_body.rb +26 -6
- data/lib/terminus/proxy/external.rb +9 -0
- data/lib/terminus/proxy/rewrite.rb +4 -2
- data/lib/terminus/public/compiled/terminus-min.js +3 -0
- data/lib/terminus/public/compiled/terminus.js +5270 -0
- data/lib/terminus/public/loader.js +1 -1
- data/lib/terminus/public/pathology.js +3174 -0
- data/lib/terminus/public/syn/browsers.js +2 -2
- data/lib/terminus/public/syn/drag/drag.js +3 -4
- data/lib/terminus/public/syn/key.js +130 -111
- data/lib/terminus/public/syn/mouse.js +2 -2
- data/lib/terminus/public/syn/synthetic.js +45 -34
- data/lib/terminus/public/terminus.js +183 -70
- data/lib/terminus/server.rb +6 -0
- data/lib/terminus/timeouts.rb +4 -2
- data/lib/terminus/views/bootstrap.erb +12 -27
- data/lib/terminus/views/index.erb +1 -1
- data/spec/reports/android.txt +875 -0
- data/spec/reports/chrome.txt +137 -8
- data/spec/reports/firefox.txt +137 -9
- data/spec/reports/opera.txt +142 -13
- data/spec/reports/phantomjs.txt +871 -0
- data/spec/reports/safari.txt +137 -8
- data/spec/spec_helper.rb +19 -17
- data/spec/terminus_driver_spec.rb +8 -6
- data/spec/terminus_session_spec.rb +4 -4
- metadata +209 -117
@@ -131,8 +131,8 @@
|
|
131
131
|
var j = Syn.jquery()(el),
|
132
132
|
o = j.offset();
|
133
133
|
return {
|
134
|
-
pageX: o.left + (j.
|
135
|
-
pageY: o.top + (j.
|
134
|
+
pageX: o.left + (j.outerWidth() / 2),
|
135
|
+
pageY: o.top + (j.outerHeight() / 2)
|
136
136
|
}
|
137
137
|
},
|
138
138
|
convertOption = function( option, win, from ) {
|
@@ -192,7 +192,6 @@
|
|
192
192
|
top =0;
|
193
193
|
diff = -off.top;
|
194
194
|
}
|
195
|
-
console.log("moving", from.clientY,from.clientY - diff, off.top, top )
|
196
195
|
from.clientY = from.clientY - diff;
|
197
196
|
to.clientY = to.clientY - diff;
|
198
197
|
Syn.helpers.scrollOffset(win,{top: top, left: off.left});
|
@@ -319,4 +318,4 @@
|
|
319
318
|
|
320
319
|
}
|
321
320
|
})
|
322
|
-
}()
|
321
|
+
})()
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
(function() {
|
2
2
|
var h = Syn.helpers,
|
3
3
|
S = Syn,
|
4
4
|
|
@@ -82,7 +82,6 @@ steal.then(function(){
|
|
82
82
|
|
83
83
|
|
84
84
|
};
|
85
|
-
|
86
85
|
/**
|
87
86
|
* @add Syn static
|
88
87
|
*/
|
@@ -129,124 +128,124 @@ steal.then(function(){
|
|
129
128
|
*/
|
130
129
|
keycodes: {
|
131
130
|
//backspace
|
132
|
-
'\b':
|
131
|
+
'\b': 8,
|
133
132
|
|
134
133
|
//tab
|
135
|
-
'\t':
|
134
|
+
'\t': 9,
|
136
135
|
|
137
136
|
//enter
|
138
|
-
'\r':
|
137
|
+
'\r': 13,
|
139
138
|
|
140
139
|
//special
|
141
|
-
'shift':
|
142
|
-
'ctrl':
|
143
|
-
'alt':
|
140
|
+
'shift': 16,
|
141
|
+
'ctrl': 17,
|
142
|
+
'alt': 18,
|
144
143
|
|
145
144
|
//weird
|
146
|
-
'pause-break':
|
147
|
-
'caps':
|
148
|
-
'escape':
|
149
|
-
'num-lock':
|
150
|
-
'scroll-lock':
|
151
|
-
'print':
|
145
|
+
'pause-break': 19,
|
146
|
+
'caps': 20,
|
147
|
+
'escape': 27,
|
148
|
+
'num-lock': 144,
|
149
|
+
'scroll-lock': 145,
|
150
|
+
'print': 44,
|
152
151
|
|
153
152
|
//navigation
|
154
|
-
'page-up':
|
155
|
-
'page-down':
|
156
|
-
'end':
|
157
|
-
'home':
|
158
|
-
'left':
|
159
|
-
'up':
|
160
|
-
'right':
|
161
|
-
'down':
|
162
|
-
'insert':
|
163
|
-
'delete':
|
153
|
+
'page-up': 33,
|
154
|
+
'page-down': 34,
|
155
|
+
'end': 35,
|
156
|
+
'home': 36,
|
157
|
+
'left': 37,
|
158
|
+
'up': 38,
|
159
|
+
'right': 39,
|
160
|
+
'down': 40,
|
161
|
+
'insert': 45,
|
162
|
+
'delete': 46,
|
164
163
|
|
165
164
|
//normal characters
|
166
|
-
' ':
|
167
|
-
'0':
|
168
|
-
'1':
|
169
|
-
'2':
|
170
|
-
'3':
|
171
|
-
'4':
|
172
|
-
'5':
|
173
|
-
'6':
|
174
|
-
'7':
|
175
|
-
'8':
|
176
|
-
'9':
|
177
|
-
'a':
|
178
|
-
'b':
|
179
|
-
'c':
|
180
|
-
'd':
|
181
|
-
'e':
|
182
|
-
'f':
|
183
|
-
'g':
|
184
|
-
'h':
|
185
|
-
'i':
|
186
|
-
'j':
|
187
|
-
'k':
|
188
|
-
'l':
|
189
|
-
'm':
|
190
|
-
'n':
|
191
|
-
'o':
|
192
|
-
'p':
|
193
|
-
'q':
|
194
|
-
'r':
|
195
|
-
's':
|
196
|
-
't':
|
197
|
-
'u':
|
198
|
-
'v':
|
199
|
-
'w':
|
200
|
-
'x':
|
201
|
-
'y':
|
202
|
-
'z':
|
165
|
+
' ': 32,
|
166
|
+
'0': 48,
|
167
|
+
'1': 49,
|
168
|
+
'2': 50,
|
169
|
+
'3': 51,
|
170
|
+
'4': 52,
|
171
|
+
'5': 53,
|
172
|
+
'6': 54,
|
173
|
+
'7': 55,
|
174
|
+
'8': 56,
|
175
|
+
'9': 57,
|
176
|
+
'a': 65,
|
177
|
+
'b': 66,
|
178
|
+
'c': 67,
|
179
|
+
'd': 68,
|
180
|
+
'e': 69,
|
181
|
+
'f': 70,
|
182
|
+
'g': 71,
|
183
|
+
'h': 72,
|
184
|
+
'i': 73,
|
185
|
+
'j': 74,
|
186
|
+
'k': 75,
|
187
|
+
'l': 76,
|
188
|
+
'm': 77,
|
189
|
+
'n': 78,
|
190
|
+
'o': 79,
|
191
|
+
'p': 80,
|
192
|
+
'q': 81,
|
193
|
+
'r': 82,
|
194
|
+
's': 83,
|
195
|
+
't': 84,
|
196
|
+
'u': 85,
|
197
|
+
'v': 86,
|
198
|
+
'w': 87,
|
199
|
+
'x': 88,
|
200
|
+
'y': 89,
|
201
|
+
'z': 90,
|
203
202
|
//normal-characters, numpad
|
204
|
-
'num0':
|
205
|
-
'num1':
|
206
|
-
'num2':
|
207
|
-
'num3':
|
208
|
-
'num4':
|
209
|
-
'num5':
|
210
|
-
'num6':
|
211
|
-
'num7':
|
212
|
-
'num8':
|
213
|
-
'num9':
|
214
|
-
'*':
|
215
|
-
'+':
|
216
|
-
'-':
|
217
|
-
'.':
|
203
|
+
'num0': 96,
|
204
|
+
'num1': 97,
|
205
|
+
'num2': 98,
|
206
|
+
'num3': 99,
|
207
|
+
'num4': 100,
|
208
|
+
'num5': 101,
|
209
|
+
'num6': 102,
|
210
|
+
'num7': 103,
|
211
|
+
'num8': 104,
|
212
|
+
'num9': 105,
|
213
|
+
'*': 106,
|
214
|
+
'+': 107,
|
215
|
+
'-': 109,
|
216
|
+
'.': 110,
|
218
217
|
//normal-characters, others
|
219
|
-
'/':
|
220
|
-
';':
|
221
|
-
'=':
|
222
|
-
',':
|
223
|
-
'-':
|
224
|
-
'.':
|
225
|
-
'/':
|
226
|
-
'`':
|
227
|
-
'[':
|
228
|
-
'\\':
|
229
|
-
']':
|
230
|
-
"'":
|
218
|
+
'/': 111,
|
219
|
+
';': 186,
|
220
|
+
'=': 187,
|
221
|
+
',': 188,
|
222
|
+
'-': 189,
|
223
|
+
'.': 190,
|
224
|
+
'/': 191,
|
225
|
+
'`': 192,
|
226
|
+
'[': 219,
|
227
|
+
'\\': 220,
|
228
|
+
']': 221,
|
229
|
+
"'": 222,
|
231
230
|
|
232
231
|
//ignore these, you shouldn't use them
|
233
|
-
'left window key':
|
234
|
-
'right window key':
|
235
|
-
'select key':
|
236
|
-
|
237
|
-
|
238
|
-
'f1':
|
239
|
-
'f2':
|
240
|
-
'f3':
|
241
|
-
'f4':
|
242
|
-
'f5':
|
243
|
-
'f6':
|
244
|
-
'f7':
|
245
|
-
'f8':
|
246
|
-
'f9':
|
247
|
-
'f10':
|
248
|
-
'f11':
|
249
|
-
'f12':
|
232
|
+
'left window key': 91,
|
233
|
+
'right window key': 92,
|
234
|
+
'select key': 93,
|
235
|
+
|
236
|
+
|
237
|
+
'f1': 112,
|
238
|
+
'f2': 113,
|
239
|
+
'f3': 114,
|
240
|
+
'f4': 115,
|
241
|
+
'f5': 116,
|
242
|
+
'f6': 117,
|
243
|
+
'f7': 118,
|
244
|
+
'f8': 119,
|
245
|
+
'f9': 120,
|
246
|
+
'f10': 121,
|
247
|
+
'f11': 122,
|
248
|
+
'f12': 123
|
250
249
|
},
|
251
250
|
|
252
251
|
// what we can type in
|
@@ -349,6 +348,13 @@ steal.then(function(){
|
|
349
348
|
result.charCode = charCode;
|
350
349
|
}
|
351
350
|
|
351
|
+
// all current browsers have which property to normalize keyCode/charCode
|
352
|
+
if(result.keyCode){
|
353
|
+
result.which = result.keyCode;
|
354
|
+
} else {
|
355
|
+
result.which = result.charCode;
|
356
|
+
}
|
357
|
+
|
352
358
|
|
353
359
|
return result
|
354
360
|
},
|
@@ -360,6 +366,8 @@ steal.then(function(){
|
|
360
366
|
'function': ['f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12']
|
361
367
|
},
|
362
368
|
//returns the default function
|
369
|
+
// some keys have default functions
|
370
|
+
// some 'kinds' of keys have default functions
|
363
371
|
getDefault: function( key ) {
|
364
372
|
//check if it is described directly
|
365
373
|
if ( Syn.key.defaults[key] ) {
|
@@ -727,8 +735,9 @@ steal.then(function(){
|
|
727
735
|
return;
|
728
736
|
}
|
729
737
|
|
730
|
-
|
731
|
-
var
|
738
|
+
// keep reference to current activeElement
|
739
|
+
var activeElement = h.getWindow(element).document.activeElement,
|
740
|
+
caret = Syn.typeable.test(element.nodeName) && getSelection(element),
|
732
741
|
key = convert[options] || options,
|
733
742
|
// should we run default events
|
734
743
|
runDefaults = Syn.trigger('keydown', key, element),
|
@@ -741,9 +750,8 @@ steal.then(function(){
|
|
741
750
|
|
742
751
|
// the result of the default event
|
743
752
|
defaultResult,
|
744
|
-
|
745
|
-
|
746
|
-
keypressOptions = Syn.key.options(key, 'keypress')
|
753
|
+
|
754
|
+
keypressOptions = Syn.key.options(key, 'keypress');
|
747
755
|
|
748
756
|
|
749
757
|
if ( runDefaults ) {
|
@@ -752,6 +760,11 @@ steal.then(function(){
|
|
752
760
|
defaultResult = getDefault(key).call(element, keypressOptions, h.getWindow(element), key, undefined, caret)
|
753
761
|
} else {
|
754
762
|
//do keypress
|
763
|
+
// check if activeElement changed b/c someone called focus in keydown
|
764
|
+
if( activeElement !== h.getWindow(element).document.activeElement ) {
|
765
|
+
element = h.getWindow(element).document.activeElement;
|
766
|
+
}
|
767
|
+
|
755
768
|
runDefaults = Syn.trigger('keypress', keypressOptions, element)
|
756
769
|
if ( runDefaults ) {
|
757
770
|
defaultResult = getDefault(key).call(element, keypressOptions, h.getWindow(element), key, undefined, caret)
|
@@ -760,6 +773,11 @@ steal.then(function(){
|
|
760
773
|
} else {
|
761
774
|
//canceled ... possibly don't run keypress
|
762
775
|
if ( keypressOptions && h.inArray('keypress', prevent.keydown) == -1 ) {
|
776
|
+
// check if activeElement changed b/c someone called focus in keydown
|
777
|
+
if( activeElement !== h.getWindow(element).document.activeElement ) {
|
778
|
+
element = h.getWindow(element).document.activeElement;
|
779
|
+
}
|
780
|
+
|
763
781
|
Syn.trigger('keypress', keypressOptions, element)
|
764
782
|
}
|
765
783
|
}
|
@@ -897,9 +915,10 @@ steal.then(function(){
|
|
897
915
|
})
|
898
916
|
Syn.trigger("keypress", "\r", anchor);
|
899
917
|
|
900
|
-
S.support.textareaCarriage = textarea.value.length == 4
|
918
|
+
S.support.textareaCarriage = textarea.value.length == 4;
|
919
|
+
|
901
920
|
document.documentElement.removeChild(div);
|
902
921
|
|
903
922
|
S.support.ready++;
|
904
923
|
})();
|
905
|
-
})
|
924
|
+
})()
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
(function(){
|
2
2
|
var extend = function( d, s ) {
|
3
3
|
var p;
|
4
4
|
for (p in s) {
|
@@ -186,8 +186,8 @@ steal.then(function(){
|
|
186
186
|
}
|
187
187
|
},
|
188
188
|
jquery: function( el, fast ) {
|
189
|
-
if ( window.FuncUnit && window.FuncUnit.
|
190
|
-
return window.FuncUnit.
|
189
|
+
if ( window.FuncUnit && window.FuncUnit.jQuery ) {
|
190
|
+
return window.FuncUnit.jQuery;
|
191
191
|
}
|
192
192
|
if ( el ) {
|
193
193
|
return Syn.helpers.getWindow(el).jQuery || window.jQuery;
|
@@ -529,19 +529,26 @@ steal.then(function(){
|
|
529
529
|
},
|
530
530
|
/**
|
531
531
|
* @attribute support
|
532
|
+
*
|
532
533
|
* Feature detected properties of a browser's event system.
|
533
534
|
* Support has the following properties:
|
534
|
-
*
|
535
|
-
*
|
536
|
-
*
|
537
|
-
*
|
538
|
-
*
|
539
|
-
*
|
540
|
-
*
|
541
|
-
*
|
542
|
-
*
|
543
|
-
*
|
544
|
-
*
|
535
|
+
*
|
536
|
+
* - `backspaceWorks` - typing a backspace removes a character
|
537
|
+
* - `clickChanges` - clicking on an option element creates a change event.
|
538
|
+
* - `clickSubmits` - clicking on a form button submits the form.
|
539
|
+
* - `focusChanges` - focus/blur creates a change event.
|
540
|
+
* - `keypressOnAnchorClicks` - Keying enter on an anchor triggers a click.
|
541
|
+
* - `keypressSubmits` - enter key submits
|
542
|
+
* - `keyCharacters` - typing a character shows up
|
543
|
+
* - `keysOnNotFocused` - enters keys when not focused.
|
544
|
+
* - `linkHrefJS` - An achor's href JavaScript is run.
|
545
|
+
* - `mouseDownUpClicks` - A mousedown followed by mouseup creates a click event.
|
546
|
+
* - `mouseupSubmits` - a mouseup on a form button submits the form.
|
547
|
+
* - `radioClickChanges` - clicking a radio button changes the radio.
|
548
|
+
* - `tabKeyTabs` - A tab key changes tabs.
|
549
|
+
* - `textareaCarriage` - a new line in a textarea creates a carriage return.
|
550
|
+
*
|
551
|
+
*
|
545
552
|
*/
|
546
553
|
support: {
|
547
554
|
clickChanges: false,
|
@@ -807,24 +814,28 @@ steal.then(function(){
|
|
807
814
|
};
|
808
815
|
},
|
809
816
|
i = 0;
|
810
|
-
for ( ; i < actions.length; i++ ) {
|
811
|
-
makeAction(actions[i]);
|
812
|
-
}
|
813
|
-
/**
|
814
|
-
* Used for creating and dispatching synthetic events.
|
815
|
-
* @codestart
|
816
|
-
* new MVC.Syn('click').send(MVC.$E('id'))
|
817
|
-
* @codeend
|
818
|
-
* @constructor Sets up a synthetic event.
|
819
|
-
* @param {String} type type of event, ex: 'click'
|
820
|
-
* @param {optional:Object} options
|
821
|
-
*/
|
822
|
-
if ( window.jQuery || (window.FuncUnit && window.FuncUnit.jquery) ) {
|
823
|
-
((window.FuncUnit && window.FuncUnit.jquery) || window.jQuery).fn.triggerSyn = function( type, options, callback ) {
|
824
|
-
Syn(type, options, this[0], callback);
|
825
|
-
return this;
|
826
|
-
};
|
827
|
-
}
|
828
817
|
|
829
|
-
|
830
|
-
|
818
|
+
for ( ; i < actions.length; i++ ) {
|
819
|
+
makeAction(actions[i]);
|
820
|
+
}
|
821
|
+
/**
|
822
|
+
* Used for creating and dispatching synthetic events.
|
823
|
+
* @codestart
|
824
|
+
* new MVC.Syn('click').send(MVC.$E('id'))
|
825
|
+
* @codeend
|
826
|
+
* @constructor Sets up a synthetic event.
|
827
|
+
* @param {String} type type of event, ex: 'click'
|
828
|
+
* @param {optional:Object} options
|
829
|
+
*/
|
830
|
+
if ( (window.FuncUnit && window.FuncUnit.jQuery) || window.jQuery ) {
|
831
|
+
((window.FuncUnit && window.FuncUnit.jQuery) || window.jQuery).fn.triggerSyn = function( type, options, callback ) {
|
832
|
+
if(!this[0]){
|
833
|
+
throw "Can't "+type.substring(1)+" because no element matching '"+this.selector+"' was found"
|
834
|
+
}
|
835
|
+
Syn(type, options, this[0], callback);
|
836
|
+
return this;
|
837
|
+
};
|
838
|
+
}
|
839
|
+
|
840
|
+
window.Syn = Syn;
|
841
|
+
})()
|