selenium-core-runner 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/Gemfile +9 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +30 -0
  5. data/app/controllers/selenium_core_runner/suites_controller.rb +19 -0
  6. data/app/views/selenium_core_runner/suites/index.html.erb +177 -0
  7. data/app/views/selenium_core_runner/suites/show.html.erb +0 -0
  8. data/config/routes.rb +6 -0
  9. data/lib/selenium-core-runner/engine.rb +19 -0
  10. data/lib/selenium-core-runner.rb +3 -0
  11. data/public/selenium-core-runner/Blank.html +7 -0
  12. data/public/selenium-core-runner/InjectedRemoteRunner.html +8 -0
  13. data/public/selenium-core-runner/RemoteRunner.html +101 -0
  14. data/public/selenium-core-runner/SeleniumLog.html +109 -0
  15. data/public/selenium-core-runner/TestPrompt.html +145 -0
  16. data/public/selenium-core-runner/TestRunner-splash.html +55 -0
  17. data/public/selenium-core-runner/TestRunner.hta +177 -0
  18. data/public/selenium-core-runner/TestRunner.html +177 -0
  19. data/public/selenium-core-runner/icons/all.png +0 -0
  20. data/public/selenium-core-runner/icons/continue.png +0 -0
  21. data/public/selenium-core-runner/icons/continue_disabled.png +0 -0
  22. data/public/selenium-core-runner/icons/pause.png +0 -0
  23. data/public/selenium-core-runner/icons/pause_disabled.png +0 -0
  24. data/public/selenium-core-runner/icons/selected.png +0 -0
  25. data/public/selenium-core-runner/icons/step.png +0 -0
  26. data/public/selenium-core-runner/icons/step_disabled.png +0 -0
  27. data/public/selenium-core-runner/iedoc-core.xml +1789 -0
  28. data/public/selenium-core-runner/iedoc.xml +1830 -0
  29. data/public/selenium-core-runner/lib/cssQuery/cssQuery-p.js +6 -0
  30. data/public/selenium-core-runner/lib/cssQuery/src/cssQuery-level2.js +142 -0
  31. data/public/selenium-core-runner/lib/cssQuery/src/cssQuery-level3.js +150 -0
  32. data/public/selenium-core-runner/lib/cssQuery/src/cssQuery-standard.js +53 -0
  33. data/public/selenium-core-runner/lib/cssQuery/src/cssQuery.js +356 -0
  34. data/public/selenium-core-runner/lib/prototype.js +2006 -0
  35. data/public/selenium-core-runner/lib/scriptaculous/builder.js +101 -0
  36. data/public/selenium-core-runner/lib/scriptaculous/controls.js +815 -0
  37. data/public/selenium-core-runner/lib/scriptaculous/dragdrop.js +915 -0
  38. data/public/selenium-core-runner/lib/scriptaculous/effects.js +958 -0
  39. data/public/selenium-core-runner/lib/scriptaculous/scriptaculous.js +47 -0
  40. data/public/selenium-core-runner/lib/scriptaculous/slider.js +283 -0
  41. data/public/selenium-core-runner/lib/scriptaculous/unittest.js +383 -0
  42. data/public/selenium-core-runner/lib/snapsie.js +91 -0
  43. data/public/selenium-core-runner/scripts/find_matching_child.js +69 -0
  44. data/public/selenium-core-runner/scripts/htmlutils.js +1623 -0
  45. data/public/selenium-core-runner/scripts/injection.html +72 -0
  46. data/public/selenium-core-runner/scripts/selenium-api.js +3240 -0
  47. data/public/selenium-core-runner/scripts/selenium-browserbot.js +2333 -0
  48. data/public/selenium-core-runner/scripts/selenium-browserdetect.js +153 -0
  49. data/public/selenium-core-runner/scripts/selenium-commandhandlers.js +379 -0
  50. data/public/selenium-core-runner/scripts/selenium-executionloop.js +175 -0
  51. data/public/selenium-core-runner/scripts/selenium-logging.js +148 -0
  52. data/public/selenium-core-runner/scripts/selenium-remoterunner.js +695 -0
  53. data/public/selenium-core-runner/scripts/selenium-testrunner.js +1362 -0
  54. data/public/selenium-core-runner/scripts/selenium-version.js +5 -0
  55. data/public/selenium-core-runner/scripts/ui-doc.html +803 -0
  56. data/public/selenium-core-runner/scripts/ui-element.js +1627 -0
  57. data/public/selenium-core-runner/scripts/ui-map-sample.js +979 -0
  58. data/public/selenium-core-runner/scripts/user-extensions.js +3 -0
  59. data/public/selenium-core-runner/scripts/user-extensions.js.sample +75 -0
  60. data/public/selenium-core-runner/scripts/xmlextras.js +153 -0
  61. data/public/selenium-core-runner/selenium-logo.png +0 -0
  62. data/public/selenium-core-runner/selenium-test.css +43 -0
  63. data/public/selenium-core-runner/selenium.css +316 -0
  64. data/public/selenium-core-runner/xpath/dom.js +566 -0
  65. data/public/selenium-core-runner/xpath/javascript-xpath-0.1.11.js +2816 -0
  66. data/public/selenium-core-runner/xpath/util.js +549 -0
  67. data/public/selenium-core-runner/xpath/xmltoken.js +149 -0
  68. data/public/selenium-core-runner/xpath/xpath.js +2481 -0
  69. metadata +121 -0
@@ -0,0 +1,47 @@
1
+ // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining
4
+ // a copy of this software and associated documentation files (the
5
+ // "Software"), to deal in the Software without restriction, including
6
+ // without limitation the rights to use, copy, modify, merge, publish,
7
+ // distribute, sublicense, and/or sell copies of the Software, and to
8
+ // permit persons to whom the Software is furnished to do so, subject to
9
+ // the following conditions:
10
+ //
11
+ // The above copyright notice and this permission notice shall be
12
+ // included in all copies or substantial portions of the Software.
13
+ //
14
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ var Scriptaculous = {
23
+ Version: '1.6.1',
24
+ require: function(libraryName) {
25
+ // inserting via DOM fails in Safari 2.0, so brute force approach
26
+ document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
27
+ },
28
+ load: function() {
29
+ if((typeof Prototype=='undefined') ||
30
+ (typeof Element == 'undefined') ||
31
+ (typeof Element.Methods=='undefined') ||
32
+ parseFloat(Prototype.Version.split(".")[0] + "." +
33
+ Prototype.Version.split(".")[1]) < 1.5)
34
+ throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
35
+
36
+ $A(document.getElementsByTagName("script")).findAll( function(s) {
37
+ return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
38
+ }).each( function(s) {
39
+ var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
40
+ var includes = s.src.match(/\?.*load=([a-z,]*)/);
41
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
42
+ function(include) { Scriptaculous.require(path+include+'.js') });
43
+ });
44
+ }
45
+ }
46
+
47
+ Scriptaculous.load();
@@ -0,0 +1,283 @@
1
+ // Copyright (c) 2005 Marty Haught, Thomas Fuchs
2
+ //
3
+ // See http://script.aculo.us for more info
4
+ //
5
+ // Permission is hereby granted, free of charge, to any person obtaining
6
+ // a copy of this software and associated documentation files (the
7
+ // "Software"), to deal in the Software without restriction, including
8
+ // without limitation the rights to use, copy, modify, merge, publish,
9
+ // distribute, sublicense, and/or sell copies of the Software, and to
10
+ // permit persons to whom the Software is furnished to do so, subject to
11
+ // the following conditions:
12
+ //
13
+ // The above copyright notice and this permission notice shall be
14
+ // included in all copies or substantial portions of the Software.
15
+ //
16
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ if(!Control) var Control = {};
25
+ Control.Slider = Class.create();
26
+
27
+ // options:
28
+ // axis: 'vertical', or 'horizontal' (default)
29
+ //
30
+ // callbacks:
31
+ // onChange(value)
32
+ // onSlide(value)
33
+ Control.Slider.prototype = {
34
+ initialize: function(handle, track, options) {
35
+ var slider = this;
36
+
37
+ if(handle instanceof Array) {
38
+ this.handles = handle.collect( function(e) { return $(e) });
39
+ } else {
40
+ this.handles = [$(handle)];
41
+ }
42
+
43
+ this.track = $(track);
44
+ this.options = options || {};
45
+
46
+ this.axis = this.options.axis || 'horizontal';
47
+ this.increment = this.options.increment || 1;
48
+ this.step = parseInt(this.options.step || '1');
49
+ this.range = this.options.range || $R(0,1);
50
+
51
+ this.value = 0; // assure backwards compat
52
+ this.values = this.handles.map( function() { return 0 });
53
+ this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
54
+ this.options.startSpan = $(this.options.startSpan || null);
55
+ this.options.endSpan = $(this.options.endSpan || null);
56
+
57
+ this.restricted = this.options.restricted || false;
58
+
59
+ this.maximum = this.options.maximum || this.range.end;
60
+ this.minimum = this.options.minimum || this.range.start;
61
+
62
+ // Will be used to align the handle onto the track, if necessary
63
+ this.alignX = parseInt(this.options.alignX || '0');
64
+ this.alignY = parseInt(this.options.alignY || '0');
65
+
66
+ this.trackLength = this.maximumOffset() - this.minimumOffset();
67
+ this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
68
+
69
+ this.active = false;
70
+ this.dragging = false;
71
+ this.disabled = false;
72
+
73
+ if(this.options.disabled) this.setDisabled();
74
+
75
+ // Allowed values array
76
+ this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
77
+ if(this.allowedValues) {
78
+ this.minimum = this.allowedValues.min();
79
+ this.maximum = this.allowedValues.max();
80
+ }
81
+
82
+ this.eventMouseDown = this.startDrag.bindAsEventListener(this);
83
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
84
+ this.eventMouseMove = this.update.bindAsEventListener(this);
85
+
86
+ // Initialize handles in reverse (make sure first handle is active)
87
+ this.handles.each( function(h,i) {
88
+ i = slider.handles.length-1-i;
89
+ slider.setValue(parseFloat(
90
+ (slider.options.sliderValue instanceof Array ?
91
+ slider.options.sliderValue[i] : slider.options.sliderValue) ||
92
+ slider.range.start), i);
93
+ Element.makePositioned(h); // fix IE
94
+ Event.observe(h, "mousedown", slider.eventMouseDown);
95
+ });
96
+
97
+ Event.observe(this.track, "mousedown", this.eventMouseDown);
98
+ Event.observe(document, "mouseup", this.eventMouseUp);
99
+ Event.observe(document, "mousemove", this.eventMouseMove);
100
+
101
+ this.initialized = true;
102
+ },
103
+ dispose: function() {
104
+ var slider = this;
105
+ Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
106
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
107
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
108
+ this.handles.each( function(h) {
109
+ Event.stopObserving(h, "mousedown", slider.eventMouseDown);
110
+ });
111
+ },
112
+ setDisabled: function(){
113
+ this.disabled = true;
114
+ },
115
+ setEnabled: function(){
116
+ this.disabled = false;
117
+ },
118
+ getNearestValue: function(value){
119
+ if(this.allowedValues){
120
+ if(value >= this.allowedValues.max()) return(this.allowedValues.max());
121
+ if(value <= this.allowedValues.min()) return(this.allowedValues.min());
122
+
123
+ var offset = Math.abs(this.allowedValues[0] - value);
124
+ var newValue = this.allowedValues[0];
125
+ this.allowedValues.each( function(v) {
126
+ var currentOffset = Math.abs(v - value);
127
+ if(currentOffset <= offset){
128
+ newValue = v;
129
+ offset = currentOffset;
130
+ }
131
+ });
132
+ return newValue;
133
+ }
134
+ if(value > this.range.end) return this.range.end;
135
+ if(value < this.range.start) return this.range.start;
136
+ return value;
137
+ },
138
+ setValue: function(sliderValue, handleIdx){
139
+ if(!this.active) {
140
+ this.activeHandle = this.handles[handleIdx];
141
+ this.activeHandleIdx = handleIdx;
142
+ this.updateStyles();
143
+ }
144
+ handleIdx = handleIdx || this.activeHandleIdx || 0;
145
+ if(this.initialized && this.restricted) {
146
+ if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
147
+ sliderValue = this.values[handleIdx-1];
148
+ if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
149
+ sliderValue = this.values[handleIdx+1];
150
+ }
151
+ sliderValue = this.getNearestValue(sliderValue);
152
+ this.values[handleIdx] = sliderValue;
153
+ this.value = this.values[0]; // assure backwards compat
154
+
155
+ this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
156
+ this.translateToPx(sliderValue);
157
+
158
+ this.drawSpans();
159
+ if(!this.dragging || !this.event) this.updateFinished();
160
+ },
161
+ setValueBy: function(delta, handleIdx) {
162
+ this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
163
+ handleIdx || this.activeHandleIdx || 0);
164
+ },
165
+ translateToPx: function(value) {
166
+ return Math.round(
167
+ ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
168
+ (value - this.range.start)) + "px";
169
+ },
170
+ translateToValue: function(offset) {
171
+ return ((offset/(this.trackLength-this.handleLength) *
172
+ (this.range.end-this.range.start)) + this.range.start);
173
+ },
174
+ getRange: function(range) {
175
+ var v = this.values.sortBy(Prototype.K);
176
+ range = range || 0;
177
+ return $R(v[range],v[range+1]);
178
+ },
179
+ minimumOffset: function(){
180
+ return(this.isVertical() ? this.alignY : this.alignX);
181
+ },
182
+ maximumOffset: function(){
183
+ return(this.isVertical() ?
184
+ this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
185
+ },
186
+ isVertical: function(){
187
+ return (this.axis == 'vertical');
188
+ },
189
+ drawSpans: function() {
190
+ var slider = this;
191
+ if(this.spans)
192
+ $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
193
+ if(this.options.startSpan)
194
+ this.setSpan(this.options.startSpan,
195
+ $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
196
+ if(this.options.endSpan)
197
+ this.setSpan(this.options.endSpan,
198
+ $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
199
+ },
200
+ setSpan: function(span, range) {
201
+ if(this.isVertical()) {
202
+ span.style.top = this.translateToPx(range.start);
203
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);
204
+ } else {
205
+ span.style.left = this.translateToPx(range.start);
206
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);
207
+ }
208
+ },
209
+ updateStyles: function() {
210
+ this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
211
+ Element.addClassName(this.activeHandle, 'selected');
212
+ },
213
+ startDrag: function(event) {
214
+ if(Event.isLeftClick(event)) {
215
+ if(!this.disabled){
216
+ this.active = true;
217
+
218
+ var handle = Event.element(event);
219
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
220
+ if(handle==this.track) {
221
+ var offsets = Position.cumulativeOffset(this.track);
222
+ this.event = event;
223
+ this.setValue(this.translateToValue(
224
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
225
+ ));
226
+ var offsets = Position.cumulativeOffset(this.activeHandle);
227
+ this.offsetX = (pointer[0] - offsets[0]);
228
+ this.offsetY = (pointer[1] - offsets[1]);
229
+ } else {
230
+ // find the handle (prevents issues with Safari)
231
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode)
232
+ handle = handle.parentNode;
233
+
234
+ this.activeHandle = handle;
235
+ this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
236
+ this.updateStyles();
237
+
238
+ var offsets = Position.cumulativeOffset(this.activeHandle);
239
+ this.offsetX = (pointer[0] - offsets[0]);
240
+ this.offsetY = (pointer[1] - offsets[1]);
241
+ }
242
+ }
243
+ Event.stop(event);
244
+ }
245
+ },
246
+ update: function(event) {
247
+ if(this.active) {
248
+ if(!this.dragging) this.dragging = true;
249
+ this.draw(event);
250
+ // fix AppleWebKit rendering
251
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
252
+ Event.stop(event);
253
+ }
254
+ },
255
+ draw: function(event) {
256
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
257
+ var offsets = Position.cumulativeOffset(this.track);
258
+ pointer[0] -= this.offsetX + offsets[0];
259
+ pointer[1] -= this.offsetY + offsets[1];
260
+ this.event = event;
261
+ this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
262
+ if(this.initialized && this.options.onSlide)
263
+ this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
264
+ },
265
+ endDrag: function(event) {
266
+ if(this.active && this.dragging) {
267
+ this.finishDrag(event, true);
268
+ Event.stop(event);
269
+ }
270
+ this.active = false;
271
+ this.dragging = false;
272
+ },
273
+ finishDrag: function(event, success) {
274
+ this.active = false;
275
+ this.dragging = false;
276
+ this.updateFinished();
277
+ },
278
+ updateFinished: function() {
279
+ if(this.initialized && this.options.onChange)
280
+ this.options.onChange(this.values.length>1 ? this.values : this.value, this);
281
+ this.event = null;
282
+ }
283
+ }