rainux-selenium-webdriver 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/COPYING +204 -0
  2. data/chrome/prebuilt/Win32/Release/npchromedriver.dll +0 -0
  3. data/chrome/prebuilt/x64/Release/npchromedriver.dll +0 -0
  4. data/chrome/src/extension/background.html +9 -0
  5. data/chrome/src/extension/background.js +995 -0
  6. data/chrome/src/extension/content_script.js +1321 -0
  7. data/chrome/src/extension/icons/busy.png +0 -0
  8. data/chrome/src/extension/icons/free.png +0 -0
  9. data/chrome/src/extension/manifest-nonwin.json +19 -0
  10. data/chrome/src/extension/manifest-win.json +20 -0
  11. data/chrome/src/extension/utils.js +231 -0
  12. data/chrome/src/rb/lib/selenium/webdriver/chrome.rb +8 -0
  13. data/chrome/src/rb/lib/selenium/webdriver/chrome/bridge.rb +358 -0
  14. data/chrome/src/rb/lib/selenium/webdriver/chrome/command_executor.rb +124 -0
  15. data/chrome/src/rb/lib/selenium/webdriver/chrome/launcher.rb +135 -0
  16. data/common/src/js/abstractcommandprocessor.js +134 -0
  17. data/common/src/js/asserts.js +296 -0
  18. data/common/src/js/by.js +149 -0
  19. data/common/src/js/command.js +304 -0
  20. data/common/src/js/context.js +58 -0
  21. data/common/src/js/core/Blank.html +7 -0
  22. data/common/src/js/core/InjectedRemoteRunner.html +8 -0
  23. data/common/src/js/core/RemoteRunner.html +101 -0
  24. data/common/src/js/core/SeleniumLog.html +109 -0
  25. data/common/src/js/core/TestPrompt.html +145 -0
  26. data/common/src/js/core/TestRunner-splash.html +55 -0
  27. data/common/src/js/core/TestRunner.html +165 -0
  28. data/common/src/js/core/icons/all.png +0 -0
  29. data/common/src/js/core/icons/continue.png +0 -0
  30. data/common/src/js/core/icons/continue_disabled.png +0 -0
  31. data/common/src/js/core/icons/pause.png +0 -0
  32. data/common/src/js/core/icons/pause_disabled.png +0 -0
  33. data/common/src/js/core/icons/selected.png +0 -0
  34. data/common/src/js/core/icons/step.png +0 -0
  35. data/common/src/js/core/icons/step_disabled.png +0 -0
  36. data/common/src/js/core/lib/cssQuery/cssQuery-p.js +6 -0
  37. data/common/src/js/core/lib/cssQuery/src/cssQuery-level2.js +142 -0
  38. data/common/src/js/core/lib/cssQuery/src/cssQuery-level3.js +150 -0
  39. data/common/src/js/core/lib/cssQuery/src/cssQuery-standard.js +53 -0
  40. data/common/src/js/core/lib/cssQuery/src/cssQuery.js +356 -0
  41. data/common/src/js/core/lib/prototype.js +2006 -0
  42. data/common/src/js/core/lib/scriptaculous/builder.js +101 -0
  43. data/common/src/js/core/lib/scriptaculous/controls.js +815 -0
  44. data/common/src/js/core/lib/scriptaculous/dragdrop.js +915 -0
  45. data/common/src/js/core/lib/scriptaculous/effects.js +958 -0
  46. data/common/src/js/core/lib/scriptaculous/scriptaculous.js +47 -0
  47. data/common/src/js/core/lib/scriptaculous/slider.js +283 -0
  48. data/common/src/js/core/lib/scriptaculous/unittest.js +383 -0
  49. data/common/src/js/core/lib/snapsie.js +91 -0
  50. data/common/src/js/core/scripts/find_matching_child.js +69 -0
  51. data/common/src/js/core/scripts/htmlutils.js +8716 -0
  52. data/common/src/js/core/scripts/injection.html +72 -0
  53. data/common/src/js/core/scripts/selenium-api.js +3291 -0
  54. data/common/src/js/core/scripts/selenium-browserbot.js +2457 -0
  55. data/common/src/js/core/scripts/selenium-browserdetect.js +153 -0
  56. data/common/src/js/core/scripts/selenium-commandhandlers.js +379 -0
  57. data/common/src/js/core/scripts/selenium-executionloop.js +175 -0
  58. data/common/src/js/core/scripts/selenium-logging.js +148 -0
  59. data/common/src/js/core/scripts/selenium-remoterunner.js +695 -0
  60. data/common/src/js/core/scripts/selenium-testrunner.js +1362 -0
  61. data/common/src/js/core/scripts/selenium-version.js +5 -0
  62. data/common/src/js/core/scripts/ui-doc.html +808 -0
  63. data/common/src/js/core/scripts/ui-element.js +1644 -0
  64. data/common/src/js/core/scripts/ui-map-sample.js +979 -0
  65. data/common/src/js/core/scripts/user-extensions.js +3 -0
  66. data/common/src/js/core/scripts/user-extensions.js.sample +75 -0
  67. data/common/src/js/core/scripts/xmlextras.js +153 -0
  68. data/common/src/js/core/selenium-logo.png +0 -0
  69. data/common/src/js/core/selenium-test.css +43 -0
  70. data/common/src/js/core/selenium.css +316 -0
  71. data/common/src/js/core/xpath/dom.js +566 -0
  72. data/common/src/js/core/xpath/javascript-xpath-0.1.11.js +2816 -0
  73. data/common/src/js/core/xpath/util.js +549 -0
  74. data/common/src/js/core/xpath/xmltoken.js +149 -0
  75. data/common/src/js/core/xpath/xpath.js +2481 -0
  76. data/common/src/js/extension/README +2 -0
  77. data/common/src/js/extension/dommessenger.js +152 -0
  78. data/common/src/js/factory.js +55 -0
  79. data/common/src/js/future.js +141 -0
  80. data/common/src/js/jsunit.js +40 -0
  81. data/common/src/js/jsunit/app/css/jsUnitStyle.css +50 -0
  82. data/common/src/js/jsunit/app/css/readme +10 -0
  83. data/common/src/js/jsunit/app/emptyPage.html +11 -0
  84. data/common/src/js/jsunit/app/jsUnitCore.js +534 -0
  85. data/common/src/js/jsunit/app/jsUnitMockTimeout.js +81 -0
  86. data/common/src/js/jsunit/app/jsUnitTestManager.js +705 -0
  87. data/common/src/js/jsunit/app/jsUnitTestSuite.js +44 -0
  88. data/common/src/js/jsunit/app/jsUnitTracer.js +102 -0
  89. data/common/src/js/jsunit/app/jsUnitVersionCheck.js +59 -0
  90. data/common/src/js/jsunit/app/main-counts-errors.html +12 -0
  91. data/common/src/js/jsunit/app/main-counts-failures.html +13 -0
  92. data/common/src/js/jsunit/app/main-counts-runs.html +13 -0
  93. data/common/src/js/jsunit/app/main-counts.html +21 -0
  94. data/common/src/js/jsunit/app/main-data.html +178 -0
  95. data/common/src/js/jsunit/app/main-errors.html +23 -0
  96. data/common/src/js/jsunit/app/main-frame.html +19 -0
  97. data/common/src/js/jsunit/app/main-loader.html +45 -0
  98. data/common/src/js/jsunit/app/main-progress.html +25 -0
  99. data/common/src/js/jsunit/app/main-results.html +67 -0
  100. data/common/src/js/jsunit/app/main-status.html +13 -0
  101. data/common/src/js/jsunit/app/testContainer.html +16 -0
  102. data/common/src/js/jsunit/app/testContainerController.html +77 -0
  103. data/common/src/js/jsunit/app/xbDebug.js +306 -0
  104. data/common/src/js/jsunit/changelog.txt +60 -0
  105. data/common/src/js/jsunit/css/jsUnitStyle.css +83 -0
  106. data/common/src/js/jsunit/images/green.gif +0 -0
  107. data/common/src/js/jsunit/images/logo_jsunit.gif +0 -0
  108. data/common/src/js/jsunit/images/powerby-transparent.gif +0 -0
  109. data/common/src/js/jsunit/images/red.gif +0 -0
  110. data/common/src/js/jsunit/licenses/JDOM_license.txt +56 -0
  111. data/common/src/js/jsunit/licenses/Jetty_license.html +213 -0
  112. data/common/src/js/jsunit/licenses/MPL-1.1.txt +470 -0
  113. data/common/src/js/jsunit/licenses/gpl-2.txt +340 -0
  114. data/common/src/js/jsunit/licenses/index.html +141 -0
  115. data/common/src/js/jsunit/licenses/lgpl-2.1.txt +504 -0
  116. data/common/src/js/jsunit/licenses/mpl-tri-license-c.txt +35 -0
  117. data/common/src/js/jsunit/licenses/mpl-tri-license-html.txt +35 -0
  118. data/common/src/js/jsunit/readme.txt +19 -0
  119. data/common/src/js/jsunit/testRunner.html +167 -0
  120. data/common/src/js/jsunit/version.txt +1 -0
  121. data/common/src/js/key.js +117 -0
  122. data/common/src/js/localcommandprocessor.js +185 -0
  123. data/common/src/js/testcase.js +217 -0
  124. data/common/src/js/timing.js +89 -0
  125. data/common/src/js/webdriver.js +890 -0
  126. data/common/src/js/webelement.js +485 -0
  127. data/common/src/rb/README +30 -0
  128. data/common/src/rb/lib/selenium-webdriver.rb +1 -0
  129. data/common/src/rb/lib/selenium/webdriver.rb +67 -0
  130. data/common/src/rb/lib/selenium/webdriver/bridge_helper.rb +91 -0
  131. data/common/src/rb/lib/selenium/webdriver/child_process.rb +180 -0
  132. data/common/src/rb/lib/selenium/webdriver/core_ext/dir.rb +41 -0
  133. data/common/src/rb/lib/selenium/webdriver/driver.rb +252 -0
  134. data/common/src/rb/lib/selenium/webdriver/driver_extensions/takes_screenshot.rb +24 -0
  135. data/common/src/rb/lib/selenium/webdriver/element.rb +262 -0
  136. data/common/src/rb/lib/selenium/webdriver/error.rb +67 -0
  137. data/common/src/rb/lib/selenium/webdriver/find.rb +89 -0
  138. data/common/src/rb/lib/selenium/webdriver/keys.rb +84 -0
  139. data/common/src/rb/lib/selenium/webdriver/navigation.rb +27 -0
  140. data/common/src/rb/lib/selenium/webdriver/options.rb +50 -0
  141. data/common/src/rb/lib/selenium/webdriver/platform.rb +86 -0
  142. data/common/src/rb/lib/selenium/webdriver/target_locator.rb +70 -0
  143. data/firefox/prebuilt/Win32/Release/webdriver-firefox.dll +0 -0
  144. data/firefox/prebuilt/linux/Release/libwebdriver-firefox.so +0 -0
  145. data/firefox/prebuilt/linux/Release/x_ignore_nofocus.so +0 -0
  146. data/firefox/prebuilt/linux64/Release/libwebdriver-firefox.so +0 -0
  147. data/firefox/prebuilt/linux64/Release/x_ignore_nofocus.so +0 -0
  148. data/firefox/prebuilt/nsICommandProcessor.xpt +0 -0
  149. data/firefox/prebuilt/nsINativeEvents.xpt +0 -0
  150. data/firefox/prebuilt/nsIResponseHandler.xpt +0 -0
  151. data/firefox/src/extension/chrome.manifest +3 -0
  152. data/firefox/src/extension/components/badCertListener.js +294 -0
  153. data/firefox/src/extension/components/context.js +37 -0
  154. data/firefox/src/extension/components/driver-component.js +127 -0
  155. data/firefox/src/extension/components/firefoxDriver.js +810 -0
  156. data/firefox/src/extension/components/json2.js +273 -0
  157. data/firefox/src/extension/components/keytest.html +554 -0
  158. data/firefox/src/extension/components/nsCommandProcessor.js +643 -0
  159. data/firefox/src/extension/components/promptService.js +208 -0
  160. data/firefox/src/extension/components/screenshooter.js +81 -0
  161. data/firefox/src/extension/components/socketListener.js +185 -0
  162. data/firefox/src/extension/components/utils.js +1263 -0
  163. data/firefox/src/extension/components/webLoadingListener.js +57 -0
  164. data/firefox/src/extension/components/webdriverserver.js +106 -0
  165. data/firefox/src/extension/components/wrappedElement.js +683 -0
  166. data/firefox/src/extension/content/fxdriver.xul +30 -0
  167. data/firefox/src/extension/content/server.js +95 -0
  168. data/firefox/src/extension/idl/nsICommandProcessor.idl +38 -0
  169. data/firefox/src/extension/idl/nsIResponseHandler.idl +34 -0
  170. data/firefox/src/extension/install.rdf +29 -0
  171. data/firefox/src/rb/lib/selenium/webdriver/firefox.rb +31 -0
  172. data/firefox/src/rb/lib/selenium/webdriver/firefox/binary.rb +107 -0
  173. data/firefox/src/rb/lib/selenium/webdriver/firefox/bridge.rb +484 -0
  174. data/firefox/src/rb/lib/selenium/webdriver/firefox/extension_connection.rb +90 -0
  175. data/firefox/src/rb/lib/selenium/webdriver/firefox/launcher.rb +155 -0
  176. data/firefox/src/rb/lib/selenium/webdriver/firefox/profile.rb +233 -0
  177. data/firefox/src/rb/lib/selenium/webdriver/firefox/profiles_ini.rb +59 -0
  178. data/firefox/src/rb/lib/selenium/webdriver/firefox/util.rb +23 -0
  179. data/jobbie/prebuilt/Win32/Release/InternetExplorerDriver.dll +0 -0
  180. data/jobbie/prebuilt/x64/Release/InternetExplorerDriver.dll +0 -0
  181. data/jobbie/src/rb/lib/selenium/webdriver/ie.rb +14 -0
  182. data/jobbie/src/rb/lib/selenium/webdriver/ie/bridge.rb +565 -0
  183. data/jobbie/src/rb/lib/selenium/webdriver/ie/lib.rb +99 -0
  184. data/jobbie/src/rb/lib/selenium/webdriver/ie/util.rb +147 -0
  185. data/remote/client/src/rb/lib/selenium/webdriver/remote.rb +16 -0
  186. data/remote/client/src/rb/lib/selenium/webdriver/remote/bridge.rb +408 -0
  187. data/remote/client/src/rb/lib/selenium/webdriver/remote/capabilities.rb +105 -0
  188. data/remote/client/src/rb/lib/selenium/webdriver/remote/commands.rb +53 -0
  189. data/remote/client/src/rb/lib/selenium/webdriver/remote/default_http_client.rb +71 -0
  190. data/remote/client/src/rb/lib/selenium/webdriver/remote/response.rb +49 -0
  191. data/remote/client/src/rb/lib/selenium/webdriver/remote/server_error.rb +32 -0
  192. metadata +303 -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
+ }
@@ -0,0 +1,383 @@
1
+ // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
2
+ // (c) 2005 Jon Tirsen (http://www.tirsen.com)
3
+ // (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
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
+
25
+ // experimental, Firefox-only
26
+ Event.simulateMouse = function(element, eventName) {
27
+ var options = Object.extend({
28
+ pointerX: 0,
29
+ pointerY: 0,
30
+ buttons: 0
31
+ }, arguments[2] || {});
32
+ var oEvent = document.createEvent("MouseEvents");
33
+ oEvent.initMouseEvent(eventName, true, true, document.defaultView,
34
+ options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
35
+ false, false, false, false, 0, $(element));
36
+
37
+ if(this.mark) Element.remove(this.mark);
38
+ this.mark = document.createElement('div');
39
+ this.mark.appendChild(document.createTextNode(" "));
40
+ document.body.appendChild(this.mark);
41
+ this.mark.style.position = 'absolute';
42
+ this.mark.style.top = options.pointerY + "px";
43
+ this.mark.style.left = options.pointerX + "px";
44
+ this.mark.style.width = "5px";
45
+ this.mark.style.height = "5px;";
46
+ this.mark.style.borderTop = "1px solid red;"
47
+ this.mark.style.borderLeft = "1px solid red;"
48
+
49
+ if(this.step)
50
+ alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
51
+
52
+ $(element).dispatchEvent(oEvent);
53
+ };
54
+
55
+ // Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
56
+ // You need to downgrade to 1.0.4 for now to get this working
57
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
58
+ Event.simulateKey = function(element, eventName) {
59
+ var options = Object.extend({
60
+ ctrlKey: false,
61
+ altKey: false,
62
+ shiftKey: false,
63
+ metaKey: false,
64
+ keyCode: 0,
65
+ charCode: 0
66
+ }, arguments[2] || {});
67
+
68
+ var oEvent = document.createEvent("KeyEvents");
69
+ oEvent.initKeyEvent(eventName, true, true, window,
70
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
71
+ options.keyCode, options.charCode );
72
+ $(element).dispatchEvent(oEvent);
73
+ };
74
+
75
+ Event.simulateKeys = function(element, command) {
76
+ for(var i=0; i<command.length; i++) {
77
+ Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
78
+ }
79
+ };
80
+
81
+ var Test = {}
82
+ Test.Unit = {};
83
+
84
+ // security exception workaround
85
+ Test.Unit.inspect = Object.inspect;
86
+
87
+ Test.Unit.Logger = Class.create();
88
+ Test.Unit.Logger.prototype = {
89
+ initialize: function(log) {
90
+ this.log = $(log);
91
+ if (this.log) {
92
+ this._createLogTable();
93
+ }
94
+ },
95
+ start: function(testName) {
96
+ if (!this.log) return;
97
+ this.testName = testName;
98
+ this.lastLogLine = document.createElement('tr');
99
+ this.statusCell = document.createElement('td');
100
+ this.nameCell = document.createElement('td');
101
+ this.nameCell.appendChild(document.createTextNode(testName));
102
+ this.messageCell = document.createElement('td');
103
+ this.lastLogLine.appendChild(this.statusCell);
104
+ this.lastLogLine.appendChild(this.nameCell);
105
+ this.lastLogLine.appendChild(this.messageCell);
106
+ this.loglines.appendChild(this.lastLogLine);
107
+ },
108
+ finish: function(status, summary) {
109
+ if (!this.log) return;
110
+ this.lastLogLine.className = status;
111
+ this.statusCell.innerHTML = status;
112
+ this.messageCell.innerHTML = this._toHTML(summary);
113
+ },
114
+ message: function(message) {
115
+ if (!this.log) return;
116
+ this.messageCell.innerHTML = this._toHTML(message);
117
+ },
118
+ summary: function(summary) {
119
+ if (!this.log) return;
120
+ this.logsummary.innerHTML = this._toHTML(summary);
121
+ },
122
+ _createLogTable: function() {
123
+ this.log.innerHTML =
124
+ '<div id="logsummary"></div>' +
125
+ '<table id="logtable">' +
126
+ '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
127
+ '<tbody id="loglines"></tbody>' +
128
+ '</table>';
129
+ this.logsummary = $('logsummary')
130
+ this.loglines = $('loglines');
131
+ },
132
+ _toHTML: function(txt) {
133
+ return txt.escapeHTML().replace(/\n/g,"<br/>");
134
+ }
135
+ }
136
+
137
+ Test.Unit.Runner = Class.create();
138
+ Test.Unit.Runner.prototype = {
139
+ initialize: function(testcases) {
140
+ this.options = Object.extend({
141
+ testLog: 'testlog'
142
+ }, arguments[1] || {});
143
+ this.options.resultsURL = this.parseResultsURLQueryParameter();
144
+ if (this.options.testLog) {
145
+ this.options.testLog = $(this.options.testLog) || null;
146
+ }
147
+ if(this.options.tests) {
148
+ this.tests = [];
149
+ for(var i = 0; i < this.options.tests.length; i++) {
150
+ if(/^test/.test(this.options.tests[i])) {
151
+ this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
152
+ }
153
+ }
154
+ } else {
155
+ if (this.options.test) {
156
+ this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
157
+ } else {
158
+ this.tests = [];
159
+ for(var testcase in testcases) {
160
+ if(/^test/.test(testcase)) {
161
+ this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases["setup"], testcases["teardown"]));
162
+ }
163
+ }
164
+ }
165
+ }
166
+ this.currentTest = 0;
167
+ this.logger = new Test.Unit.Logger(this.options.testLog);
168
+ setTimeout(this.runTests.bind(this), 1000);
169
+ },
170
+ parseResultsURLQueryParameter: function() {
171
+ return window.location.search.parseQuery()["resultsURL"];
172
+ },
173
+ // Returns:
174
+ // "ERROR" if there was an error,
175
+ // "FAILURE" if there was a failure, or
176
+ // "SUCCESS" if there was neither
177
+ getResult: function() {
178
+ var hasFailure = false;
179
+ for(var i=0;i<this.tests.length;i++) {
180
+ if (this.tests[i].errors > 0) {
181
+ return "ERROR";
182
+ }
183
+ if (this.tests[i].failures > 0) {
184
+ hasFailure = true;
185
+ }
186
+ }
187
+ if (hasFailure) {
188
+ return "FAILURE";
189
+ } else {
190
+ return "SUCCESS";
191
+ }
192
+ },
193
+ postResults: function() {
194
+ if (this.options.resultsURL) {
195
+ new Ajax.Request(this.options.resultsURL,
196
+ { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
197
+ }
198
+ },
199
+ runTests: function() {
200
+ var test = this.tests[this.currentTest];
201
+ if (!test) {
202
+ // finished!
203
+ this.postResults();
204
+ this.logger.summary(this.summary());
205
+ return;
206
+ }
207
+ if(!test.isWaiting) {
208
+ this.logger.start(test.name);
209
+ }
210
+ test.run();
211
+ if(test.isWaiting) {
212
+ this.logger.message("Waiting for " + test.timeToWait + "ms");
213
+ setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
214
+ } else {
215
+ this.logger.finish(test.status(), test.summary());
216
+ this.currentTest++;
217
+ // tail recursive, hopefully the browser will skip the stackframe
218
+ this.runTests();
219
+ }
220
+ },
221
+ summary: function() {
222
+ var assertions = 0;
223
+ var failures = 0;
224
+ var errors = 0;
225
+ var messages = [];
226
+ for(var i=0;i<this.tests.length;i++) {
227
+ assertions += this.tests[i].assertions;
228
+ failures += this.tests[i].failures;
229
+ errors += this.tests[i].errors;
230
+ }
231
+ return (
232
+ this.tests.length + " tests, " +
233
+ assertions + " assertions, " +
234
+ failures + " failures, " +
235
+ errors + " errors");
236
+ }
237
+ }
238
+
239
+ Test.Unit.Assertions = Class.create();
240
+ Test.Unit.Assertions.prototype = {
241
+ initialize: function() {
242
+ this.assertions = 0;
243
+ this.failures = 0;
244
+ this.errors = 0;
245
+ this.messages = [];
246
+ },
247
+ summary: function() {
248
+ return (
249
+ this.assertions + " assertions, " +
250
+ this.failures + " failures, " +
251
+ this.errors + " errors" + "\n" +
252
+ this.messages.join("\n"));
253
+ },
254
+ pass: function() {
255
+ this.assertions++;
256
+ },
257
+ fail: function(message) {
258
+ this.failures++;
259
+ this.messages.push("Failure: " + message);
260
+ },
261
+ info: function(message) {
262
+ this.messages.push("Info: " + message);
263
+ },
264
+ error: function(error) {
265
+ this.errors++;
266
+ this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
267
+ },
268
+ status: function() {
269
+ if (this.failures > 0) return 'failed';
270
+ if (this.errors > 0) return 'error';
271
+ return 'passed';
272
+ },
273
+ assert: function(expression) {
274
+ var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
275
+ try { expression ? this.pass() :
276
+ this.fail(message); }
277
+ catch(e) { this.error(e); }
278
+ },
279
+ assertEqual: function(expected, actual) {
280
+ var message = arguments[2] || "assertEqual";
281
+ try { (expected == actual) ? this.pass() :
282
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
283
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
284
+ catch(e) { this.error(e); }
285
+ },
286
+ assertEnumEqual: function(expected, actual) {
287
+ var message = arguments[2] || "assertEnumEqual";
288
+ try { $A(expected).length == $A(actual).length &&
289
+ expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
290
+ this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
291
+ ', actual ' + Test.Unit.inspect(actual)); }
292
+ catch(e) { this.error(e); }
293
+ },
294
+ assertNotEqual: function(expected, actual) {
295
+ var message = arguments[2] || "assertNotEqual";
296
+ try { (expected != actual) ? this.pass() :
297
+ this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
298
+ catch(e) { this.error(e); }
299
+ },
300
+ assertNull: function(obj) {
301
+ var message = arguments[1] || 'assertNull'
302
+ try { (obj==null) ? this.pass() :
303
+ this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
304
+ catch(e) { this.error(e); }
305
+ },
306
+ assertHidden: function(element) {
307
+ var message = arguments[1] || 'assertHidden';
308
+ this.assertEqual("none", element.style.display, message);
309
+ },
310
+ assertNotNull: function(object) {
311
+ var message = arguments[1] || 'assertNotNull';
312
+ this.assert(object != null, message);
313
+ },
314
+ assertInstanceOf: function(expected, actual) {
315
+ var message = arguments[2] || 'assertInstanceOf';
316
+ try {
317
+ (actual instanceof expected) ? this.pass() :
318
+ this.fail(message + ": object was not an instance of the expected type"); }
319
+ catch(e) { this.error(e); }
320
+ },
321
+ assertNotInstanceOf: function(expected, actual) {
322
+ var message = arguments[2] || 'assertNotInstanceOf';
323
+ try {
324
+ !(actual instanceof expected) ? this.pass() :
325
+ this.fail(message + ": object was an instance of the not expected type"); }
326
+ catch(e) { this.error(e); }
327
+ },
328
+ _isVisible: function(element) {
329
+ element = $(element);
330
+ if(!element.parentNode) return true;
331
+ this.assertNotNull(element);
332
+ if(element.style && Element.getStyle(element, 'display') == 'none')
333
+ return false;
334
+
335
+ return this._isVisible(element.parentNode);
336
+ },
337
+ assertNotVisible: function(element) {
338
+ this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
339
+ },
340
+ assertVisible: function(element) {
341
+ this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
342
+ },
343
+ benchmark: function(operation, iterations) {
344
+ var startAt = new Date();
345
+ (iterations || 1).times(operation);
346
+ var timeTaken = ((new Date())-startAt);
347
+ this.info((arguments[2] || 'Operation') + ' finished ' +
348
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );
349
+ return timeTaken;
350
+ }
351
+ }
352
+
353
+ Test.Unit.Testcase = Class.create();
354
+ Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
355
+ initialize: function(name, test, setup, teardown) {
356
+ Test.Unit.Assertions.prototype.initialize.bind(this)();
357
+ this.name = name;
358
+ this.test = test || function() {};
359
+ this.setup = setup || function() {};
360
+ this.teardown = teardown || function() {};
361
+ this.isWaiting = false;
362
+ this.timeToWait = 1000;
363
+ },
364
+ wait: function(time, nextPart) {
365
+ this.isWaiting = true;
366
+ this.test = nextPart;
367
+ this.timeToWait = time;
368
+ },
369
+ run: function() {
370
+ try {
371
+ try {
372
+ if (!this.isWaiting) this.setup.bind(this)();
373
+ this.isWaiting = false;
374
+ this.test.bind(this)();
375
+ } finally {
376
+ if(!this.isWaiting) {
377
+ this.teardown.bind(this)();
378
+ }
379
+ }
380
+ }
381
+ catch(e) { this.error(e); }
382
+ }
383
+ });