1 |
3032
|
perry
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
2 |
|
|
<html><head><title> Run the testsuite</title>
|
3 |
|
|
<noscript>Javascript is disabled in your browser. This page cannot be displayed correctly without Javascript. Sorry. <br/> If you want to view this page, please change your browser settings so that Javascript is enabled.</noscript>
|
4 |
|
|
<!--
|
5 |
|
|
Test.AnotherWay version 0.5
|
6 |
|
|
|
7 |
|
|
Copyright (c) 2005 Artem Khodush, http://straytree.org
|
8 |
|
|
|
9 |
|
|
Permission is hereby granted, free of charge, to any person obtaining
|
10 |
|
|
a copy of this software and associated documentation files (the
|
11 |
|
|
"Software"), to deal in the Software without restriction, including
|
12 |
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
13 |
|
|
distribute, sublicense, and/or sell copies of the Software, and to
|
14 |
|
|
permit persons to whom the Software is furnished to do so, subject to
|
15 |
|
|
the following conditions:
|
16 |
|
|
|
17 |
|
|
The above copyright notice and this permission notice shall be
|
18 |
|
|
included in all copies or substantial portions of the Software.
|
19 |
|
|
|
20 |
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
21 |
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 |
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
23 |
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
24 |
|
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
25 |
|
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
26 |
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 |
|
|
-->
|
28 |
|
|
<style type="text/css">
|
29 |
|
|
* { padding: 0; margin: 0; }
|
30 |
|
|
html { height: 99%; }
|
31 |
|
|
body { height: 98%; font: normal normal 10pt sans-serif }
|
32 |
|
|
#col1 { float: left; width: 27em; margin: 0 0 0 1em; overflow: visible; }
|
33 |
|
|
#col2 { position: relative; height: 98%; margin: 0 0.5em 0 27em; }
|
34 |
|
|
#col1_header { margin-top: 0.5em; }
|
35 |
|
|
#scroller { height: 550px; overflow: auto;}
|
36 |
|
|
#testtable { margin: 0 0 2em 0; width: 97%; }
|
37 |
|
|
#run_buttons { margin-bottom: 4em; }
|
38 |
|
|
|
39 |
|
|
#right_header { padding-top: 0.8em; }
|
40 |
|
|
#results_count { float: left; }
|
41 |
|
|
.active_tab { float: right; padding: 0 1em 0.2em 1em; background: #0af; border: 1px solid #048; border-bottom: none; cursor: pointer; cursor: hand;
|
42 |
|
|
position: relative; top: -0.2em; }
|
43 |
|
|
.inactive_tab { float: right; padding: 0 1em 0 1em; background: #9bb; color: #444; border: 1px solid #9bb; border-bottom: none; cursor: pointer; cursor: hand; }
|
44 |
|
|
.inactive_mouseover_tab { float: right; padding: 0 1em 0 1em; background: #9bb; color: #062; border: 1px solid #062; border-bottom: none; cursor: pointer; cursor: hand; }
|
45 |
|
|
|
46 |
|
|
#right_frame { overflow: auto; position: relative; top: -0.2em; clear: right; height: 95%; border: 1px solid #048; }
|
47 |
|
|
|
48 |
|
|
#debug { display: none; }
|
49 |
|
|
#debug p { margin: 2px 0 0 5em; text-indent: -4.8em; }
|
50 |
|
|
|
51 |
|
|
#error { display: none; color: #c22; }
|
52 |
|
|
|
53 |
|
|
#results p { margin: 0 0 2px 0; }
|
54 |
|
|
/* cursor indicating that detailed results may be expanded/contracted */
|
55 |
|
|
#results p.badtest { cursor: text; }
|
56 |
|
|
#results p.ok, #results p.fail { cursor: pointer; cursor: hand; }
|
57 |
|
|
|
58 |
|
|
/* colored squares in the results window at the left of test page names */
|
59 |
|
|
#results p.ok .bullet { background: #6d6; }
|
60 |
|
|
#results p.fail .bullet { background: #d46; }
|
61 |
|
|
#results p.badtest .bullet { background: #ea3; }
|
62 |
|
|
#results p.loading .bullet { background: #48f; }
|
63 |
|
|
#results p.running .bullet { background: #26e; }
|
64 |
|
|
#results p.waiting .bullet { background: #04d; }
|
65 |
|
|
/* highlight in the results line */
|
66 |
|
|
#results p .warning { background: #ffc; }
|
67 |
|
|
|
68 |
|
|
/* layout of the detailed results */
|
69 |
|
|
.result_detail { padding-left: 3em; }
|
70 |
|
|
.result_exception_detail { padding-left: 4em; }
|
71 |
|
|
.result_exception_stack_detail { padding-left: 5em; }
|
72 |
|
|
.result_micro_detail { padding-left: 6em; }
|
73 |
|
|
/* colouring in the detailed results */
|
74 |
|
|
.result_detail .fail, .result_exception_detail .fail, .result_micro_detail .fail { background: #ffd8d8; }
|
75 |
|
|
|
76 |
|
|
/* "start recording" controls*/
|
77 |
|
|
#record_div { margin-top: 3em; }
|
78 |
|
|
#record_div p { margin-bottom: 0.5em; }
|
79 |
|
|
#record_select { width: 88%; }
|
80 |
|
|
#record_input { width: 53%; }
|
81 |
|
|
</style>
|
82 |
|
|
<script type="text/javascript">
|
83 |
|
|
<!--
|
84 |
|
|
if( typeof( Test )=="undefined" ) {
|
85 |
|
|
Test={};
|
86 |
|
|
}
|
87 |
|
|
Test.AnotherWay={};
|
88 |
|
|
|
89 |
|
|
Test.AnotherWay._g_test_iframe=null; // frame where to load test pages
|
90 |
|
|
Test.AnotherWay._g_test_frame_no_clear=false; // true - leave last page displayed after tests end
|
91 |
|
|
Test.AnotherWay._g_test_page_urls=[]; // array of: { url: url, convention: "anotherway" or "jsan" }
|
92 |
|
|
Test.AnotherWay._g_test_object_for_jsan=null; // test object for filling by tests that adhere to jsan Test.Simple calling convention
|
93 |
|
|
Test.AnotherWay._g_pages_to_run=null; // list of pages to run automatically after loading
|
94 |
|
|
Test.AnotherWay._g_run_on_main_load=false; // special handling for run_pages_to_run when it might be called before onload or before list of test pages is known.
|
95 |
|
|
Test.AnotherWay._g_run_on_list_load=false;
|
96 |
|
|
Test.AnotherWay._g_main_loaded=false;
|
97 |
|
|
|
98 |
|
|
Test.AnotherWay._run_pages_to_run=function( called_from_outside )
|
99 |
|
|
{
|
100 |
|
|
if( !Test.AnotherWay._g_main_loaded ) {
|
101 |
|
|
Test.AnotherWay._g_run_on_main_load=true;
|
102 |
|
|
}else {
|
103 |
|
|
var a_pages=Test.AnotherWay._g_pages_to_run;
|
104 |
|
|
if( a_pages=="all" ) {
|
105 |
|
|
for( var i=0; i<Test.AnotherWay._g_test_page_urls.length; ++i ) {
|
106 |
|
|
Test.AnotherWay._run_test_page( "test"+i );
|
107 |
|
|
}
|
108 |
|
|
}else if( a_pages!=null ) {
|
109 |
|
|
for( var run_i=0; run_i<a_pages.length; ++run_i ) {
|
110 |
|
|
var run_page=a_pages[run_i];
|
111 |
|
|
var found=false;
|
112 |
|
|
for( var all_i=0; all_i<Test.AnotherWay._g_test_page_urls.length; ++all_i ) {
|
113 |
|
|
if( run_page==Test.AnotherWay._g_test_page_urls[all_i].url ) {
|
114 |
|
|
Test.AnotherWay._run_test_page( "test"+all_i, called_from_outside );
|
115 |
|
|
found=true;
|
116 |
|
|
break;
|
117 |
|
|
}
|
118 |
|
|
}
|
119 |
|
|
if( !found ) {
|
120 |
|
|
Test.AnotherWay._show_error( "page specified to run is not found in the page list: "+run_page );
|
121 |
|
|
break;
|
122 |
|
|
}
|
123 |
|
|
}
|
124 |
|
|
}
|
125 |
|
|
}
|
126 |
|
|
}
|
127 |
|
|
|
128 |
|
|
Test.AnotherWay._add_test_page_url=function( test_url, convention )
|
129 |
|
|
{
|
130 |
|
|
var table=document.getElementById( "testtable" );
|
131 |
|
|
var record_select=document.getElementById( "record_select" );
|
132 |
|
|
var index=Test.AnotherWay._g_test_page_urls.length;
|
133 |
|
|
|
134 |
|
|
// trim spaces.
|
135 |
|
|
if( test_url.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
|
136 |
|
|
test_url=RegExp.$2;
|
137 |
|
|
}
|
138 |
|
|
|
139 |
|
|
Test.AnotherWay._g_test_page_urls[index]={ url: test_url, convention: convention };
|
140 |
|
|
var row=table.insertRow( -1 );
|
141 |
|
|
|
142 |
|
|
var cell;
|
143 |
|
|
var cell_child;
|
144 |
|
|
cell=row.insertCell( -1 );
|
145 |
|
|
cell_child=document.createElement( "input" );
|
146 |
|
|
cell_child.type="checkbox";
|
147 |
|
|
cell_child.id="checkbox"+index;
|
148 |
|
|
cell.appendChild( cell_child );
|
149 |
|
|
|
150 |
|
|
cell=row.insertCell( -1 );
|
151 |
|
|
cell.setAttribute( "width", "75%" );
|
152 |
|
|
cell.appendChild( document.createTextNode( test_url ) );
|
153 |
|
|
|
154 |
|
|
cell=row.insertCell( -1 );
|
155 |
|
|
cell_child=document.createElement( "input" );
|
156 |
|
|
cell_child.type="button";
|
157 |
|
|
cell_child.id="test"+index;
|
158 |
|
|
cell_child.value=" run ";
|
159 |
|
|
cell_child.onclick=Test.AnotherWay._run_one_onclick;
|
160 |
|
|
cell.appendChild( cell_child );
|
161 |
|
|
|
162 |
|
|
cell=row.insertCell( -1 );
|
163 |
|
|
cell.setAttribute( "width", "8em" );
|
164 |
|
|
cell_child=document.createElement( "span" );
|
165 |
|
|
cell.appendChild( cell_child );
|
166 |
|
|
|
167 |
|
|
var option=document.createElement( "option" );
|
168 |
|
|
option.appendChild( document.createTextNode( test_url ) );
|
169 |
|
|
record_select.appendChild( option );
|
170 |
|
|
}
|
171 |
|
|
Test.AnotherWay._show_error=function( msg )
|
172 |
|
|
{
|
173 |
|
|
var error_div=document.getElementById( "error" );
|
174 |
|
|
error_div.innerHTML="";
|
175 |
|
|
error_div.appendChild( document.createTextNode( msg ) );
|
176 |
|
|
error_div.style.display="block";
|
177 |
|
|
}
|
178 |
|
|
|
179 |
|
|
// read urls from the list in the html file inside the list_iframe
|
180 |
|
|
// fill on-screen list with urls and "run" buttons, and fill the g_test_page_urls object.
|
181 |
|
|
Test.AnotherWay._list_iframe_onload=function()
|
182 |
|
|
{
|
183 |
|
|
if( window.frames.list_iframe!=null && window.frames.list_iframe.location!="" && window.frames.list_iframe.location!="about:blank" ) {
|
184 |
|
|
var list_doc=window.frames.list_iframe.document;
|
185 |
|
|
var list=list_doc.getElementById( "testlist" );
|
186 |
|
|
if( list!=null ) {
|
187 |
|
|
for( var i=0; i<list.childNodes.length; ++i ) {
|
188 |
|
|
var item=list.childNodes[i];
|
189 |
|
|
if( item.nodeName=="LI" || item.nodeName=="li" ) {
|
190 |
|
|
var convention="anotherway";
|
191 |
|
|
if( Test.AnotherWay._get_css_class( item )=="jsan" ) {
|
192 |
|
|
convention="jsan";
|
193 |
|
|
}
|
194 |
|
|
Test.AnotherWay._add_test_page_url( item.innerHTML, convention );
|
195 |
|
|
}
|
196 |
|
|
}
|
197 |
|
|
if( Test.AnotherWay._g_run_on_list_load ) {
|
198 |
|
|
Test.AnotherWay._g_run_on_list_load=false;
|
199 |
|
|
Test.AnotherWay._run_pages_to_run();
|
200 |
|
|
}
|
201 |
|
|
}else {
|
202 |
|
|
Test.AnotherWay._show_error( "no list with id 'testlist' in a list file "+window.frames.list_iframe.location );
|
203 |
|
|
}
|
204 |
|
|
}
|
205 |
|
|
}
|
206 |
|
|
|
207 |
|
|
Test.AnotherWay._map_checkboxes=function( f )
|
208 |
|
|
{
|
209 |
|
|
var table=document.getElementById( "testtable" );
|
210 |
|
|
var checks=table.getElementsByTagName( "INPUT" );
|
211 |
|
|
for( var i=0; i<checks.length; ++i ) {
|
212 |
|
|
if( checks[i].type=="checkbox" && checks[i].id.match( /^checkbox(\d+)$/ ) ) {
|
213 |
|
|
f( checks[i], RegExp.$1 );
|
214 |
|
|
}
|
215 |
|
|
}
|
216 |
|
|
}
|
217 |
|
|
Test.AnotherWay._run_all_onclick=function()
|
218 |
|
|
{
|
219 |
|
|
Test.AnotherWay._map_checkboxes( function( c, id ) { Test.AnotherWay._run_test_page( "test"+id ); } );
|
220 |
|
|
}
|
221 |
|
|
Test.AnotherWay._run_selected_onclick=function()
|
222 |
|
|
{
|
223 |
|
|
Test.AnotherWay._map_checkboxes( function( c, id ) { if( c.checked ) Test.AnotherWay._run_test_page( "test"+id ); } );
|
224 |
|
|
}
|
225 |
|
|
Test.AnotherWay._unselect_all_onclick=function()
|
226 |
|
|
{
|
227 |
|
|
Test.AnotherWay._map_checkboxes( function( c, id ) { c.checked=false; } );
|
228 |
|
|
}
|
229 |
|
|
Test.AnotherWay._run_one_onclick=function()
|
230 |
|
|
{
|
231 |
|
|
Test.AnotherWay._run_test_page( this.id );
|
232 |
|
|
}
|
233 |
|
|
|
234 |
|
|
// construct an object that will gather results of running one test function
|
235 |
|
|
Test.AnotherWay._test_object_t=function( fun_name )
|
236 |
|
|
{
|
237 |
|
|
this.name=fun_name; // name of the test function
|
238 |
|
|
this.n_plan=null; // planned number of assertions
|
239 |
|
|
this.n_ok=0; // # of ok assertions
|
240 |
|
|
this.n_fail=0; // # of failed assertions
|
241 |
|
|
this.exception=""; // if the function throwed an exception, it's its message
|
242 |
|
|
this.exception_stack=[]; // strings: function call stack from the exception
|
243 |
|
|
this.assertions=[]; // assertion results: array of { ok: 1 or 0, name: string }
|
244 |
|
|
this.wait_result_milliseconds=0; // how long to wait before collecting results from the test
|
245 |
|
|
this.second_wait_msg=null; // <p> status message (in addition to the page wait_msg)
|
246 |
|
|
this.delay_actions=[]; // array of actions to be perfomed after the test function returns
|
247 |
|
|
// action : { acton_kind: "call" | "window" | "replay"
|
248 |
|
|
// when "call": { call_fn call_delay_milliseconds } call_fn takes nothing
|
249 |
|
|
// when "window" : { wnd_url wnd_wnd wnd_fn wnd_timeout_milliseconds wnd_dont_close } wnd_fn takes wnd
|
250 |
|
|
// wnen "replay" : { replay_wnd replay_events replay_event_i replay_checkpoints } checkpoint_fn takes this, wnd
|
251 |
|
|
// }
|
252 |
|
|
this.delay_action_i=null; // index of delay action currently being performed
|
253 |
|
|
this.delay_prev_timer_time=0; // for counting time while performing delay_actions
|
254 |
|
|
this.delay_current_milliseconds_left=0; // time left before the next action, runs down
|
255 |
|
|
this.delay_total_milliseconds_left=0; // for indication: total estimated time for all actions, runs up and down
|
256 |
|
|
}
|
257 |
|
|
|
258 |
|
|
Test.AnotherWay._test_object_t.prototype.ok=function( cond, name )
|
259 |
|
|
{
|
260 |
|
|
if( cond ) {
|
261 |
|
|
++this.n_ok;
|
262 |
|
|
cond=1;
|
263 |
|
|
}else {
|
264 |
|
|
++this.n_fail;
|
265 |
|
|
cond=0;
|
266 |
|
|
}
|
267 |
|
|
this.assertions.push( { ok: cond, name: name } );
|
268 |
|
|
}
|
269 |
|
|
Test.AnotherWay._test_object_t.prototype.fail=function( name )
|
270 |
|
|
{
|
271 |
|
|
this.ok( false, name );
|
272 |
|
|
}
|
273 |
|
|
Test.AnotherWay._test_object_t.prototype.plan=function( n )
|
274 |
|
|
{
|
275 |
|
|
this.n_plan=n;
|
276 |
|
|
}
|
277 |
|
|
Test.AnotherWay._test_object_t.prototype.wait_result=function( seconds )
|
278 |
|
|
{
|
279 |
|
|
this.wait_result_milliseconds=1000*seconds;
|
280 |
|
|
}
|
281 |
|
|
Test.AnotherWay._eq_fail_msg=function( path, what, expected, got )
|
282 |
|
|
{
|
283 |
|
|
return "eq: "+path+" "+what+" differ: got "+got+", but expected "+expected;
|
284 |
|
|
}
|
285 |
|
|
Test.AnotherWay._array_eq=function( expected, got, path, msg )
|
286 |
|
|
{
|
287 |
|
|
if( expected.length!=got.length ) {
|
288 |
|
|
msg.msg=Test.AnotherWay._eq_fail_msg( path, "array length", expected.length, got.length );
|
289 |
|
|
return false;
|
290 |
|
|
}
|
291 |
|
|
for( var i=0; i<expected.length; ++i ) {
|
292 |
|
|
if( !Test.AnotherWay._thing_eq( expected[i], got[i], path+"["+i+"]", msg ) ) {
|
293 |
|
|
return false;
|
294 |
|
|
}
|
295 |
|
|
}
|
296 |
|
|
return true;
|
297 |
|
|
}
|
298 |
|
|
Test.AnotherWay._object_eq=function( expected, got, path, msg )
|
299 |
|
|
{
|
300 |
|
|
var v;
|
301 |
|
|
for( v in expected ) {
|
302 |
|
|
if( ! (v in got) ) {
|
303 |
|
|
msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", expected[v], "undefined" );
|
304 |
|
|
return false;
|
305 |
|
|
}
|
306 |
|
|
if( !Test.AnotherWay._thing_eq( expected[v], got[v], path+"."+v, msg ) ) {
|
307 |
|
|
return false;
|
308 |
|
|
}
|
309 |
|
|
}
|
310 |
|
|
for( v in got ) {
|
311 |
|
|
if( ! (v in expected) ) {
|
312 |
|
|
msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", "undefined", got[v] );
|
313 |
|
|
return false;
|
314 |
|
|
}
|
315 |
|
|
}
|
316 |
|
|
return true;
|
317 |
|
|
}
|
318 |
|
|
Test.AnotherWay._constructor_name=function( x )
|
319 |
|
|
{
|
320 |
|
|
if( x==null ) {
|
321 |
|
|
return "";
|
322 |
|
|
}
|
323 |
|
|
var s="unknown";
|
324 |
|
|
try {
|
325 |
|
|
s=typeof( x.constructor );
|
326 |
|
|
if( s!="unknown" ) {
|
327 |
|
|
s=x.constructor.toString();
|
328 |
|
|
}
|
329 |
|
|
}catch( e ) {
|
330 |
|
|
s="unknown";
|
331 |
|
|
}
|
332 |
|
|
if( s=="unknown" ) {
|
333 |
|
|
// hackish attempt to guess a type
|
334 |
|
|
var is_array=true;
|
335 |
|
|
var index=0;
|
336 |
|
|
for( i in x ) {
|
337 |
|
|
if( i!=index ) {
|
338 |
|
|
is_array=false;
|
339 |
|
|
}
|
340 |
|
|
++index;
|
341 |
|
|
}
|
342 |
|
|
return is_array ? "Array" : "Object"; // for empty arrays/objects, this will be wrong half the time
|
343 |
|
|
}else if( s.match( /^\s*function\s+(\w+)\s*\(/ ) ) {
|
344 |
|
|
return RegExp.$1;
|
345 |
|
|
}else {
|
346 |
|
|
return "";
|
347 |
|
|
}
|
348 |
|
|
}
|
349 |
|
|
Test.AnotherWay._is_array=function( x )
|
350 |
|
|
{
|
351 |
|
|
return Test.AnotherWay._constructor_name( x )=="Array";
|
352 |
|
|
}
|
353 |
|
|
Test.AnotherWay._is_value_type=function( x )
|
354 |
|
|
{
|
355 |
|
|
cn=Test.AnotherWay._constructor_name( x );
|
356 |
|
|
return cn=="Number" || cn=="String" || cn=="Boolean" || cn=="Date";
|
357 |
|
|
}
|
358 |
|
|
Test.AnotherWay._thing_eq=function( expected, got, path, msg )
|
359 |
|
|
{
|
360 |
|
|
if( expected==null && got==null ) {
|
361 |
|
|
return true;
|
362 |
|
|
}else if( (expected==null && got!=null) || (expected!=null && got==null) ) {
|
363 |
|
|
msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
|
364 |
|
|
return false;
|
365 |
|
|
}else {
|
366 |
|
|
var expected_cn=Test.AnotherWay._constructor_name( expected );
|
367 |
|
|
var got_cn=Test.AnotherWay._constructor_name( got );
|
368 |
|
|
if( expected_cn!=got_cn ) {
|
369 |
|
|
msg.msg=Test.AnotherWay._eq_fail_msg( path, "types", expected_cn, got_cn );
|
370 |
|
|
return false;
|
371 |
|
|
}else {
|
372 |
|
|
if( Test.AnotherWay._is_array( expected ) ) {
|
373 |
|
|
return Test.AnotherWay._array_eq( expected, got, path, msg );
|
374 |
|
|
}else if( Test.AnotherWay._is_value_type( expected ) ) {
|
375 |
|
|
if( expected!=got ) {
|
376 |
|
|
msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
|
377 |
|
|
return false;
|
378 |
|
|
}else {
|
379 |
|
|
return true;
|
380 |
|
|
}
|
381 |
|
|
}else { // just a plain object
|
382 |
|
|
return Test.AnotherWay._object_eq( expected, got, path, msg );
|
383 |
|
|
}
|
384 |
|
|
}
|
385 |
|
|
}
|
386 |
|
|
}
|
387 |
|
|
Test.AnotherWay._test_object_t.prototype.eq=function( got, expected, name )
|
388 |
|
|
{
|
389 |
|
|
var msg={};
|
390 |
|
|
if( Test.AnotherWay._thing_eq( expected, got, "", msg ) ) {
|
391 |
|
|
this.ok( 1, name );
|
392 |
|
|
}else {
|
393 |
|
|
this.fail( name+". "+msg.msg );
|
394 |
|
|
}
|
395 |
|
|
}
|
396 |
|
|
Test.AnotherWay._test_object_t.prototype.like=function( got, expected, name )
|
397 |
|
|
{
|
398 |
|
|
if( got.match( expected )!=null ) {
|
399 |
|
|
this.ok( 1, name );
|
400 |
|
|
}else {
|
401 |
|
|
this.fail( name+": got "+got+", but expected it to match: "+expected );
|
402 |
|
|
}
|
403 |
|
|
}
|
404 |
|
|
Test.AnotherWay._g_html_eq_span=null;
|
405 |
|
|
Test.AnotherWay._html_eq_string_to_node=function( string_or_node, what, msg )
|
406 |
|
|
{
|
407 |
|
|
if( string_or_node.nodeType!=null ) {
|
408 |
|
|
string_or_node=Test.AnotherWay._html_eq_node_to_string( string_or_node ); // double trip - to make properties assigned in scripts available as html node attributes
|
409 |
|
|
}
|
410 |
|
|
if( Test.AnotherWay._g_html_eq_span==null ) {
|
411 |
|
|
Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
|
412 |
|
|
}
|
413 |
|
|
Test.AnotherWay._g_html_eq_span.innerHTML=string_or_node;
|
414 |
|
|
if( Test.AnotherWay._g_html_eq_span.childNodes.length!=1 ) {
|
415 |
|
|
msg.msg="bad "+what+" html string given (should contain exactly one outermost element): "+string_or_node;
|
416 |
|
|
}
|
417 |
|
|
return Test.AnotherWay._g_html_eq_span.childNodes[0].cloneNode( true );
|
418 |
|
|
}
|
419 |
|
|
Test.AnotherWay._html_eq_node_to_string=function( node ) {
|
420 |
|
|
if( Test.AnotherWay._g_html_eq_span==null ) {
|
421 |
|
|
Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
|
422 |
|
|
}
|
423 |
|
|
Test.AnotherWay._g_html_eq_span.innerHTML="";
|
424 |
|
|
if( node.outerHTML!=null ) {
|
425 |
|
|
Test.AnotherWay._g_html_eq_span.innerHTML=node.outerHTML;
|
426 |
|
|
}else {
|
427 |
|
|
Test.AnotherWay._g_html_eq_span.appendChild( node.cloneNode( true ) );
|
428 |
|
|
}
|
429 |
|
|
return Test.AnotherWay._g_html_eq_span.innerHTML;
|
430 |
|
|
}
|
431 |
|
|
Test.AnotherWay._html_eq_path_msg=function( path )
|
432 |
|
|
{
|
433 |
|
|
var msg="";
|
434 |
|
|
for( var i=0; i<path.length; ++i ) {
|
435 |
|
|
msg+=" [node "+path[i].node;
|
436 |
|
|
if( path[i].id!=null && path[i].id!="" ) {
|
437 |
|
|
msg+=" id "+path[i].id;
|
438 |
|
|
}else if( path[i].index!=null ) {
|
439 |
|
|
msg+=" at index "+path[i].index;
|
440 |
|
|
}
|
441 |
|
|
msg+="] "
|
442 |
|
|
}
|
443 |
|
|
return msg;
|
444 |
|
|
}
|
445 |
|
|
Test.AnotherWay._html_eq_fail_msg=function( path, what, expected, got )
|
446 |
|
|
{
|
447 |
|
|
return Test.AnotherWay._html_eq_path_msg( path )+": "+what+" differ: got "+got+", but expected "+expected;
|
448 |
|
|
}
|
449 |
|
|
Test.AnotherWay._html_eq_remove_blank=function( text )
|
450 |
|
|
{
|
451 |
|
|
if( text==null ) {
|
452 |
|
|
return "";
|
453 |
|
|
}else if( text.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
|
454 |
|
|
return RegExp.$2;
|
455 |
|
|
}else if( text.match( "\s*" ) ) {
|
456 |
|
|
return "";
|
457 |
|
|
}
|
458 |
|
|
return text;
|
459 |
|
|
}
|
460 |
|
|
Test.AnotherWay._html_eq_remove_blank_nodes=function( node )
|
461 |
|
|
{
|
462 |
|
|
var to_remove=[];
|
463 |
|
|
for( var child=node.firstChild; child!=null; child=child.nextSibling ) {
|
464 |
|
|
if( child.nodeType==3 ) {
|
465 |
|
|
var value=Test.AnotherWay._html_eq_remove_blank( child.nodeValue );
|
466 |
|
|
if( value=="" ) {
|
467 |
|
|
to_remove.push( child );
|
468 |
|
|
}else {
|
469 |
|
|
child.nodeValue=value;
|
470 |
|
|
}
|
471 |
|
|
}
|
472 |
|
|
}
|
473 |
|
|
for( var i=0; i<to_remove.length; ++i ) {
|
474 |
|
|
node.removeChild( to_remove[i] );
|
475 |
|
|
}
|
476 |
|
|
}
|
477 |
|
|
Test.AnotherWay._html_node_type_text=function( node_type )
|
478 |
|
|
{
|
479 |
|
|
if( node_type==1 ) {
|
480 |
|
|
return "1 (html element)";
|
481 |
|
|
}else if( node_type==3 ) {
|
482 |
|
|
return "3 (text)";
|
483 |
|
|
}else {
|
484 |
|
|
return node_type;
|
485 |
|
|
}
|
486 |
|
|
}
|
487 |
|
|
Test.AnotherWay._html_eq_node=function( expected, got, path, msg, expected_loc_base, got_loc_base )
|
488 |
|
|
{
|
489 |
|
|
if( expected.nodeType!=got.nodeType ) {
|
490 |
|
|
msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node types", Test.AnotherWay._html_node_type_text( expected.nodeType ), Test.AnotherWay._html_node_type_text( got.nodeType ) );
|
491 |
|
|
return false;
|
492 |
|
|
}else if( expected.nodeType==3 ) {
|
493 |
|
|
if( expected.nodeValue!=got.nodeValue ) {
|
494 |
|
|
msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "text", expected.nodeValue, got.nodeValue );
|
495 |
|
|
return false;
|
496 |
|
|
}
|
497 |
|
|
}else if( expected.nodeType==1 ) {
|
498 |
|
|
if( expected.nodeName!=got.nodeName ) {
|
499 |
|
|
msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node names", expected.nodeName, got.nodeName );
|
500 |
|
|
return false;
|
501 |
|
|
}
|
502 |
|
|
// compare attributes
|
503 |
|
|
var expected_attrs={};
|
504 |
|
|
var got_attrs={};
|
505 |
|
|
var i;
|
506 |
|
|
var a;
|
507 |
|
|
for( i=0; i<expected.attributes.length; ++i ) {
|
508 |
|
|
a=expected.attributes[i];
|
509 |
|
|
if( a.specified ) {
|
510 |
|
|
expected_attrs[a.name]=1;
|
511 |
|
|
}
|
512 |
|
|
}
|
513 |
|
|
for( i=0; i<got.attributes.length; ++i ) {
|
514 |
|
|
a=got.attributes[i];
|
515 |
|
|
if( a.specified ) {
|
516 |
|
|
got_attrs[a.name]=1;
|
517 |
|
|
}
|
518 |
|
|
}
|
519 |
|
|
for( a in expected_attrs ) {
|
520 |
|
|
if( ! (a in got_attrs) ) {
|
521 |
|
|
msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: expected attribute "+a+" is missing";
|
522 |
|
|
return false;
|
523 |
|
|
}
|
524 |
|
|
}
|
525 |
|
|
for( a in got_attrs ) {
|
526 |
|
|
if( ! (a in expected_attrs) ) {
|
527 |
|
|
msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: got extra attribute "+a;
|
528 |
|
|
return false;
|
529 |
|
|
}
|
530 |
|
|
}
|
531 |
|
|
for( a in expected_attrs ) {
|
532 |
|
|
var expected_value=expected.getAttribute( a );
|
533 |
|
|
var got_value=got.getAttribute( a );
|
534 |
|
|
if( typeof( expected_value )=="string" && typeof( got_value )=="string" ) {
|
535 |
|
|
expected_value=Test.AnotherWay._html_eq_remove_blank( expected_value );
|
536 |
|
|
got_value=Test.AnotherWay._html_eq_remove_blank( got_value );
|
537 |
|
|
var ok=expected_value==got_value;
|
538 |
|
|
if( !ok && (a=="href" || a=="HREF" ) ) { // try relative hrefs
|
539 |
|
|
var expected_relative_value=expected_value;
|
540 |
|
|
if( expected_loc_base!=null && expected_value.substring( 0, expected_loc_base.length )==expected_loc_base ) {
|
541 |
|
|
expected_relative_value=expected_value.substring( expected_loc_base.length );
|
542 |
|
|
}
|
543 |
|
|
var got_relative_value=got_value;
|
544 |
|
|
if( got_loc_base!=null && got_value.substring( 0, got_loc_base.length )==got_loc_base ) {
|
545 |
|
|
got_relative_value=got_value.substring( got_loc_base.length );
|
546 |
|
|
}
|
547 |
|
|
ok=expected_relative_value==got_relative_value;
|
548 |
|
|
}
|
549 |
|
|
if( !ok ) {
|
550 |
|
|
msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
|
551 |
|
|
return false;
|
552 |
|
|
}
|
553 |
|
|
}else if( typeof( expected_value )=="function" && typeof( got_value )=="function" ) {
|
554 |
|
|
expected_value=expected_value.toString();
|
555 |
|
|
got_value=got_value.toString();
|
556 |
|
|
if( expected_value!=got_value ) {
|
557 |
|
|
msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
|
558 |
|
|
return false;
|
559 |
|
|
}
|
560 |
|
|
}else {
|
561 |
|
|
var value_msg={};
|
562 |
|
|
if( !Test.AnotherWay._thing_eq( expected_value, got_value, "", value_msg ) ) {
|
563 |
|
|
msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute "+a+" values differ: "+value_msg.msg;
|
564 |
|
|
return false;
|
565 |
|
|
}
|
566 |
|
|
}
|
567 |
|
|
}
|
568 |
|
|
// compare child nodes
|
569 |
|
|
Test.AnotherWay._html_eq_remove_blank_nodes( expected );
|
570 |
|
|
Test.AnotherWay._html_eq_remove_blank_nodes( got );
|
571 |
|
|
var expected_length=expected.childNodes.length;
|
572 |
|
|
var got_length=got.childNodes.length;
|
573 |
|
|
if( expected_length<got_length ) {
|
574 |
|
|
msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": got "+(got_length-expected_length)+" extra child nodes";
|
575 |
|
|
return false;
|
576 |
|
|
}else if( expected_length>got_length ) {
|
577 |
|
|
msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": expected "+(expected_length-got_length)+" more child nodes";
|
578 |
|
|
return false;
|
579 |
|
|
}else {
|
580 |
|
|
for( i=0; i<expected_length; ++i ) {
|
581 |
|
|
var expected_node=expected.childNodes[i];
|
582 |
|
|
path.push( { node: expected_node.nodeName, id: expected_node.id, index: i } );
|
583 |
|
|
var eq=Test.AnotherWay._html_eq_node( expected_node, got.childNodes[i], path, msg, expected_loc_base, got_loc_base );
|
584 |
|
|
path.pop();
|
585 |
|
|
if( !eq ) {
|
586 |
|
|
return false;
|
587 |
|
|
}
|
588 |
|
|
}
|
589 |
|
|
}
|
590 |
|
|
}
|
591 |
|
|
return true;
|
592 |
|
|
}
|
593 |
|
|
Test.AnotherWay._html_eq_get_loc_base=function( node )
|
594 |
|
|
{
|
595 |
|
|
var loc_base=document.location;
|
596 |
|
|
if( node.ownerDocument!=null ) {
|
597 |
|
|
loc_base=node.ownerDocument.location;
|
598 |
|
|
}
|
599 |
|
|
if( loc_base!=null ) {
|
600 |
|
|
loc_base=loc_base.href;
|
601 |
|
|
var slash_pos=loc_base.lastIndexOf( "/" );
|
602 |
|
|
if( slash_pos!=-1 ) {
|
603 |
|
|
loc_base=loc_base.substring( 0, slash_pos+1 );
|
604 |
|
|
}
|
605 |
|
|
}
|
606 |
|
|
return loc_base;
|
607 |
|
|
}
|
608 |
|
|
Test.AnotherWay._test_object_t.prototype.html_eq=function( got, expected, name )
|
609 |
|
|
{
|
610 |
|
|
var msg={};
|
611 |
|
|
var expected_node=Test.AnotherWay._html_eq_string_to_node( expected, "expected", msg );
|
612 |
|
|
if( msg.msg!=null ) {
|
613 |
|
|
this.fail( name+" html_eq: "+msg.msg );
|
614 |
|
|
}else {
|
615 |
|
|
var got_node=Test.AnotherWay._html_eq_string_to_node( got, "got", msg );
|
616 |
|
|
if( msg.msg!=null ) {
|
617 |
|
|
this.fail( name+" html_eq: "+msg.msg );
|
618 |
|
|
}else {
|
619 |
|
|
var expected_loc_base=Test.AnotherWay._html_eq_get_loc_base( expected );
|
620 |
|
|
var got_loc_base=Test.AnotherWay._html_eq_get_loc_base( got );
|
621 |
|
|
if( Test.AnotherWay._html_eq_node( expected_node, got_node, [], msg, expected_loc_base, got_loc_base ) ) {
|
622 |
|
|
this.ok( 1, name );
|
623 |
|
|
}else {
|
624 |
|
|
var msg=name+" html_eq "+msg.msg;
|
625 |
|
|
var expected_str=Test.AnotherWay._html_eq_node_to_string( expected_node );
|
626 |
|
|
var got_str=Test.AnotherWay._html_eq_node_to_string( got_node );
|
627 |
|
|
msg+=".\n got html: "+got_str;
|
628 |
|
|
msg+=".\n expected html: "+expected_str;
|
629 |
|
|
this.fail( msg );
|
630 |
|
|
}
|
631 |
|
|
}
|
632 |
|
|
}
|
633 |
|
|
}
|
634 |
|
|
Test.AnotherWay._debug_pane_print=function( msg )
|
635 |
|
|
{
|
636 |
|
|
var d=new Date();
|
637 |
|
|
var p=document.createElement( "p" );
|
638 |
|
|
p.appendChild( document.createTextNode( d.toLocaleTimeString()+" "+msg ) );
|
639 |
|
|
var debug_pane=document.getElementById( "debug" );
|
640 |
|
|
debug_pane.appendChild( p );
|
641 |
|
|
var debug_tab=document.getElementById( "debug_tab" );
|
642 |
|
|
var results_tab=document.getElementById( "results_tab" );
|
643 |
|
|
debug_tab.style.visibility="visible";
|
644 |
|
|
results_tab.style.visibility="visible";
|
645 |
|
|
}
|
646 |
|
|
Test.AnotherWay._test_object_t.prototype.debug_print=function( msg )
|
647 |
|
|
{
|
648 |
|
|
Test.AnotherWay._debug_pane_print( this.name+": "+msg );
|
649 |
|
|
}
|
650 |
|
|
Test.AnotherWay._test_object_t.prototype.delay_call=function()
|
651 |
|
|
{
|
652 |
|
|
var timeout_ms=200;
|
653 |
|
|
for( var i=0; i<arguments.length; ++i ) {
|
654 |
|
|
if( typeof( arguments[i] )!="function" ) {
|
655 |
|
|
timeout_ms=1000*arguments[i];
|
656 |
|
|
}else {
|
657 |
|
|
var action={ action_kind: "call", call_delay_milliseconds: timeout_ms, call_fn: arguments[i] };
|
658 |
|
|
this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
|
659 |
|
|
this.delay_actions.push( action );
|
660 |
|
|
}
|
661 |
|
|
}
|
662 |
|
|
}
|
663 |
|
|
Test.AnotherWay._test_object_t.prototype.open_window=function( url, fn, timeout_seconds )
|
664 |
|
|
{
|
665 |
|
|
if( timeout_seconds==null ) {
|
666 |
|
|
timeout_seconds=2;
|
667 |
|
|
}
|
668 |
|
|
var no_close=document.getElementById( "dont_close_test_windows" );
|
669 |
|
|
var action={ action_kind: "window", wnd_url: url.toString(), wnd_wnd: null, wnd_fn: fn, wnd_timeout_milliseconds: timeout_seconds*1000, wnd_no_close: no_close.checked };
|
670 |
|
|
this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
|
671 |
|
|
this.delay_actions.push( action );
|
672 |
|
|
}
|
673 |
|
|
Test.AnotherWay._test_object_t.prototype.replay_events=function( wnd, events )
|
674 |
|
|
{
|
675 |
|
|
if( Test.AnotherWay._g_no_record_msg!=null ) {
|
676 |
|
|
this.fail( "replay_events: "+Test.AnotherWay._g_no_record_msg );
|
677 |
|
|
}else {
|
678 |
|
|
var action={ action_kind: "replay", replay_wnd: wnd, replay_events: events.events, replay_event_i: null, replay_checkpoints: events.checkpoints };
|
679 |
|
|
this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
|
680 |
|
|
this.delay_actions.push( action );
|
681 |
|
|
}
|
682 |
|
|
}
|
683 |
|
|
Test.AnotherWay._action_estimate_milliseconds=function( action )
|
684 |
|
|
{
|
685 |
|
|
var ms=0;
|
686 |
|
|
if( action.action_kind=="call" ) {
|
687 |
|
|
ms=action.call_delay_milliseconds;
|
688 |
|
|
}else if( action.action_kind=="window" ) {
|
689 |
|
|
ms=0;
|
690 |
|
|
}else if( action.action_kind=="replay" ) {
|
691 |
|
|
ms=0;
|
692 |
|
|
for( var i=0; i<action.replay_events.length; ++i ) {
|
693 |
|
|
ms+=action.replay_events[i]["time"]-0;
|
694 |
|
|
}
|
695 |
|
|
}
|
696 |
|
|
return ms;
|
697 |
|
|
}
|
698 |
|
|
|
699 |
|
|
Test.AnotherWay._g_timeout_granularity=200;
|
700 |
|
|
Test.AnotherWay._g_tests_queue=[]; // vector of { url: string, test_objects : array of test_object_t, test_object_i: int, wait_msg: <p> object, loading_timeout_milliseconds: int, timeout_id: id }
|
701 |
|
|
|
702 |
|
|
// load one html page, schedule further processing
|
703 |
|
|
Test.AnotherWay._run_test_page=function( id, called_from_outside )
|
704 |
|
|
{
|
705 |
|
|
if( id.match( /^test(\d+)/ ) ) {
|
706 |
|
|
id=RegExp.$1;
|
707 |
|
|
Test.AnotherWay._g_tests_queue.push( {
|
708 |
|
|
url: Test.AnotherWay._g_test_page_urls[id].url,
|
709 |
|
|
convention: Test.AnotherWay._g_test_page_urls[id].convention,
|
710 |
|
|
test_objects: []
|
711 |
|
|
} );
|
712 |
|
|
if( Test.AnotherWay._g_tests_queue.length==1 ) {
|
713 |
|
|
if( !called_from_outside ) {
|
714 |
|
|
// Crap. Be careful stepping around.
|
715 |
|
|
// For Mozilla and Opera, when this file is included into the frameset page that is in another directory (and _g_outside_path_correction!=null)
|
716 |
|
|
// but the test pages are started from within it (by "run" buttons), then:
|
717 |
|
|
// depending on whether the page is the first one loaded into the test frame or not,
|
718 |
|
|
// the base url for relative test pages differs.
|
719 |
|
|
// Crap, like I said.
|
720 |
|
|
Test.AnotherWay._g_tests_queue[0].suppress_outside_path_correction=true;
|
721 |
|
|
}
|
722 |
|
|
Test.AnotherWay._start_loading_page();
|
723 |
|
|
}
|
724 |
|
|
}
|
725 |
|
|
}
|
726 |
|
|
Test.AnotherWay._load_next_page=function()
|
727 |
|
|
{
|
728 |
|
|
Test.AnotherWay._g_tests_queue.splice( 0, 1 );
|
729 |
|
|
if( Test.AnotherWay._g_tests_queue.length>0 ) {
|
730 |
|
|
Test.AnotherWay._start_loading_page();
|
731 |
|
|
}else {
|
732 |
|
|
if( !Test.AnotherWay._g_test_frame_no_clear ) {
|
733 |
|
|
Test.AnotherWay._g_test_iframe.location.replace( "about:blank" );
|
734 |
|
|
}
|
735 |
|
|
}
|
736 |
|
|
}
|
737 |
|
|
Test.AnotherWay._g_opera_path_correction=null; // ugly wart to support opera
|
738 |
|
|
Test.AnotherWay._g_outside_path_correction=null; // ugly wart to accomodate Opera and Mozilla, where relative url relates to the directory where the page that calls this function is located
|
739 |
|
|
Test.AnotherWay._set_iframe_location=function( iframe, loc, outside_path_correction )
|
740 |
|
|
{
|
741 |
|
|
// allow to load only locations with the same origin
|
742 |
|
|
var proto_end=loc.indexOf( "://" );
|
743 |
|
|
if( proto_end!=-1 ) { // otherwise, it's safe to assume (for Opera, Mozilla and IE ) that loc will be treated as relative
|
744 |
|
|
var main_loc=window.location.href;
|
745 |
|
|
var host_end=loc.substring( proto_end+3 ).indexOf( "/" );
|
746 |
|
|
var ok=false;
|
747 |
|
|
if( host_end!=-1 ) {
|
748 |
|
|
var loc_origin=loc.substring( 0, proto_end+3+host_end+1 );
|
749 |
|
|
if( main_loc.length>=loc_origin.length && main_loc.substring( 0, loc_origin.length )==loc_origin ) {
|
750 |
|
|
ok=true;
|
751 |
|
|
}
|
752 |
|
|
}
|
753 |
|
|
if( !ok ) {
|
754 |
|
|
return { msg: "test pages may have only urls with the same origin as "+main_loc };
|
755 |
|
|
}
|
756 |
|
|
}
|
757 |
|
|
// opera cannot handle urls relative to file:// without assistance
|
758 |
|
|
if( window.opera!=null && window.location.protocol=="file:" && loc.indexOf( ":" )==-1 ) {
|
759 |
|
|
var base=window.location.href;
|
760 |
|
|
var q_pos=base.indexOf( "?" );
|
761 |
|
|
if( q_pos!=-1 ) {
|
762 |
|
|
base=base.substring( 0, q_pos );
|
763 |
|
|
}
|
764 |
|
|
var slash_pos=base.lastIndexOf( "/" );
|
765 |
|
|
if( slash_pos!=-1 ) {
|
766 |
|
|
base=base.substring( 0, slash_pos+1 );
|
767 |
|
|
Test.AnotherWay._g_opera_path_correction=base;
|
768 |
|
|
loc=base+loc;
|
769 |
|
|
}
|
770 |
|
|
}
|
771 |
|
|
// if this function is called from another page, and if that page is in another directory, correction is needed
|
772 |
|
|
if( outside_path_correction!=null ) {
|
773 |
|
|
var pos=loc.indexOf( outside_path_correction );
|
774 |
|
|
if( pos==0 ) {
|
775 |
|
|
loc=loc.substring( outside_path_correction.length+1 );
|
776 |
|
|
}
|
777 |
|
|
}
|
778 |
|
|
if( iframe.location!=null ) {
|
779 |
|
|
iframe.location.replace( loc );
|
780 |
|
|
}else {
|
781 |
|
|
iframe.src=loc;
|
782 |
|
|
}
|
783 |
|
|
return {};
|
784 |
|
|
}
|
785 |
|
|
Test.AnotherWay._start_loading_page=function()
|
786 |
|
|
{
|
787 |
|
|
var test_page=Test.AnotherWay._g_tests_queue[0];
|
788 |
|
|
test_page.loading_timeout_milliseconds=2000;
|
789 |
|
|
test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
|
790 |
|
|
test_page.wait_msg=Test.AnotherWay._print_counter_result( test_page.url, "loading...", test_page.loading_timeout_milliseconds, "loading" );
|
791 |
|
|
if( test_page.convention=="jsan" ) {
|
792 |
|
|
// the tests in that page will run when it's loading, so the test object must be ready
|
793 |
|
|
Test.AnotherWay._g_test_object_for_jsan=new Test.AnotherWay._test_object_t( test_page.url );
|
794 |
|
|
}
|
795 |
|
|
var outside_path_correction=null;
|
796 |
|
|
if( Test.AnotherWay._g_outside_path_correction!=null && !test_page.suppress_outside_path_correction ) {
|
797 |
|
|
outside_path_correction=Test.AnotherWay._g_outside_path_correction;
|
798 |
|
|
}
|
799 |
|
|
var result=Test.AnotherWay._set_iframe_location( Test.AnotherWay._g_test_iframe, test_page.url, outside_path_correction );
|
800 |
|
|
if( result.msg!=null ) {
|
801 |
|
|
Test.AnotherWay._unprint_result( test_page.wait_msg );
|
802 |
|
|
Test.AnotherWay._print_result( test_page.url, result.msg, "badtest", null );
|
803 |
|
|
Test.AnotherWay._load_next_page();
|
804 |
|
|
}
|
805 |
|
|
}
|
806 |
|
|
|
807 |
|
|
Test.AnotherWay._loading_timeout=function()
|
808 |
|
|
{
|
809 |
|
|
var test_page=Test.AnotherWay._g_tests_queue[0];
|
810 |
|
|
test_page.loading_timeout_milliseconds-=Test.AnotherWay._g_timeout_granularity;
|
811 |
|
|
if( test_page.loading_timeout_milliseconds>0 ) {
|
812 |
|
|
Test.AnotherWay._update_msg_counter( test_page.wait_msg, (test_page.loading_timeout_milliseconds/1000).toFixed() );
|
813 |
|
|
test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
|
814 |
|
|
}else {
|
815 |
|
|
Test.AnotherWay._unprint_result( test_page.wait_msg );
|
816 |
|
|
Test.AnotherWay._print_result( test_page.url, "Unable to load test page. Timeout expired", "badtest", null );
|
817 |
|
|
Test.AnotherWay._load_next_page();
|
818 |
|
|
}
|
819 |
|
|
}
|
820 |
|
|
|
821 |
|
|
Test.AnotherWay._strip_query_and_hash=function( s )
|
822 |
|
|
{
|
823 |
|
|
var i=s.lastIndexOf( "#" );
|
824 |
|
|
if( i!=-1 ) {
|
825 |
|
|
s=s.substring( 0, i );
|
826 |
|
|
}
|
827 |
|
|
i=s.lastIndexOf( "?" );
|
828 |
|
|
if( i!=-1 ) {
|
829 |
|
|
s=s.substring( 0, i );
|
830 |
|
|
}
|
831 |
|
|
return s;
|
832 |
|
|
}
|
833 |
|
|
Test.AnotherWay._is_url_loaded=function( url, wnd )
|
834 |
|
|
{
|
835 |
|
|
var loaded=false;
|
836 |
|
|
if( wnd!=null && wnd.location!=null ) {
|
837 |
|
|
// after some popup blocker interference, location may behave strange..
|
838 |
|
|
var location_s="";
|
839 |
|
|
location_s+=wnd.location;
|
840 |
|
|
if( location_s!="" ) {
|
841 |
|
|
var pathname=wnd.location.pathname;
|
842 |
|
|
var expected_url=url;
|
843 |
|
|
var i=expected_url.lastIndexOf( "#" );
|
844 |
|
|
if( i!=-1 ) {
|
845 |
|
|
expected_url=expected_url.substring( 0, i );
|
846 |
|
|
}
|
847 |
|
|
i=expected_url.lastIndexOf( "?" );
|
848 |
|
|
if( i!=-1 ) {
|
849 |
|
|
expected_url=expected_url.substring( 0, i );
|
850 |
|
|
}
|
851 |
|
|
i=expected_url.lastIndexOf( "/" );
|
852 |
|
|
if( i!=-1 && i!=expected_url.length-1 ) {
|
853 |
|
|
expected_url=expected_url.substring( i+1 );
|
854 |
|
|
}
|
855 |
|
|
i=pathname.indexOf( expected_url )
|
856 |
|
|
if( wnd.location.href==url || (i!=-1 && i==pathname.length-expected_url.length) ) {
|
857 |
|
|
if( /*window.opera==null*/wnd.document.readyState==null || wnd.document.readyState=="complete" ) { // for opera (and IE?), getElementById does not work until..
|
858 |
|
|
loaded=true;
|
859 |
|
|
}
|
860 |
|
|
}
|
861 |
|
|
}
|
862 |
|
|
}
|
863 |
|
|
return loaded;
|
864 |
|
|
}
|
865 |
|
|
// find and run all test functions in the g_cur_page html page.
|
866 |
|
|
Test.AnotherWay._test_page_onload=function()
|
867 |
|
|
{
|
868 |
|
|
if( Test.AnotherWay._g_tests_queue.length==0 ) {
|
869 |
|
|
return;
|
870 |
|
|
}
|
871 |
|
|
var test_page=Test.AnotherWay._g_tests_queue[0];
|
872 |
|
|
if( !Test.AnotherWay._is_url_loaded( test_page.url, Test.AnotherWay._g_test_iframe ) ) {
|
873 |
|
|
return;
|
874 |
|
|
}
|
875 |
|
|
clearTimeout( test_page.timeout_id );
|
876 |
|
|
Test.AnotherWay._unprint_result( test_page.wait_msg );
|
877 |
|
|
|
878 |
|
|
if( test_page.convention=="anotherway" ) {
|
879 |
|
|
// get test function names (those beginning with "test")
|
880 |
|
|
if( typeof( Test.AnotherWay._g_test_iframe.document.scripts )!='undefined' ) { // IE
|
881 |
|
|
for( var i=0; i<Test.AnotherWay._g_test_iframe.document.scripts.length; ++i ) {
|
882 |
|
|
var script_text=Test.AnotherWay._g_test_iframe.document.scripts[i].text;
|
883 |
|
|
var fun_sig="function test";
|
884 |
|
|
var fun_start=script_text.indexOf( fun_sig );
|
885 |
|
|
|
886 |
|
|
while( fun_start!=-1 ) {
|
887 |
|
|
script_text=script_text.substring( fun_start, script_text.length );
|
888 |
|
|
var fun_end=script_text.indexOf( '(' );
|
889 |
|
|
var fun_name=script_text.substring( "function ".length, fun_end );
|
890 |
|
|
var whitespace = fun_name.indexOf( ' ' );
|
891 |
|
|
if (whitespace >= 0)
|
892 |
|
|
fun_name = fun_name.substring( 0, whitespace );
|
893 |
|
|
test_page.test_objects.push( new Test.AnotherWay._test_object_t( fun_name ) );
|
894 |
|
|
script_text=script_text.substring( fun_end, script_text.length );
|
895 |
|
|
fun_start=script_text.indexOf( fun_sig );
|
896 |
|
|
}
|
897 |
|
|
}
|
898 |
|
|
}else { // otherwise (not IE) it ought to work like this
|
899 |
|
|
for( var i in Test.AnotherWay._g_test_iframe) {
|
900 |
|
|
if( typeof( Test.AnotherWay._g_test_iframe[i] )=='function' ) {
|
901 |
|
|
if( i.substring( 0, 4 )=="test" ) {
|
902 |
|
|
test_page.test_objects.push( new Test.AnotherWay._test_object_t( i ) );
|
903 |
|
|
}
|
904 |
|
|
}
|
905 |
|
|
}
|
906 |
|
|
}
|
907 |
|
|
}else if( test_page.convention=="jsan" ) {
|
908 |
|
|
// the test object is already filled with results
|
909 |
|
|
test_page.test_objects.push( Test.AnotherWay._g_test_object_for_jsan );
|
910 |
|
|
}
|
911 |
|
|
|
912 |
|
|
if( test_page.test_objects.length==0 ) {
|
913 |
|
|
Test.AnotherWay._print_result( test_page.url, "No test functions defined in the page", "badtest", null );
|
914 |
|
|
Test.AnotherWay._load_next_page();
|
915 |
|
|
return;
|
916 |
|
|
}
|
917 |
|
|
|
918 |
|
|
test_page.wait_msg=Test.AnotherWay._print_result( test_page.url, "running tests..<span class=\"counter\">"+test_page.test_objects.length+"</span>", "running", null );
|
919 |
|
|
|
920 |
|
|
test_page.test_object_i=0;
|
921 |
|
|
Test.AnotherWay._run_more_tests();
|
922 |
|
|
}
|
923 |
|
|
|
924 |
|
|
Test.AnotherWay._handle_exception=function( o, e, title )
|
925 |
|
|
{
|
926 |
|
|
var s=title+": "+typeof( e )+": ";
|
927 |
|
|
if( e.message!=null ) {
|
928 |
|
|
s+=e.message;
|
929 |
|
|
}else if( e.description!=null ) {
|
930 |
|
|
s+=e.description;
|
931 |
|
|
}else {
|
932 |
|
|
s+=e.toString();
|
933 |
|
|
}
|
934 |
|
|
// if( e.location!=null ) { // XXX figure out how to display exception location if it's present (like in mozilla)
|
935 |
|
|
// s+=" location: "+e.location.toString();
|
936 |
|
|
// }
|
937 |
|
|
o.exception=s;
|
938 |
|
|
s=[];
|
939 |
|
|
if( e.stack ) {
|
940 |
|
|
var lines=e.stack.split( "\n" );
|
941 |
|
|
for( var i=0; i<lines.length; ++i ) {
|
942 |
|
|
// format of the line: func_name(args)@file_name:line_no
|
943 |
|
|
if( lines[i].match( /(\w*)\(([^\)]*)\)@(.*):([^:]*)$/ ) ) {
|
944 |
|
|
var func_name=RegExp.$1;
|
945 |
|
|
if( func_name.length==0 ) {
|
946 |
|
|
func_name="<anonymous>";
|
947 |
|
|
}
|
948 |
|
|
s.push( "in "+func_name+"( "+RegExp.$2+") at "+RegExp.$3+" line "+RegExp.$4+"\n" );
|
949 |
|
|
}
|
950 |
|
|
}
|
951 |
|
|
}
|
952 |
|
|
o.exception_stack=s;
|
953 |
|
|
}
|
954 |
|
|
|
955 |
|
|
Test.AnotherWay._run_more_tests=function()
|
956 |
|
|
{
|
957 |
|
|
var test_page=Test.AnotherWay._g_tests_queue[0];
|
958 |
|
|
while( test_page.test_object_i<test_page.test_objects.length ) {
|
959 |
|
|
Test.AnotherWay._update_msg_counter( test_page.wait_msg, (1+test_page.test_object_i)+"/"+test_page.test_objects.length );
|
960 |
|
|
var o=test_page.test_objects[test_page.test_object_i];
|
961 |
|
|
if( test_page.convention=="anotherway" ) {
|
962 |
|
|
try {
|
963 |
|
|
Test.AnotherWay._g_test_iframe[o.name]( o );
|
964 |
|
|
}catch( e ) {
|
965 |
|
|
Test.AnotherWay._handle_exception( o, e, "" );
|
966 |
|
|
}
|
967 |
|
|
} // for "jsan" convention, test has run already
|
968 |
|
|
if( o.delay_actions.length>0 || o.wait_result_milliseconds>0 ) {
|
969 |
|
|
o.delay_total_milliseconds_left+=o.wait_result_milliseconds;
|
970 |
|
|
Test.AnotherWay._delay_actions_timeout();
|
971 |
|
|
return;
|
972 |
|
|
}
|
973 |
|
|
++test_page.test_object_i;
|
974 |
|
|
}
|
975 |
|
|
Test.AnotherWay._unprint_result( test_page.wait_msg );
|
976 |
|
|
Test.AnotherWay._print_result( test_page.url, null, null, test_page.test_objects );
|
977 |
|
|
Test.AnotherWay._load_next_page();
|
978 |
|
|
}
|
979 |
|
|
|
980 |
|
|
Test.AnotherWay._delay_actions_timeout=function()
|
981 |
|
|
{
|
982 |
|
|
var test_page=Test.AnotherWay._g_tests_queue[0];
|
983 |
|
|
var test_object=test_page.test_objects[test_page.test_object_i];
|
984 |
|
|
var finished=true;
|
985 |
|
|
if( test_object.delay_action_i==null ) {
|
986 |
|
|
// set up to start first action
|
987 |
|
|
test_object.delay_action_i=-1;
|
988 |
|
|
}else {
|
989 |
|
|
// perform current action
|
990 |
|
|
var milliseconds_passed=(new Date()).getTime()-test_object.delay_prev_timer_time;
|
991 |
|
|
test_object.delay_current_milliseconds_left-=milliseconds_passed;
|
992 |
|
|
test_object.delay_total_milliseconds_left-=milliseconds_passed;
|
993 |
|
|
finished=Test.AnotherWay._delay_continue_action( test_object, milliseconds_passed );
|
994 |
|
|
}
|
995 |
|
|
while( finished && test_object.delay_action_i<test_object.delay_actions.length ) {
|
996 |
|
|
++test_object.delay_action_i; // start next action
|
997 |
|
|
finished=Test.AnotherWay._delay_start_action( test_object );
|
998 |
|
|
}
|
999 |
|
|
if( test_object.delay_action_i<=test_object.delay_actions.length ) { // any more actions left ?
|
1000 |
|
|
test_object.delay_prev_timer_time=(new Date()).getTime();
|
1001 |
|
|
var next_timeout=Test.AnotherWay._g_timeout_granularity;
|
1002 |
|
|
if( test_object.delay_current_milliseconds_left<next_timeout ) {
|
1003 |
|
|
next_timeout=test_object.delay_current_milliseconds_left;
|
1004 |
|
|
}
|
1005 |
|
|
if( test_object.second_wait_msg!=null ) {
|
1006 |
|
|
Test.AnotherWay._update_msg_counter( test_object.second_wait_msg, (test_object.delay_total_milliseconds_left/1000).toFixed() );
|
1007 |
|
|
}
|
1008 |
|
|
setTimeout( Test.AnotherWay._delay_actions_timeout, next_timeout );
|
1009 |
|
|
}else { // no more actions left. run the next test.
|
1010 |
|
|
if( test_object.second_wait_msg!=null ) {
|
1011 |
|
|
Test.AnotherWay._unprint_result( test_object.second_wait_msg );
|
1012 |
|
|
test_object.second_wait_msg=null;
|
1013 |
|
|
}
|
1014 |
|
|
++test_page.test_object_i;
|
1015 |
|
|
Test.AnotherWay._run_more_tests();
|
1016 |
|
|
}
|
1017 |
|
|
}
|
1018 |
|
|
Test.AnotherWay._delay_start_action=function( test_object )
|
1019 |
|
|
{
|
1020 |
|
|
var finished=false;
|
1021 |
|
|
var wait_msg="";
|
1022 |
|
|
if( test_object.delay_action_i==test_object.delay_actions.length ) {
|
1023 |
|
|
if( test_object.wait_result_milliseconds>0 ) {
|
1024 |
|
|
test_object.delay_current_milliseconds_left=test_object.wait_result_milliseconds; // wait for result
|
1025 |
|
|
wait_msg="waiting for results..";
|
1026 |
|
|
}else {
|
1027 |
|
|
++test_object.delay_action_i; // dont wait for result
|
1028 |
|
|
}
|
1029 |
|
|
}else {
|
1030 |
|
|
var action=test_object.delay_actions[test_object.delay_action_i];
|
1031 |
|
|
if( action.action_kind=="call" ) {
|
1032 |
|
|
test_object.delay_current_milliseconds_left=action.call_delay_milliseconds;
|
1033 |
|
|
wait_msg="performing delayed calls..";
|
1034 |
|
|
}else if( action.action_kind=="window" ) {
|
1035 |
|
|
if( Test.AnotherWay._g_opera_path_correction!=null && action.wnd_url.indexOf( ":" )==-1 ) {
|
1036 |
|
|
action.wnd_url=Test.AnotherWay._g_opera_path_correction+action.wnd_url;
|
1037 |
|
|
}
|
1038 |
|
|
action.wnd_wnd=window.open( action.wnd_url, "_blank" );
|
1039 |
|
|
if( action.wnd_wnd==null ) {
|
1040 |
|
|
finished=true;
|
1041 |
|
|
test_object.fail( "unable to open window for "+action.wnd_url );
|
1042 |
|
|
}else {
|
1043 |
|
|
test_object.delay_current_milliseconds_left=action.wnd_timeout_milliseconds;
|
1044 |
|
|
wait_msg="opening window..";
|
1045 |
|
|
}
|
1046 |
|
|
}else if( action.action_kind=="replay" ) {
|
1047 |
|
|
if( action.replay_events.length==0 ) {
|
1048 |
|
|
finished=true;
|
1049 |
|
|
}else {
|
1050 |
|
|
action.replay_event_i=0;
|
1051 |
|
|
test_object.delay_current_milliseconds_left=action.replay_events[0]["time"];
|
1052 |
|
|
wait_msg="replaying events..";
|
1053 |
|
|
}
|
1054 |
|
|
}
|
1055 |
|
|
}
|
1056 |
|
|
if( test_object.second_wait_msg!=null ) {
|
1057 |
|
|
Test.AnotherWay._unprint_result( test_object.second_wait_msg );
|
1058 |
|
|
}
|
1059 |
|
|
if( wait_msg!="" ) {
|
1060 |
|
|
var test_page=Test.AnotherWay._g_tests_queue[0];
|
1061 |
|
|
test_object.second_wait_msg=Test.AnotherWay._print_counter_result( test_page.url, wait_msg, test_object.delay_total_milliseconds_left, "waiting" );
|
1062 |
|
|
}else {
|
1063 |
|
|
test_object.second_wait_msg=null;
|
1064 |
|
|
}
|
1065 |
|
|
return finished;
|
1066 |
|
|
}
|
1067 |
|
|
Test.AnotherWay._delay_continue_action=function( test_object, milliseconds_passed )
|
1068 |
|
|
{
|
1069 |
|
|
var finished=test_object.delay_current_milliseconds_left<=0;
|
1070 |
|
|
if( test_object.delay_action_i==test_object.delay_actions.length ) { // action is "waiting for results"
|
1071 |
|
|
if( test_object.n_plan!=null && test_object.n_plan==test_object.n_ok+test_object.n_fail ) {
|
1072 |
|
|
finished=true; // if all assertions results are recorded, don't wait any more
|
1073 |
|
|
}
|
1074 |
|
|
if( finished ) {
|
1075 |
|
|
++test_object.delay_action_i; // move on to the next test
|
1076 |
|
|
}
|
1077 |
|
|
}else {
|
1078 |
|
|
var action=test_object.delay_actions[test_object.delay_action_i];
|
1079 |
|
|
if( action.action_kind=="call" ) {
|
1080 |
|
|
if( finished ) {
|
1081 |
|
|
try {
|
1082 |
|
|
action.call_fn();
|
1083 |
|
|
}catch( e ) {
|
1084 |
|
|
Test.AnotherWay._handle_exception( test_object, e, "in delay_call" );
|
1085 |
|
|
}
|
1086 |
|
|
}
|
1087 |
|
|
}else if( action.action_kind=="window" ) {
|
1088 |
|
|
test_object.delay_total_milliseconds_left+=milliseconds_passed; // for "window", the countdown is suspended since it's unknown how long it will take
|
1089 |
|
|
if( Test.AnotherWay._is_url_loaded( action.wnd_url, action.wnd_wnd ) ) {
|
1090 |
|
|
try {
|
1091 |
|
|
action.wnd_fn( action.wnd_wnd );
|
1092 |
|
|
}catch( e ) {
|
1093 |
|
|
Test.AnotherWay._handle_exception( test_object, e, "in open_window function call" );
|
1094 |
|
|
}
|
1095 |
|
|
finished=true;
|
1096 |
|
|
}else if( finished ) {
|
1097 |
|
|
test_object.fail( "unable to open window for url '"+action.wnd_url+"'. timeout expired" );
|
1098 |
|
|
}
|
1099 |
|
|
}else if( action.action_kind=="replay" ) {
|
1100 |
|
|
if( finished ) {
|
1101 |
|
|
// try {
|
1102 |
|
|
Test.AnotherWay._delay_replay_event( test_object, action.replay_wnd, action.replay_events[action.replay_event_i], action.replay_checkpoints );
|
1103 |
|
|
// }catch( e ) { // disabled, until I know how to gel location info from an exception
|
1104 |
|
|
// Test.AnotherWay._handle_exception( test_object, e, "while replaying event" );
|
1105 |
|
|
// }
|
1106 |
|
|
++action.replay_event_i;
|
1107 |
|
|
finished=action.replay_event_i==action.replay_events.length;
|
1108 |
|
|
if( !finished ) {
|
1109 |
|
|
test_object.delay_current_milliseconds_left=action.replay_events[action.replay_event_i]["time"];
|
1110 |
|
|
}
|
1111 |
|
|
}
|
1112 |
|
|
}
|
1113 |
|
|
}
|
1114 |
|
|
return finished;
|
1115 |
|
|
}
|
1116 |
|
|
Test.AnotherWay._delay_replay_event=function( test_object, wnd, event, checkpoints )
|
1117 |
|
|
{
|
1118 |
|
|
if( event.type=="_checkpoint" ) {
|
1119 |
|
|
var checkpoint_n=event.which;
|
1120 |
|
|
var prev_n_fail=test_object.n_fail;
|
1121 |
|
|
checkpoints[checkpoint_n]( test_object, wnd );
|
1122 |
|
|
var flash_color= prev_n_fail==test_object.n_fail ? "#2f2" : "#f22" ;
|
1123 |
|
|
Test.AnotherWay._record_flash_border( flash_color );
|
1124 |
|
|
}else if( event.type=="click" || event.type=="mouseover" || event.type=="mouseout" || event.type=="mousemove" || event.type=="mousedown" || event.type=="mouseup" ) {
|
1125 |
|
|
var target=Test.AnotherWay._record_node_path_to_node( event["target"], wnd.document );
|
1126 |
|
|
if( target!=null ) {
|
1127 |
|
|
Test.AnotherWay._record_control_update_highlight( target, "ball", event );
|
1128 |
|
|
var e=wnd.document.createEvent( "MouseEvents" );
|
1129 |
|
|
var related_target=Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document );
|
1130 |
|
|
e.initMouseEvent(
|
1131 |
|
|
event["type"],
|
1132 |
|
|
event["cancelable"],
|
1133 |
|
|
event["bubbles"],
|
1134 |
|
|
wnd.document.defaultView,
|
1135 |
|
|
event["detail"],
|
1136 |
|
|
event["screenX"],
|
1137 |
|
|
event["screenY"],
|
1138 |
|
|
event["clientX"],
|
1139 |
|
|
event["clientY"],
|
1140 |
|
|
event["ctrlKey"],
|
1141 |
|
|
event["altKey"],
|
1142 |
|
|
event["shiftKey"],
|
1143 |
|
|
event["metaKey"],
|
1144 |
|
|
event["button"],
|
1145 |
|
|
Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document )
|
1146 |
|
|
);
|
1147 |
|
|
// Firefox 1.0.6 somehow loses relatedTarget somewhere on the way. Pass through our own, for those who choose to care.
|
1148 |
|
|
e.passThroughRelatedTarget=related_target;
|
1149 |
|
|
target.dispatchEvent( e );
|
1150 |
|
|
}
|
1151 |
|
|
}else if( event.type=="keyup" || event.type=="keydown" || event.type=="keypress" ) {
|
1152 |
|
|
var e=wnd.document.createEvent( "KeyboardEvents" ); // forget it. Apparently it's not supported neither by mozilla nor by opera.
|
1153 |
|
|
e.initKeyboardEvent(
|
1154 |
|
|
event["type"],
|
1155 |
|
|
event["cancelable"],
|
1156 |
|
|
event["bubbles"],
|
1157 |
|
|
wnd.document.defaultView,
|
1158 |
|
|
event["which"],
|
1159 |
|
|
event["which"],
|
1160 |
|
|
event["ctrlKey"],
|
1161 |
|
|
event["altKey"],
|
1162 |
|
|
event["shiftKey"],
|
1163 |
|
|
event["metaKey"],
|
1164 |
|
|
false
|
1165 |
|
|
);
|
1166 |
|
|
wnd.document.dispatchEvent( e );
|
1167 |
|
|
}
|
1168 |
|
|
}
|
1169 |
|
|
|
1170 |
|
|
Test.AnotherWay._print_counter_result=function( url, msg, milliseconds, style )
|
1171 |
|
|
{
|
1172 |
|
|
return Test.AnotherWay._print_result( url, msg+"<span class=\"counter\">"+(milliseconds/1000).toFixed()+"</span>", style, null );
|
1173 |
|
|
}
|
1174 |
|
|
|
1175 |
|
|
Test.AnotherWay._g_result_count=0; // for assigning unique ids to result paragraphs
|
1176 |
|
|
|
1177 |
|
|
// number of pages tested
|
1178 |
|
|
Test.AnotherWay._g_ok_pages=0;
|
1179 |
|
|
Test.AnotherWay._g_fail_pages=0;
|
1180 |
|
|
|
1181 |
|
|
Test.AnotherWay._print_result=function( url, msg, style, test_objects )
|
1182 |
|
|
{
|
1183 |
|
|
var results=document.getElementById( "results" );
|
1184 |
|
|
var r=results.appendChild( document.createElement( "p" ) );
|
1185 |
|
|
r.id="result"+Test.AnotherWay._g_result_count;
|
1186 |
|
|
++Test.AnotherWay._g_result_count;
|
1187 |
|
|
r.onclick=Test.AnotherWay._toggle_detail;
|
1188 |
|
|
var text="<span class=\"bullet\"> </span> ";
|
1189 |
|
|
if( url!="" ) {
|
1190 |
|
|
text+=url+": ";
|
1191 |
|
|
}
|
1192 |
|
|
if( msg!=null ) {
|
1193 |
|
|
text+=msg;
|
1194 |
|
|
}
|
1195 |
|
|
if( test_objects!=null ) {
|
1196 |
|
|
// compose summary and detail texts
|
1197 |
|
|
var total_ok=0;
|
1198 |
|
|
var total_detail_ok=0;
|
1199 |
|
|
var total_fail=0;
|
1200 |
|
|
var total_detail_fail=0;
|
1201 |
|
|
var no_plan=0;
|
1202 |
|
|
|
1203 |
|
|
var detail=results.appendChild( document.createElement( "div" ) );
|
1204 |
|
|
|
1205 |
|
|
if( r.id.match( /^result(\d+)$/ ) ) {
|
1206 |
|
|
detail.id="result_detail"+RegExp.$1;
|
1207 |
|
|
}
|
1208 |
|
|
|
1209 |
|
|
for( var i=0; i<test_objects.length; ++i ) {
|
1210 |
|
|
var o=test_objects[i];
|
1211 |
|
|
var p;
|
1212 |
|
|
var p_text;
|
1213 |
|
|
p=document.createElement( "P" );
|
1214 |
|
|
Test.AnotherWay._set_css_class( p, "result_detail" );
|
1215 |
|
|
p_text=o.name;
|
1216 |
|
|
if( o.n_fail>0 || o.exception || (o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) || (o.n_plan==null && o.n_ok==0 && o.n_fail==0)) {
|
1217 |
|
|
++total_fail;
|
1218 |
|
|
p_text+=" <span class=\"fail\">";
|
1219 |
|
|
if( o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) {
|
1220 |
|
|
p_text+="planned "+o.n_plan+" assertions but got "+(o.n_ok+o.n_fail)+"; ";
|
1221 |
|
|
}
|
1222 |
|
|
if(o.n_plan==null && o.n_ok==0 && o.n_fail==0) {
|
1223 |
|
|
p_text+="test did not output anything";
|
1224 |
|
|
}else {
|
1225 |
|
|
p_text+=" fail "+o.n_fail;
|
1226 |
|
|
}
|
1227 |
|
|
p_text+="</span>";
|
1228 |
|
|
}else {
|
1229 |
|
|
++total_ok;
|
1230 |
|
|
}
|
1231 |
|
|
p_text+=" ok "+o.n_ok;
|
1232 |
|
|
if( o.n_plan==null ) {
|
1233 |
|
|
no_plan=1;
|
1234 |
|
|
p_text+=" <span class=\"warning\">no plan</span>";
|
1235 |
|
|
}
|
1236 |
|
|
p.innerHTML=p_text;
|
1237 |
|
|
detail.appendChild( p );
|
1238 |
|
|
if( o.exception ) {
|
1239 |
|
|
p=document.createElement( "P" );
|
1240 |
|
|
Test.AnotherWay._set_css_class( p, "result_exception_detail" );
|
1241 |
|
|
p.innerHTML="<span class=\"fail\">exception:</span> "+o.exception;
|
1242 |
|
|
detail.appendChild( p );
|
1243 |
|
|
p=document.createElement( "P" );
|
1244 |
|
|
Test.AnotherWay._set_css_class( p, "result_exception_stack_detail" );
|
1245 |
|
|
p.innerHTML=o.exception_stack.join( "<br/>" );
|
1246 |
|
|
detail.appendChild( p );
|
1247 |
|
|
}
|
1248 |
|
|
for( var ii=0; ii<o.assertions.length; ++ii ) {
|
1249 |
|
|
var oo=o.assertions[ii];
|
1250 |
|
|
var status=oo.ok ? "ok" : "<span class=\"fail\">fail</span>";
|
1251 |
|
|
p=document.createElement( "P" );
|
1252 |
|
|
Test.AnotherWay._set_css_class( p, "result_micro_detail" );
|
1253 |
|
|
p.innerHTML=status;
|
1254 |
|
|
p.appendChild( document.createTextNode( " "+oo.name ) );
|
1255 |
|
|
detail.appendChild( p );
|
1256 |
|
|
}
|
1257 |
|
|
total_detail_ok+=o.n_ok;
|
1258 |
|
|
total_detail_fail+=o.n_fail;
|
1259 |
|
|
}
|
1260 |
|
|
if( total_fail || total_detail_fail ) {
|
1261 |
|
|
text+=" fail "+total_fail;
|
1262 |
|
|
}
|
1263 |
|
|
text+=" ok "+total_ok+" (detailed:";
|
1264 |
|
|
if( total_fail || total_detail_fail ) {
|
1265 |
|
|
text+=" fail "+total_detail_fail;
|
1266 |
|
|
}
|
1267 |
|
|
text+=" ok "+total_detail_ok+")";
|
1268 |
|
|
if( no_plan ) {
|
1269 |
|
|
text+=" <span class=\"warning\">no plan</span>";
|
1270 |
|
|
}
|
1271 |
|
|
style= total_fail==0 ? "ok" : "fail";
|
1272 |
|
|
detail.style.display= style=="fail" ? "block" : "none";
|
1273 |
|
|
detail.style.cursor="text";
|
1274 |
|
|
}
|
1275 |
|
|
if( style!=null ) {
|
1276 |
|
|
Test.AnotherWay._set_css_class( r, style );
|
1277 |
|
|
if( style=="ok" ) {
|
1278 |
|
|
++Test.AnotherWay._g_ok_pages;
|
1279 |
|
|
}else if( style=="fail" || style=="badtest" ) {
|
1280 |
|
|
++Test.AnotherWay._g_fail_pages;
|
1281 |
|
|
}
|
1282 |
|
|
var pages_total="";
|
1283 |
|
|
if( Test.AnotherWay._g_fail_pages>0 ) {
|
1284 |
|
|
pages_total+=" fail "+Test.AnotherWay._g_fail_pages;
|
1285 |
|
|
}
|
1286 |
|
|
pages_total+=" ok "+Test.AnotherWay._g_ok_pages;
|
1287 |
|
|
Test.AnotherWay._update_results_total( pages_total );
|
1288 |
|
|
}
|
1289 |
|
|
r.innerHTML=text;
|
1290 |
|
|
if( results.scrollHeight!=null && results.scrollTop!=null && results.offsetHeight!=null ) {
|
1291 |
|
|
results.scrollTop=results.scrollHeight-results.offsetHeight;
|
1292 |
|
|
}
|
1293 |
|
|
// when test_objects is not null, the results are final - good time to clean up
|
1294 |
|
|
if( test_objects!=null ) {
|
1295 |
|
|
for( var i=0; i<test_objects.length; ++i ) {
|
1296 |
|
|
var actions=test_objects[i].delay_actions;
|
1297 |
|
|
for( var action_i=0; action_i<actions.length; ++action_i ) {
|
1298 |
|
|
var action=actions[action_i];
|
1299 |
|
|
if( action.action_kind=="window" && action.wnd_wnd!=null && !action.wnd_no_close ) {
|
1300 |
|
|
action.wnd_wnd.close();
|
1301 |
|
|
action.wnd_wnd=null;
|
1302 |
|
|
}
|
1303 |
|
|
}
|
1304 |
|
|
}
|
1305 |
|
|
}
|
1306 |
|
|
return r;
|
1307 |
|
|
}
|
1308 |
|
|
Test.AnotherWay._unprint_result=function( child )
|
1309 |
|
|
{
|
1310 |
|
|
var results=document.getElementById( "results" );
|
1311 |
|
|
results.removeChild( child );
|
1312 |
|
|
}
|
1313 |
|
|
Test.AnotherWay._toggle_detail=function()
|
1314 |
|
|
{
|
1315 |
|
|
if( this.id.match( /^result(\d+)$/ ) ) {
|
1316 |
|
|
var detail=document.getElementById( "result_detail"+RegExp.$1 );
|
1317 |
|
|
if( detail!=null ) {
|
1318 |
|
|
if( detail.style.display=="none" ) {
|
1319 |
|
|
detail.style.display="block";
|
1320 |
|
|
}else if( detail.style.display=="block" ) {
|
1321 |
|
|
detail.style.display="none";
|
1322 |
|
|
}
|
1323 |
|
|
}
|
1324 |
|
|
}
|
1325 |
|
|
}
|
1326 |
|
|
Test.AnotherWay._update_msg_counter=function( msg, text )
|
1327 |
|
|
{
|
1328 |
|
|
for( var i=0; i<msg.childNodes.length; ++i ) {
|
1329 |
|
|
var item=msg.childNodes[i];
|
1330 |
|
|
if( item.nodeName=="SPAN" && Test.AnotherWay._get_css_class( item )=="counter" ) {
|
1331 |
|
|
item.innerHTML=text;
|
1332 |
|
|
}
|
1333 |
|
|
}
|
1334 |
|
|
}
|
1335 |
|
|
Test.AnotherWay._update_results_total=function( msg )
|
1336 |
|
|
{
|
1337 |
|
|
var total=document.getElementById( "total" );
|
1338 |
|
|
if( total ) {
|
1339 |
|
|
total.innerHTML=msg;
|
1340 |
|
|
}
|
1341 |
|
|
}
|
1342 |
|
|
Test.AnotherWay._results_clear_onclick=function()
|
1343 |
|
|
{
|
1344 |
|
|
var results=document.getElementById( "results" );
|
1345 |
|
|
results.innerHTML="";
|
1346 |
|
|
Test.AnotherWay._update_results_total( "" );
|
1347 |
|
|
Test.AnotherWay._g_ok_pages=0;
|
1348 |
|
|
Test.AnotherWay._g_fail_pages=0;
|
1349 |
|
|
var debug=document.getElementById( "debug" );
|
1350 |
|
|
debug.innerHTML="";
|
1351 |
|
|
}
|
1352 |
|
|
|
1353 |
|
|
Test.AnotherWay._get_css_class=function( o )
|
1354 |
|
|
{
|
1355 |
|
|
var c=o.getAttribute( "className" );
|
1356 |
|
|
if( c==null || c=="" ) {
|
1357 |
|
|
c=o.getAttribute( "class" );
|
1358 |
|
|
}
|
1359 |
|
|
return c;
|
1360 |
|
|
}
|
1361 |
|
|
Test.AnotherWay._set_css_class=function( o, css_class )
|
1362 |
|
|
{
|
1363 |
|
|
o.setAttribute( "className", css_class );
|
1364 |
|
|
o.setAttribute( "class", css_class );
|
1365 |
|
|
}
|
1366 |
|
|
|
1367 |
|
|
Test.AnotherWay._tab_onclick=function()
|
1368 |
|
|
{
|
1369 |
|
|
var tab=this;
|
1370 |
|
|
var tabs=[ document.getElementById( "debug_tab" ), document.getElementById( "results_tab" ) ];
|
1371 |
|
|
var panes=[ document.getElementById( "debug" ), document.getElementById( "results" ) ];
|
1372 |
|
|
for( var i=0; i<tabs.length; ++i ) {
|
1373 |
|
|
if( tab==tabs[i] ) {
|
1374 |
|
|
Test.AnotherWay._set_css_class( tabs[i], "active_tab" );
|
1375 |
|
|
panes[i].style.display="block";
|
1376 |
|
|
}else {
|
1377 |
|
|
Test.AnotherWay._set_css_class( tabs[i], "inactive_tab" );
|
1378 |
|
|
panes[i].style.display="none";
|
1379 |
|
|
}
|
1380 |
|
|
}
|
1381 |
|
|
}
|
1382 |
|
|
Test.AnotherWay._tab_mouseover=function()
|
1383 |
|
|
{
|
1384 |
|
|
if( Test.AnotherWay._get_css_class( this )=="inactive_tab" ) {
|
1385 |
|
|
Test.AnotherWay._set_css_class( this, "inactive_mouseover_tab" );
|
1386 |
|
|
}
|
1387 |
|
|
}
|
1388 |
|
|
Test.AnotherWay._tab_mouseout=function()
|
1389 |
|
|
{
|
1390 |
|
|
if( Test.AnotherWay._get_css_class( this )=="inactive_mouseover_tab" ) {
|
1391 |
|
|
Test.AnotherWay._set_css_class( this, "inactive_tab" );
|
1392 |
|
|
}
|
1393 |
|
|
}
|
1394 |
|
|
|
1395 |
|
|
// recording mouse input
|
1396 |
|
|
Test.AnotherWay._record_check_onfocus=function()
|
1397 |
|
|
{
|
1398 |
|
|
var o=this;
|
1399 |
|
|
var check_select=o.type!="text";
|
1400 |
|
|
var div=document.getElementById( "record_div" );
|
1401 |
|
|
var inputs=div.getElementsByTagName( "input" );
|
1402 |
|
|
for( var i=0; i<inputs.length; ++i ) {
|
1403 |
|
|
var input=inputs[i];
|
1404 |
|
|
if( input.type=="radio" ) {
|
1405 |
|
|
if( input.value=="select" ) {
|
1406 |
|
|
input.checked=check_select;
|
1407 |
|
|
}else if( input.value=="input" ) {
|
1408 |
|
|
input.checked=!check_select;
|
1409 |
|
|
}
|
1410 |
|
|
}
|
1411 |
|
|
}
|
1412 |
|
|
}
|
1413 |
|
|
|
1414 |
|
|
Test.AnotherWay._g_no_record_msg=null; // not null - recording is unavailable
|
1415 |
|
|
Test.AnotherWay._g_record_timeout_cnt=0; // opening window for a page for recording
|
1416 |
|
|
Test.AnotherWay._g_record_url=null;
|
1417 |
|
|
Test.AnotherWay._g_record_wnd=null;
|
1418 |
|
|
Test.AnotherWay._g_record_random_id=null; // added to element ids of record_control div so that they do not clash with ids already in the page for which input is recorded
|
1419 |
|
|
Test.AnotherWay._g_record_keydown=null; // recording control - which key is down
|
1420 |
|
|
Test.AnotherWay._g_record_ctrl_keydown=false;
|
1421 |
|
|
Test.AnotherWay._g_record_shift_keydown=false;
|
1422 |
|
|
Test.AnotherWay._g_record_control_visible=true; // recording control ui state
|
1423 |
|
|
Test.AnotherWay._g_record_started;
|
1424 |
|
|
Test.AnotherWay._g_record_paused;
|
1425 |
|
|
Test.AnotherWay._g_record_include_mousemove=false;
|
1426 |
|
|
Test.AnotherWay._g_record_start_time; // for time references
|
1427 |
|
|
Test.AnotherWay._g_record_pause_start_time;
|
1428 |
|
|
Test.AnotherWay._g_record_update_time_interval; // showing time in the control ui
|
1429 |
|
|
Test.AnotherWay._g_record_waiting_for_results=false; // waiting for results window to open
|
1430 |
|
|
Test.AnotherWay._g_record_events; // recorded events
|
1431 |
|
|
Test.AnotherWay._g_record_under_cursor; // track element under cursor
|
1432 |
|
|
Test.AnotherWay._g_record_checkpoint_count; // for checkpoint numbering
|
1433 |
|
|
Test.AnotherWay._g_record_mouse_over_record_control; // for avoiding record control highlight on mouseover
|
1434 |
|
|
Test.AnotherWay._g_record_highlighted_element={ element: null, x: null, y: null };
|
1435 |
|
|
|
1436 |
|
|
Test.AnotherWay._record_control_get_element=function( id )
|
1437 |
|
|
{
|
1438 |
|
|
if( Test.AnotherWay._g_record_wnd!=null && Test.AnotherWay._g_record_wnd.document!=null ) {
|
1439 |
|
|
return Test.AnotherWay._g_record_wnd.document.getElementById( id+Test.AnotherWay._g_record_random_id );
|
1440 |
|
|
}else {
|
1441 |
|
|
return null;
|
1442 |
|
|
}
|
1443 |
|
|
}
|
1444 |
|
|
Test.AnotherWay._record_start_onclick=function() // "record" button on the run_tests.html: open a window for a page for which input is recorded
|
1445 |
|
|
{
|
1446 |
|
|
if( Test.AnotherWay._g_no_record_msg!=null ) {
|
1447 |
|
|
alert( Test.AnotherWay._g_no_record_msg );
|
1448 |
|
|
return;
|
1449 |
|
|
}
|
1450 |
|
|
if( Test.AnotherWay._g_record_timeout_cnt>0
|
1451 |
|
|
|| (Test.AnotherWay._g_record_wnd!=null && (Test.AnotherWay._g_record_wnd.closed!=null && !Test.AnotherWay._g_record_wnd.closed)) ) { // in opera, closed is null.
|
1452 |
|
|
alert( "there is already window opened for recording input for a page "+Test.AnotherWay._g_record_url );
|
1453 |
|
|
return;
|
1454 |
|
|
}
|
1455 |
|
|
var div=document.getElementById( "record_div" );
|
1456 |
|
|
var inputs=div.getElementsByTagName( "input" );
|
1457 |
|
|
var url=null;
|
1458 |
|
|
for( var i=0; i<inputs.length; ++i ) {
|
1459 |
|
|
var input=inputs[i];
|
1460 |
|
|
if( input.type=="radio" ) {
|
1461 |
|
|
if( input.value=="select" && input.checked ) {
|
1462 |
|
|
var index=document.getElementById( "record_select" ).selectedIndex;
|
1463 |
|
|
if( index>0 ) {
|
1464 |
|
|
url=Test.AnotherWay._g_test_page_urls[index-1].url;
|
1465 |
|
|
}
|
1466 |
|
|
}else if( input.value=="input" && input.checked ) {
|
1467 |
|
|
url=document.getElementById( "record_input" ).value;
|
1468 |
|
|
}
|
1469 |
|
|
}
|
1470 |
|
|
}
|
1471 |
|
|
if( url!=null ) {
|
1472 |
|
|
Test.AnotherWay._g_record_url=url;
|
1473 |
|
|
Test.AnotherWay._g_record_wnd=window.open( url, "_blank" );
|
1474 |
|
|
if( Test.AnotherWay._g_record_wnd==null ) {
|
1475 |
|
|
alert( "unable to open new window for a page: "+url );
|
1476 |
|
|
}else {
|
1477 |
|
|
Test.AnotherWay._g_record_timeout_cnt=50;
|
1478 |
|
|
setTimeout( Test.AnotherWay._record_window_timeout, 100 );
|
1479 |
|
|
}
|
1480 |
|
|
}
|
1481 |
|
|
}
|
1482 |
|
|
Test.AnotherWay._record_window_timeout=function()
|
1483 |
|
|
{
|
1484 |
|
|
if( Test.AnotherWay._is_url_loaded( Test.AnotherWay._g_record_url, Test.AnotherWay._g_record_wnd ) ) {
|
1485 |
|
|
Test.AnotherWay._record_window_setup( Test.AnotherWay._g_record_wnd );
|
1486 |
|
|
}else {
|
1487 |
|
|
if( --Test.AnotherWay._g_record_timeout_cnt>0 ) {
|
1488 |
|
|
setTimeout( Test.AnotherWay._record_window_timeout, 100 );
|
1489 |
|
|
}else {
|
1490 |
|
|
alert( "timeout expired while opening new window for a page: "+Test.AnotherWay._g_record_url );
|
1491 |
|
|
Test.AnotherWay._g_record_wnd=null;
|
1492 |
|
|
Test.AnotherWay._g_record_url=null;
|
1493 |
|
|
Test.AnotherWay._g_record_timeout_cnt=0;
|
1494 |
|
|
}
|
1495 |
|
|
}
|
1496 |
|
|
}
|
1497 |
|
|
Test.AnotherWay._record_control_randomize_id=function( e, r )
|
1498 |
|
|
{
|
1499 |
|
|
if( e.id!="" ) {
|
1500 |
|
|
e.id=e.id+r;
|
1501 |
|
|
}
|
1502 |
|
|
for( var c=e.firstChild; c!=null; c=c.nextSibling ) {
|
1503 |
|
|
Test.AnotherWay._record_control_randomize_id( c, r );
|
1504 |
|
|
}
|
1505 |
|
|
}
|
1506 |
|
|
Test.AnotherWay._record_window_setup=function( wnd ) // insert recording control into the page for which input is recorded
|
1507 |
|
|
{
|
1508 |
|
|
Test.AnotherWay._g_record_timeout_cnt=0;
|
1509 |
|
|
var this_div=document.getElementById( "record_control" );
|
1510 |
|
|
var record_control=wnd.document.importNode( this_div, true );
|
1511 |
|
|
Test.AnotherWay._g_record_random_id=(1000*Math.random()).toFixed();
|
1512 |
|
|
Test.AnotherWay._record_control_randomize_id( record_control, Test.AnotherWay._g_record_random_id );
|
1513 |
|
|
Test.AnotherWay._g_record_control_visible=true;
|
1514 |
|
|
Test.AnotherWay._g_record_started=false;
|
1515 |
|
|
Test.AnotherWay._g_record_paused=false;
|
1516 |
|
|
Test.AnotherWay._g_record_checkpoint_count=0;
|
1517 |
|
|
Test.AnotherWay._g_record_mouse_over_record_control=false;
|
1518 |
|
|
var doc=wnd.document;
|
1519 |
|
|
doc.body.appendChild( record_control );
|
1520 |
|
|
// opera sans-serif font is different
|
1521 |
|
|
if( window.opera ) {
|
1522 |
|
|
cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
|
1523 |
|
|
cursor_over_indicator.style.width="18em";
|
1524 |
|
|
cursor_over_indicator.style.height="2em";
|
1525 |
|
|
cursor_over_indicator.style.fontSize="7pt";
|
1526 |
|
|
}
|
1527 |
|
|
doc.addEventListener( "keydown", Test.AnotherWay._record_control_keydown, true );
|
1528 |
|
|
doc.addEventListener( "keyup", Test.AnotherWay._record_control_keyup, true );
|
1529 |
|
|
// doc.addEventListener( "keypress", Test.AnotherWay._record_event, true ); // replaying is not supported by any known browser
|
1530 |
|
|
|
1531 |
|
|
doc.body.addEventListener( "mousemove", Test.AnotherWay._record_on_mousemove, true );
|
1532 |
|
|
doc.body.addEventListener( "click", Test.AnotherWay._record_event, true );
|
1533 |
|
|
doc.body.addEventListener( "mouseover", Test.AnotherWay._record_event, true );
|
1534 |
|
|
doc.body.addEventListener( "mouseout", Test.AnotherWay._record_event, true );
|
1535 |
|
|
doc.body.addEventListener( "mousedown", Test.AnotherWay._record_event, true );
|
1536 |
|
|
doc.body.addEventListener( "mouseup", Test.AnotherWay._record_event, true );
|
1537 |
|
|
}
|
1538 |
|
|
Test.AnotherWay._record_control_key_disabled=function( k )
|
1539 |
|
|
{
|
1540 |
|
|
if( k=="c" ) {
|
1541 |
|
|
return !Test.AnotherWay._g_record_started;
|
1542 |
|
|
}else if( k=="p" ) {
|
1543 |
|
|
return !Test.AnotherWay._g_record_started;
|
1544 |
|
|
}else if( k=="s" ) {
|
1545 |
|
|
return Test.AnotherWay._g_record_waiting_for_results;
|
1546 |
|
|
}else {
|
1547 |
|
|
return false;
|
1548 |
|
|
}
|
1549 |
|
|
}
|
1550 |
|
|
|
1551 |
|
|
Test.AnotherWay._record_control_update_ui=function()
|
1552 |
|
|
{
|
1553 |
|
|
var keydown_color="#fff";
|
1554 |
|
|
var disabled_color="#aaa";
|
1555 |
|
|
var button_color="#adf";
|
1556 |
|
|
var active_color="#fdf";
|
1557 |
|
|
|
1558 |
|
|
var display={};
|
1559 |
|
|
display[false]="none";
|
1560 |
|
|
display[true]="inline";
|
1561 |
|
|
|
1562 |
|
|
var s_button=Test.AnotherWay._record_control_get_element( "record_s" );
|
1563 |
|
|
var record_on=Test.AnotherWay._record_control_get_element( "record_on" );
|
1564 |
|
|
var record_off=Test.AnotherWay._record_control_get_element( "record_off" );
|
1565 |
|
|
|
1566 |
|
|
s_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "s" ) ? disabled_color
|
1567 |
|
|
: Test.AnotherWay._g_record_keydown=="s" ? keydown_color : Test.AnotherWay._g_record_started ? active_color : button_color;
|
1568 |
|
|
record_on.style.display=display[!Test.AnotherWay._g_record_started];
|
1569 |
|
|
record_off.style.display=display[Test.AnotherWay._g_record_started];
|
1570 |
|
|
|
1571 |
|
|
var h_button=Test.AnotherWay._record_control_get_element( "record_h" );
|
1572 |
|
|
h_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="h" ? keydown_color : button_color;
|
1573 |
|
|
|
1574 |
|
|
var p_button=Test.AnotherWay._record_control_get_element( "record_p" );
|
1575 |
|
|
var record_pause_on=Test.AnotherWay._record_control_get_element( "record_pause_on" );
|
1576 |
|
|
var record_pause_off=Test.AnotherWay._record_control_get_element( "record_pause_off" );
|
1577 |
|
|
p_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "p" ) ? disabled_color
|
1578 |
|
|
: Test.AnotherWay._g_record_keydown=="p" ? keydown_color : Test.AnotherWay._g_record_paused ? active_color : button_color;
|
1579 |
|
|
record_pause_on.style.display=display[!Test.AnotherWay._g_record_paused];
|
1580 |
|
|
record_pause_off.style.display=display[Test.AnotherWay._g_record_paused];
|
1581 |
|
|
|
1582 |
|
|
var m_button=Test.AnotherWay._record_control_get_element( "record_m" );
|
1583 |
|
|
var record_include_mousemove=Test.AnotherWay._record_control_get_element( "record_include_mousemove" );
|
1584 |
|
|
var record_omit_mousemove=Test.AnotherWay._record_control_get_element( "record_omit_mousemove" );
|
1585 |
|
|
m_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="m" ? keydown_color : Test.AnotherWay._g_record_include_mousemove ? active_color : button_color;
|
1586 |
|
|
record_include_mousemove.style.display=display[!Test.AnotherWay._g_record_include_mousemove];
|
1587 |
|
|
record_omit_mousemove.style.display=display[Test.AnotherWay._g_record_include_mousemove];
|
1588 |
|
|
|
1589 |
|
|
var c_button=Test.AnotherWay._record_control_get_element( "record_c" );
|
1590 |
|
|
c_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "c" ) ? disabled_color
|
1591 |
|
|
: Test.AnotherWay._g_record_keydown=="c" ? keydown_color : button_color;
|
1592 |
|
|
|
1593 |
|
|
var record_indicator=Test.AnotherWay._record_control_get_element( "record_indicator" );
|
1594 |
|
|
record_indicator.style.display=display[Test.AnotherWay._g_record_started];
|
1595 |
|
|
|
1596 |
|
|
var pause_indicator=Test.AnotherWay._record_control_get_element( "record_pause_indicator" );
|
1597 |
|
|
pause_indicator.style.display=display[Test.AnotherWay._g_record_paused];
|
1598 |
|
|
|
1599 |
|
|
var record_control=Test.AnotherWay._record_control_get_element( "record_control" );
|
1600 |
|
|
record_control.style.display= Test.AnotherWay._g_record_control_visible ? "block" : "none";
|
1601 |
|
|
|
1602 |
|
|
var shift_button=Test.AnotherWay._record_control_get_element( "record_shift_key" );
|
1603 |
|
|
shift_button.style.backgroundColor= Test.AnotherWay._g_record_shift_keydown ? keydown_color : button_color;
|
1604 |
|
|
|
1605 |
|
|
var ctrl_button=Test.AnotherWay._record_control_get_element( "record_ctrl_key" );
|
1606 |
|
|
ctrl_button.style.backgroundColor= Test.AnotherWay._g_record_ctrl_keydown ? keydown_color : button_color;
|
1607 |
|
|
}
|
1608 |
|
|
Test.AnotherWay._record_format_time=function( t )
|
1609 |
|
|
{
|
1610 |
|
|
t=new Date( t );
|
1611 |
|
|
var m=t.getMinutes();
|
1612 |
|
|
var s=t.getSeconds();
|
1613 |
|
|
var str= m==0 ? "" : m+"m ";
|
1614 |
|
|
str+=s+"s.";
|
1615 |
|
|
return str;
|
1616 |
|
|
}
|
1617 |
|
|
Test.AnotherWay._record_control_update_time=function()
|
1618 |
|
|
{
|
1619 |
|
|
var time_display=Test.AnotherWay._record_control_get_element( "record_time" );
|
1620 |
|
|
if( time_display!=null ) {
|
1621 |
|
|
time_display.innerHTML=Test.AnotherWay._record_format_time( (new Date()).getTime()-Test.AnotherWay._g_record_start_time );
|
1622 |
|
|
}
|
1623 |
|
|
}
|
1624 |
|
|
Test.AnotherWay._record_control_update_highlight=function( elem, style, event )
|
1625 |
|
|
{
|
1626 |
|
|
if( elem==null ) {
|
1627 |
|
|
Test.AnotherWay._record_highlight_border( null );
|
1628 |
|
|
}else {
|
1629 |
|
|
var pos=Test.AnotherWay._get_page_coords( elem );
|
1630 |
|
|
if( style=="ball" || elem!=Test.AnotherWay._g_record_highlighted_element.element || pos.x!=Test.AnotherWay._g_record_highlighted_element.x || pos.y!=Test.AnotherWay._g_record_highlighted_element.y ) {
|
1631 |
|
|
Test.AnotherWay._g_record_highlighted_element={ element: elem, x: pos.x, y: pos.y };
|
1632 |
|
|
Test.AnotherWay._record_highlight_border( elem, style, event );
|
1633 |
|
|
}
|
1634 |
|
|
}
|
1635 |
|
|
}
|
1636 |
|
|
Test.AnotherWay._record_decode_key=function( event )
|
1637 |
|
|
{
|
1638 |
|
|
var k=null;
|
1639 |
|
|
if( event==null ) {
|
1640 |
|
|
k=Test.AnotherWay._g_record_wnd.event.keyCode;
|
1641 |
|
|
}else {
|
1642 |
|
|
k=event.which;
|
1643 |
|
|
}
|
1644 |
|
|
if( k==83 ) {
|
1645 |
|
|
return "s";
|
1646 |
|
|
}else if( k==72 ) {
|
1647 |
|
|
return "h";
|
1648 |
|
|
}else if( k==73 ) {
|
1649 |
|
|
return "i";
|
1650 |
|
|
}else if( k==80 ) {
|
1651 |
|
|
return "p";
|
1652 |
|
|
}else if( k==67 ) {
|
1653 |
|
|
return "c";
|
1654 |
|
|
}else if( k==77 ) {
|
1655 |
|
|
return "m";
|
1656 |
|
|
}else if( k==16 ) {
|
1657 |
|
|
return "shift";
|
1658 |
|
|
}else if( k==17 ) {
|
1659 |
|
|
return "ctrl";
|
1660 |
|
|
}else if( k==18 ) {
|
1661 |
|
|
return "alt";
|
1662 |
|
|
}else if( k==19 ) {
|
1663 |
|
|
return "pause";
|
1664 |
|
|
}else if( k==123 ) {
|
1665 |
|
|
return "f12";
|
1666 |
|
|
}
|
1667 |
|
|
return "";
|
1668 |
|
|
}
|
1669 |
|
|
Test.AnotherWay._record_control_keydown=function( event )
|
1670 |
|
|
{
|
1671 |
|
|
var handled=false;
|
1672 |
|
|
var k=Test.AnotherWay._record_decode_key( event );
|
1673 |
|
|
if( k=="shift" ) {
|
1674 |
|
|
Test.AnotherWay._g_record_shift_keydown=true;
|
1675 |
|
|
}else if( k=="ctrl" ) {
|
1676 |
|
|
Test.AnotherWay._g_record_ctrl_keydown=true;
|
1677 |
|
|
}else if( k!="" && (Test.AnotherWay._g_record_keydown==null || Test.AnotherWay._g_record_keydown==k) ) {
|
1678 |
|
|
if( Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown && !Test.AnotherWay._record_control_key_disabled( k ) ) {
|
1679 |
|
|
Test.AnotherWay._g_record_keydown=k;
|
1680 |
|
|
handled=true;
|
1681 |
|
|
}
|
1682 |
|
|
}else {
|
1683 |
|
|
Test.AnotherWay._g_record_keydown="";
|
1684 |
|
|
}
|
1685 |
|
|
Test.AnotherWay._record_control_update_ui();
|
1686 |
|
|
if( !handled ) {
|
1687 |
|
|
// Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
|
1688 |
|
|
}
|
1689 |
|
|
return;
|
1690 |
|
|
}
|
1691 |
|
|
Test.AnotherWay._record_control_keyup=function( event )
|
1692 |
|
|
{
|
1693 |
|
|
var handled=false;
|
1694 |
|
|
var k=Test.AnotherWay._record_decode_key( event );
|
1695 |
|
|
if( k=="shift" ) {
|
1696 |
|
|
Test.AnotherWay._g_record_shift_keydown=false;
|
1697 |
|
|
}else if( k=="ctrl" ) {
|
1698 |
|
|
Test.AnotherWay._g_record_ctrl_keydown=false;
|
1699 |
|
|
}else if( k!="" && k==Test.AnotherWay._g_record_keydown && Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown ) {
|
1700 |
|
|
if( k=="s" ) {
|
1701 |
|
|
Test.AnotherWay._g_record_started=!Test.AnotherWay._g_record_started;
|
1702 |
|
|
if( Test.AnotherWay._g_record_started ) {
|
1703 |
|
|
Test.AnotherWay._g_record_events=[];
|
1704 |
|
|
Test.AnotherWay._g_record_start_time=(new Date()).getTime();
|
1705 |
|
|
Test.AnotherWay._record_control_update_time();
|
1706 |
|
|
Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
|
1707 |
|
|
}else {
|
1708 |
|
|
Test.AnotherWay._record_control_update_highlight( null );
|
1709 |
|
|
if( !Test.AnotherWay._g_record_paused ) {
|
1710 |
|
|
window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
|
1711 |
|
|
}
|
1712 |
|
|
Test.AnotherWay._g_record_waiting_for_results=true;
|
1713 |
|
|
// open a new window for self, pass a parameter to dump recorded events as javascript code there
|
1714 |
|
|
// (the easiest way to obtain a document from the same origin, so it's writable, is to open this same page again)
|
1715 |
|
|
Test.AnotherWay._g_record_paused=false;
|
1716 |
|
|
var loc=window.location;
|
1717 |
|
|
loc=loc.protocol+"//"+loc.host+loc.pathname+"?recording_results="+Test.AnotherWay._g_record_random_id;
|
1718 |
|
|
if( window.open( loc, "_blank" )==null ) {
|
1719 |
|
|
alert( "unable to open new window for results" );
|
1720 |
|
|
}
|
1721 |
|
|
}
|
1722 |
|
|
handled=true;
|
1723 |
|
|
}else if( k=="h" ) {
|
1724 |
|
|
Test.AnotherWay._g_record_control_visible=!Test.AnotherWay._g_record_control_visible;
|
1725 |
|
|
handled=true;
|
1726 |
|
|
}else if( k=="p" ) {
|
1727 |
|
|
Test.AnotherWay._g_record_paused=!Test.AnotherWay._g_record_paused;
|
1728 |
|
|
if( Test.AnotherWay._g_record_paused ) {
|
1729 |
|
|
Test.AnotherWay._g_record_pause_start_time=(new Date()).getTime();
|
1730 |
|
|
if( Test.AnotherWay._g_record_started ) {
|
1731 |
|
|
window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
|
1732 |
|
|
}
|
1733 |
|
|
Test.AnotherWay._record_control_update_highlight( null );
|
1734 |
|
|
}else {
|
1735 |
|
|
var pause_duration=(new Date()).getTime()-Test.AnotherWay._g_record_pause_start_time;
|
1736 |
|
|
Test.AnotherWay._g_record_start_time+=pause_duration;
|
1737 |
|
|
Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
|
1738 |
|
|
}
|
1739 |
|
|
handled=true;
|
1740 |
|
|
}else if( k=="m" ) {
|
1741 |
|
|
Test.AnotherWay._g_record_include_mousemove=!Test.AnotherWay._g_record_include_mousemove;
|
1742 |
|
|
handled=true;
|
1743 |
|
|
}else if( k=="c" ) {
|
1744 |
|
|
var o=Test.AnotherWay._record_checkpoint();
|
1745 |
|
|
Test.AnotherWay._record_display_checkpoint( o );
|
1746 |
|
|
Test.AnotherWay._record_flash_border( "#24d" );
|
1747 |
|
|
handled=true;
|
1748 |
|
|
}
|
1749 |
|
|
}
|
1750 |
|
|
Test.AnotherWay._g_record_keydown=null;
|
1751 |
|
|
Test.AnotherWay._record_control_update_ui();
|
1752 |
|
|
if( !handled ) {
|
1753 |
|
|
// Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
|
1754 |
|
|
}
|
1755 |
|
|
return;
|
1756 |
|
|
}
|
1757 |
|
|
Test.AnotherWay._record_html_node_path=function( node )
|
1758 |
|
|
{
|
1759 |
|
|
if( node==null ) {
|
1760 |
|
|
return null;
|
1761 |
|
|
}
|
1762 |
|
|
var path=[];
|
1763 |
|
|
while( true ) {
|
1764 |
|
|
if( node.id!=null && node.id!="" ) {
|
1765 |
|
|
path.unshift( "#"+node.id+" "+node.nodeName );
|
1766 |
|
|
break;
|
1767 |
|
|
}else {
|
1768 |
|
|
var parent_node=node.parentNode;
|
1769 |
|
|
if( parent_node==null ) {
|
1770 |
|
|
return []; // no BODY up the path - this node is screwed (browsers differ in what's above the body), discard
|
1771 |
|
|
}else {
|
1772 |
|
|
var i=0;
|
1773 |
|
|
var found=false;
|
1774 |
|
|
for( var child=parent_node.firstChild; child!=null; child=child.nextSibling ) {
|
1775 |
|
|
if( child==node ) {
|
1776 |
|
|
found=true;
|
1777 |
|
|
break;
|
1778 |
|
|
}
|
1779 |
|
|
if( child.nodeType==1 ) { // count only HTML element nodes
|
1780 |
|
|
++i;
|
1781 |
|
|
}
|
1782 |
|
|
}
|
1783 |
|
|
if( !found ) {
|
1784 |
|
|
i=-1;
|
1785 |
|
|
}
|
1786 |
|
|
path.unshift( i+" "+node.nodeName );
|
1787 |
|
|
if( parent_node.nodeName=="BODY" || parent_node.nodeName=="body" ) {
|
1788 |
|
|
break;
|
1789 |
|
|
}
|
1790 |
|
|
node=parent_node;
|
1791 |
|
|
}
|
1792 |
|
|
}
|
1793 |
|
|
}
|
1794 |
|
|
return path;
|
1795 |
|
|
}
|
1796 |
|
|
Test.AnotherWay._record_node_path_to_string=function( path )
|
1797 |
|
|
{
|
1798 |
|
|
var s="";
|
1799 |
|
|
if( path!=null ) {
|
1800 |
|
|
for( var i=0; i<path.length; ++i ) {
|
1801 |
|
|
s+= i==0 ? "" : ", ";
|
1802 |
|
|
var elem=path[i].split( " " );
|
1803 |
|
|
if( elem[0].charAt( 0 )=="#" ) {
|
1804 |
|
|
s+=elem[1]+" "+elem[0];
|
1805 |
|
|
}else {
|
1806 |
|
|
s+=elem[1]+" ["+elem[0]+"]";
|
1807 |
|
|
}
|
1808 |
|
|
}
|
1809 |
|
|
}
|
1810 |
|
|
return s;
|
1811 |
|
|
}
|
1812 |
|
|
Test.AnotherWay._record_node_path_to_node=function( path_str, doc )
|
1813 |
|
|
{
|
1814 |
|
|
if( path_str==null ) {
|
1815 |
|
|
return null;
|
1816 |
|
|
}
|
1817 |
|
|
var path=path_str.split( "," );
|
1818 |
|
|
var node=doc.body;
|
1819 |
|
|
for( var i=0; i<path.length; ++i ) {
|
1820 |
|
|
var node_i=path[i].split( " " )[0];
|
1821 |
|
|
if( node_i.charAt( 0 )=="#" ) {
|
1822 |
|
|
node=doc.getElementById( node_i.substring( 1 ) );
|
1823 |
|
|
}else {
|
1824 |
|
|
if( node_i<0 || node_i>=node.childNodes.length ) {
|
1825 |
|
|
node=null;
|
1826 |
|
|
}else {
|
1827 |
|
|
node=node.firstChild;
|
1828 |
|
|
while( node!=null ) {
|
1829 |
|
|
if( node.nodeType==1 ) { // count only HTML element nodes
|
1830 |
|
|
if( node_i==0 ) {
|
1831 |
|
|
break;
|
1832 |
|
|
}
|
1833 |
|
|
--node_i;
|
1834 |
|
|
}
|
1835 |
|
|
node=node.nextSibling;
|
1836 |
|
|
}
|
1837 |
|
|
}
|
1838 |
|
|
}
|
1839 |
|
|
if( node==null ) {
|
1840 |
|
|
return null;
|
1841 |
|
|
}
|
1842 |
|
|
}
|
1843 |
|
|
return node;
|
1844 |
|
|
}
|
1845 |
|
|
Test.AnotherWay._record_control_contains_id=function( s )
|
1846 |
|
|
{
|
1847 |
|
|
return s.match( /^#record_[\w_]+/ ) && s.match( Test.AnotherWay._g_record_random_id );
|
1848 |
|
|
}
|
1849 |
|
|
Test.AnotherWay._record_checkpoint=function()
|
1850 |
|
|
{
|
1851 |
|
|
var o={ type: "_checkpoint", time: (new Date()).getTime()-Test.AnotherWay._g_record_start_time, which: Test.AnotherWay._g_record_checkpoint_count++,
|
1852 |
|
|
target: Test.AnotherWay._record_html_node_path( Test.AnotherWay._g_record_under_cursor ) };
|
1853 |
|
|
Test.AnotherWay._g_record_events.push( o );
|
1854 |
|
|
return o;
|
1855 |
|
|
}
|
1856 |
|
|
Test.AnotherWay._record_event=function( event )
|
1857 |
|
|
{
|
1858 |
|
|
var unneeded=["rangeOffset","eventPhase","timeStamp","isTrusted","popupWindowFeatures","rangeOffset"];
|
1859 |
|
|
if( Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
|
1860 |
|
|
var o={};
|
1861 |
|
|
for( var n in event ) {
|
1862 |
|
|
var needed=!n.match( /^[A-Z0-9_]+$/ );
|
1863 |
|
|
if( needed ) {
|
1864 |
|
|
for( var ui=0; ui<unneeded.length; ++ui ) {
|
1865 |
|
|
if( unneeded[ui]==n ) {
|
1866 |
|
|
needed=false;
|
1867 |
|
|
break;
|
1868 |
|
|
}
|
1869 |
|
|
}
|
1870 |
|
|
if( needed ) {
|
1871 |
|
|
var value=event[n];
|
1872 |
|
|
if( typeof( value )!="object" && typeof( value )!="function" ) {
|
1873 |
|
|
o[n]=value;
|
1874 |
|
|
}else if( n=="target" || n=="relatedTarget" ) {
|
1875 |
|
|
o[n]=Test.AnotherWay._record_html_node_path( value );
|
1876 |
|
|
}
|
1877 |
|
|
}
|
1878 |
|
|
}
|
1879 |
|
|
}
|
1880 |
|
|
o["time"]=(new Date()).getTime()-Test.AnotherWay._g_record_start_time;
|
1881 |
|
|
var over_record_control= o["target"]!=null && o["target"][0]!=null && Test.AnotherWay._record_control_contains_id( o["target"][0] );
|
1882 |
|
|
if( !over_record_control ) {
|
1883 |
|
|
Test.AnotherWay._g_record_events.push( o );
|
1884 |
|
|
}
|
1885 |
|
|
}
|
1886 |
|
|
return true;
|
1887 |
|
|
}
|
1888 |
|
|
Test.AnotherWay._record_on_mousemove=function( event )
|
1889 |
|
|
{
|
1890 |
|
|
var path=Test.AnotherWay._record_html_node_path( event.target );
|
1891 |
|
|
var new_mouse_over_record_control= path!=null && path[0]!=null && Test.AnotherWay._record_control_contains_id( path[0] );
|
1892 |
|
|
if( new_mouse_over_record_control!=Test.AnotherWay._g_record_mouse_over_record_control ) {
|
1893 |
|
|
Test.AnotherWay._g_record_mouse_over_record_control=new_mouse_over_record_control;
|
1894 |
|
|
Test.AnotherWay._record_control_update_ui();
|
1895 |
|
|
}
|
1896 |
|
|
if( event.target!=null && event.target!=Test.AnotherWay._g_record_under_cursor ) {
|
1897 |
|
|
Test.AnotherWay._g_record_under_cursor=event.target;
|
1898 |
|
|
var s="";
|
1899 |
|
|
if( path==null || path[0]==null || !Test.AnotherWay._record_control_contains_id( path[0] ) ) {
|
1900 |
|
|
s=Test.AnotherWay._record_node_path_to_string( path );
|
1901 |
|
|
}
|
1902 |
|
|
if( s=="" ) {
|
1903 |
|
|
s=" ";
|
1904 |
|
|
}
|
1905 |
|
|
var cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
|
1906 |
|
|
cursor_over_indicator.innerHTML=s;
|
1907 |
|
|
}
|
1908 |
|
|
|
1909 |
|
|
var highlight_element=null;
|
1910 |
|
|
if( !Test.AnotherWay._g_record_mouse_over_record_control && Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
|
1911 |
|
|
highlight_element=event.target;
|
1912 |
|
|
}
|
1913 |
|
|
// highlight border disabled on recording - it causes page to scroll, issuing spurious mouseover/mouseout event
|
1914 |
|
|
//Test.AnotherWay._record_control_update_highlight( highlight_element, "border" );
|
1915 |
|
|
|
1916 |
|
|
if( Test.AnotherWay._g_record_include_mousemove ) {
|
1917 |
|
|
Test.AnotherWay._record_event( event );
|
1918 |
|
|
}
|
1919 |
|
|
return true;
|
1920 |
|
|
}
|
1921 |
|
|
Test.AnotherWay._record_display_checkpoint=function( o )
|
1922 |
|
|
{
|
1923 |
|
|
var checkpoints_div=Test.AnotherWay._record_control_get_element( "record_checkpoints" );
|
1924 |
|
|
var p=checkpoints_div.appendChild( checkpoints_div.ownerDocument.createElement( "div" ) );
|
1925 |
|
|
p.style.marginTop="3px";
|
1926 |
|
|
p.style.font="normal normal 8pt sans-serif";
|
1927 |
|
|
p.style.color="#000";
|
1928 |
|
|
p.style.textAligh="left";
|
1929 |
|
|
p.style.position="relative";
|
1930 |
|
|
p.style.width="100%";
|
1931 |
|
|
var checkpoint_text="";
|
1932 |
|
|
checkpoint_text+="#"+(o.which+1);
|
1933 |
|
|
checkpoint_text+=" "+Test.AnotherWay._record_format_time( o.time );
|
1934 |
|
|
if( o.target!=null ) {
|
1935 |
|
|
checkpoint_text+=Test.AnotherWay._record_node_path_to_string( o.target );
|
1936 |
|
|
}
|
1937 |
|
|
p.appendChild( p.ownerDocument.createTextNode( checkpoint_text ) );
|
1938 |
|
|
}
|
1939 |
|
|
Test.AnotherWay._record_save_results=function( doc )
|
1940 |
|
|
{
|
1941 |
|
|
// strange, but DOM-style append does not work here in opera 8.
|
1942 |
|
|
var append=function( s ) { doc.write( "<div>"+s+"</div>" ); };
|
1943 |
|
|
append( "/* paste this data into your javascript and pass it as an argument to replay_events method */" );
|
1944 |
|
|
append( "{ checkpoints: [" );
|
1945 |
|
|
var first_checkpoint=true;
|
1946 |
|
|
for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
|
1947 |
|
|
var o=Test.AnotherWay._g_record_events[i];
|
1948 |
|
|
if( o.type=="_checkpoint" ) {
|
1949 |
|
|
var str= first_checkpoint ? "" : "}, ";
|
1950 |
|
|
str+="function( tst, wnd ) { // #"+o.which+" time "+Test.AnotherWay._record_format_time( o.time )+" cursor was over "+Test.AnotherWay._record_node_path_to_string( o.target );
|
1951 |
|
|
append( str );
|
1952 |
|
|
first_checkpoint=false;
|
1953 |
|
|
}
|
1954 |
|
|
}
|
1955 |
|
|
if( !first_checkpoint ) {
|
1956 |
|
|
append( "}" );
|
1957 |
|
|
}
|
1958 |
|
|
append( "], events: [ " );
|
1959 |
|
|
var prev_time=0;
|
1960 |
|
|
for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
|
1961 |
|
|
var o=Test.AnotherWay._g_record_events[i];
|
1962 |
|
|
var s="";
|
1963 |
|
|
s+= "{";
|
1964 |
|
|
var n_first=true;
|
1965 |
|
|
for( var n in o ) {
|
1966 |
|
|
if( n=="time" ) { // convert to relative time
|
1967 |
|
|
var cur_time=o[n]-0;
|
1968 |
|
|
o[n]=cur_time-prev_time;
|
1969 |
|
|
prev_time=cur_time;
|
1970 |
|
|
}
|
1971 |
|
|
s+=n_first ? n : ", "+n;
|
1972 |
|
|
s+=":";
|
1973 |
|
|
if( o[n]==null ) {
|
1974 |
|
|
s+="null";
|
1975 |
|
|
}else {
|
1976 |
|
|
s+="\""+o[n]+"\"";
|
1977 |
|
|
}
|
1978 |
|
|
n_first=false;
|
1979 |
|
|
}
|
1980 |
|
|
s+= i==Test.AnotherWay._g_record_events.length-1 ? "}" : "},";
|
1981 |
|
|
append( s );
|
1982 |
|
|
}
|
1983 |
|
|
append( "] }" );
|
1984 |
|
|
append( ";" );
|
1985 |
|
|
}
|
1986 |
|
|
|
1987 |
|
|
Test.AnotherWay._g_record_border; // border highlighting element under cursor
|
1988 |
|
|
Test.AnotherWay._g_record_border_flashes=[]; // array of { color: color, timeout: milliseconds }
|
1989 |
|
|
Test.AnotherWay._g_record_border_flashing=false;
|
1990 |
|
|
Test.AnotherWay._g_record_border_normal_color="#d4b";
|
1991 |
|
|
Test.AnotherWay._record_flash_border_timeout=function()
|
1992 |
|
|
{
|
1993 |
|
|
var color=Test.AnotherWay._g_record_border_normal_color;
|
1994 |
|
|
var timeout=null;
|
1995 |
|
|
if( Test.AnotherWay._g_record_border_flashes.length!=0 ) {
|
1996 |
|
|
color=Test.AnotherWay._g_record_border_flashes[0].color;
|
1997 |
|
|
timeout=Test.AnotherWay._g_record_border_flashes[0].timeout;
|
1998 |
|
|
Test.AnotherWay._g_record_border_flashes.splice( 0, 1 );
|
1999 |
|
|
}
|
2000 |
|
|
if( Test.AnotherWay._g_record_border!=null ) {
|
2001 |
|
|
for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
|
2002 |
|
|
Test.AnotherWay._g_record_border[i].style.backgroundColor=color;
|
2003 |
|
|
}
|
2004 |
|
|
}
|
2005 |
|
|
if( timeout!=null ) {
|
2006 |
|
|
setTimeout( Test.AnotherWay._record_flash_border_timeout, timeout );
|
2007 |
|
|
}else {
|
2008 |
|
|
Test.AnotherWay._g_record_border_flashing=false;
|
2009 |
|
|
}
|
2010 |
|
|
}
|
2011 |
|
|
Test.AnotherWay._get_page_coords=function( elm )
|
2012 |
|
|
{
|
2013 |
|
|
var point = { x: 0, y: 0 };
|
2014 |
|
|
while( elm ) {
|
2015 |
|
|
point.x+=elm.offsetLeft;
|
2016 |
|
|
point.y+=elm.offsetTop;
|
2017 |
|
|
elm=elm.offsetParent;
|
2018 |
|
|
}
|
2019 |
|
|
return point;
|
2020 |
|
|
}
|
2021 |
|
|
Test.AnotherWay._set_page_coords=function( elm, x, y )
|
2022 |
|
|
{
|
2023 |
|
|
var parent_coords={ x: 0, y: 0 };
|
2024 |
|
|
if( elm.offsetParent ) {
|
2025 |
|
|
parent_coords=Test.AnotherWay._get_page_coords( elm.offsetParent );
|
2026 |
|
|
}
|
2027 |
|
|
var new_x=x-parent_coords.x;
|
2028 |
|
|
if( new_x<0 ) {
|
2029 |
|
|
new_x=0;
|
2030 |
|
|
}
|
2031 |
|
|
elm.style.left=new_x+'px';
|
2032 |
|
|
var new_y=y-parent_coords.y;
|
2033 |
|
|
if( new_y<0 ) {
|
2034 |
|
|
new_y=0;
|
2035 |
|
|
}
|
2036 |
|
|
elm.style.top=new_y+'px';
|
2037 |
|
|
}
|
2038 |
|
|
Test.AnotherWay._record_setup_highlight_positions=function( element, style, coords, positions )
|
2039 |
|
|
{
|
2040 |
|
|
if( style=="border" ) {
|
2041 |
|
|
var width=element.clientWidth;
|
2042 |
|
|
var height=element.clientHeight;
|
2043 |
|
|
var step=0;
|
2044 |
|
|
var thickness=2;
|
2045 |
|
|
var fudge_expand=4;
|
2046 |
|
|
positions.push( { x: coords.x-step-thickness, y: coords.y-step-thickness, width: width+2*step+2*thickness+fudge_expand, height: thickness } );
|
2047 |
|
|
positions.push( { x: coords.x+width+step+fudge_expand, y: coords.y-step-thickness, width: thickness, height: height+2*step+2*thickness+fudge_expand } );
|
2048 |
|
|
positions.push( { x:positions[0].x, y:positions[0].y, width:positions[0].width, height:positions[0].height } );
|
2049 |
|
|
positions.push( { x:positions[1].x, y:positions[1].y, width:positions[1].width, height:positions[1].height } );
|
2050 |
|
|
positions[2].y+=height+thickness+2*step+fudge_expand;
|
2051 |
|
|
positions[3].x-=width+thickness+2*step+fudge_expand;
|
2052 |
|
|
}else if( style=="ball" ) {
|
2053 |
|
|
positions.push( { x: coords.x+2, y: coords.y, width: 2, height: 6 } );
|
2054 |
|
|
positions.push( { x: coords.x, y: coords.y+2, width: 6, height: 2 } );
|
2055 |
|
|
positions.push( { x: coords.x+1, y: coords.y+1, width: 4, height: 4 } );
|
2056 |
|
|
}
|
2057 |
|
|
}
|
2058 |
|
|
Test.AnotherWay._record_highlight_border=function( element, style, event ) // null - hide border
|
2059 |
|
|
{
|
2060 |
|
|
if( element!=null ) {
|
2061 |
|
|
if( Test.AnotherWay._g_record_border==null || Test.AnotherWay._g_record_border[0].ownerDocument!=element.ownerDocument ) {
|
2062 |
|
|
Test.AnotherWay._g_record_border=[];
|
2063 |
|
|
var n= style=="border" ? 4 : style=="ball" ? 3 : 0;
|
2064 |
|
|
for( var i=0; i<4; ++i ) {
|
2065 |
|
|
var b=element.ownerDocument.createElement( "div" );
|
2066 |
|
|
b.style.position="absolute";
|
2067 |
|
|
b.style.zIndex="1";
|
2068 |
|
|
b.style.backgroundColor=Test.AnotherWay._g_record_border_normal_color;
|
2069 |
|
|
element.ownerDocument.body.appendChild( b );
|
2070 |
|
|
Test.AnotherWay._g_record_border.push( b );
|
2071 |
|
|
}
|
2072 |
|
|
}
|
2073 |
|
|
var coords=null;
|
2074 |
|
|
if( style=="border" ) {
|
2075 |
|
|
coords=Test.AnotherWay._get_page_coords( element );
|
2076 |
|
|
}else if( style=="ball" ) {
|
2077 |
|
|
if( event!=null ) {
|
2078 |
|
|
if( event.pageX!=null && event.pageY!=null ) {
|
2079 |
|
|
coords={ x: event.pageX-0, y: event.pageY-0 };
|
2080 |
|
|
}else if( event.clientX!=null && event.clientY!=null ) {
|
2081 |
|
|
var doc=element.ownerDocument;
|
2082 |
|
|
if( doc!=null ) {
|
2083 |
|
|
coords={ x: (event.clientX-0)+doc.body.scrollLeft, y: (event.clientY-0)+doc.body.scrollTop };
|
2084 |
|
|
}
|
2085 |
|
|
}
|
2086 |
|
|
}
|
2087 |
|
|
}
|
2088 |
|
|
if( coords!=null && element.clientWidth!=null && element.clientHeight!=null ) {
|
2089 |
|
|
var positions=[];
|
2090 |
|
|
Test.AnotherWay._record_setup_highlight_positions( element, style, coords, positions );
|
2091 |
|
|
for( var i=0; i<positions.length; ++i ) {
|
2092 |
|
|
var b=Test.AnotherWay._g_record_border[i];
|
2093 |
|
|
var p=positions[i];
|
2094 |
|
|
Test.AnotherWay._set_page_coords( b, p.x, p.y );
|
2095 |
|
|
b.style.width=p.width+"px";
|
2096 |
|
|
b.style.height=p.height+"px";
|
2097 |
|
|
b.style.display="block";
|
2098 |
|
|
}
|
2099 |
|
|
}
|
2100 |
|
|
}else {
|
2101 |
|
|
if( Test.AnotherWay._g_record_border!=null ) {
|
2102 |
|
|
for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
|
2103 |
|
|
Test.AnotherWay._g_record_border[i].style.display="none";
|
2104 |
|
|
}
|
2105 |
|
|
}
|
2106 |
|
|
}
|
2107 |
|
|
}
|
2108 |
|
|
Test.AnotherWay._record_flash_border=function( color )
|
2109 |
|
|
{
|
2110 |
|
|
if( Test.AnotherWay._g_record_border_flashing ) { //already
|
2111 |
|
|
Test.AnotherWay._g_record_border_flashes.push( { color: Test.AnotherWay._g_record_border_normal_color, timeout:300 } );
|
2112 |
|
|
Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
|
2113 |
|
|
}else {
|
2114 |
|
|
Test.AnotherWay._g_record_border_flashing=true;
|
2115 |
|
|
Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
|
2116 |
|
|
Test.AnotherWay._record_flash_border_timeout();
|
2117 |
|
|
}
|
2118 |
|
|
}
|
2119 |
|
|
Test.AnotherWay._record_prepare_doc_for_results=function()
|
2120 |
|
|
{
|
2121 |
|
|
document.open();
|
2122 |
|
|
document.write( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" );
|
2123 |
|
|
document.write( "<html><head><title> Input recording results</title>" );
|
2124 |
|
|
document.write( "<style type=\"text/css\">" );
|
2125 |
|
|
document.write( "body { font: normal normal smaller sans-serif; }" );
|
2126 |
|
|
document.write( "div { margin-top: 3px; }" );
|
2127 |
|
|
document.write( "</style></head><body>" );
|
2128 |
|
|
// opera and mozilla disagree over who the opener is.
|
2129 |
|
|
if( typeof( window.opener.Test )!="undefined" && typeof( window.opener.Test.AnotherWay )!="undefined" ) {
|
2130 |
|
|
window.opener.Test.AnotherWay._record_save_results( document );
|
2131 |
|
|
window.opener.Test.AnotherWay._g_record_waiting_for_results=false;
|
2132 |
|
|
window.opener.Test.AnotherWay._record_control_update_ui();
|
2133 |
|
|
}else if( typeof( window.opener.opener.Test )!="undefined" && typeof( window.opener.opener.Test.AnotherWay )!="undefined" ) {
|
2134 |
|
|
window.opener.opener.Test.AnotherWay._record_save_results( document );
|
2135 |
|
|
window.opener.opener.Test.AnotherWay._g_record_waiting_for_results=false;
|
2136 |
|
|
window.opener.opener.Test.AnotherWay._record_control_update_ui();
|
2137 |
|
|
}
|
2138 |
|
|
document.write( "</body>" );
|
2139 |
|
|
document.close();
|
2140 |
|
|
}
|
2141 |
|
|
|
2142 |
|
|
// global initialization
|
2143 |
|
|
onload=function()
|
2144 |
|
|
{
|
2145 |
|
|
if( window.opera ) {
|
2146 |
|
|
var good_opera=typeof( window.opera.version )=="function";
|
2147 |
|
|
good_opera=good_opera && window.opera.version().match( /^\s*(\d+)/ );
|
2148 |
|
|
good_opera=good_opera && RegExp.$1>=8;
|
2149 |
|
|
}
|
2150 |
|
|
var span=document.createElement( "SPAN" );
|
2151 |
|
|
span.innerHTML="<!--[if IE]><br /><![endif]-"+"->";
|
2152 |
|
|
var is_ie=span.getElementsByTagName( "BR" ).length>0;
|
2153 |
|
|
|
2154 |
|
|
Test.AnotherWay._g_test_iframe=window.frames.test_iframe;
|
2155 |
|
|
|
2156 |
|
|
var query_str=window.location.search;
|
2157 |
|
|
if( query_str.charAt( 0 )=="?" ) {
|
2158 |
|
|
query_str=query_str.substring( 1 );
|
2159 |
|
|
}
|
2160 |
|
|
var testlist_page="list-tests.html";
|
2161 |
|
|
var auto_run=false;
|
2162 |
|
|
if( query_str!="" ) {
|
2163 |
|
|
var params=[query_str];
|
2164 |
|
|
if( query_str.indexOf( ";" )!=-1 ) {
|
2165 |
|
|
params=query_str.split( ";" );
|
2166 |
|
|
}else if( query_str.indexOf( "&" )!=-1 ) {
|
2167 |
|
|
params=query_str.split( "&" );
|
2168 |
|
|
}
|
2169 |
|
|
for( var param_i=0; param_i<params.length; ++param_i ) {
|
2170 |
|
|
var param=params[param_i].split( "=" );
|
2171 |
|
|
if( param[0]=="recording_results" ) {
|
2172 |
|
|
if( window.opener!=null ) {
|
2173 |
|
|
// we were told to show recording results - replace everything in the document with the results
|
2174 |
|
|
Test.AnotherWay._record_prepare_doc_for_results();
|
2175 |
|
|
return;
|
2176 |
|
|
}
|
2177 |
|
|
}else if( param[0]=="testpage" ) {
|
2178 |
|
|
Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "anotherway" );
|
2179 |
|
|
}else if( param[0]=="jsantestpage" ) {
|
2180 |
|
|
Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "jsan" );
|
2181 |
|
|
}else if( param[0]=="testlist" ) {
|
2182 |
|
|
testlist_page=decodeURIComponent( param[1] );
|
2183 |
|
|
}else if( param[0]=="testframe" ) {
|
2184 |
|
|
if( window.opera && !good_opera ) {
|
2185 |
|
|
Test.AnotherWay._show_error( "testframe parameter does not work in versions of Opera prior to 8.0. Sorry (pathches are welcome)." );
|
2186 |
|
|
// Opera 7 barfs on attempt to access frame.frameElement.
|
2187 |
|
|
// if someone knows a way to assign onload handler to that iframe in Opera 7
|
2188 |
|
|
// without disrupting code that works in other browsers, patches are welcome.
|
2189 |
|
|
}else {
|
2190 |
|
|
var frame_path=param[1].split( "." );
|
2191 |
|
|
var frame=top;
|
2192 |
|
|
for( var frame_path_i=0; frame_path_i<frame_path.length; ++frame_path_i ) {
|
2193 |
|
|
frame=frame[frame_path[frame_path_i]];
|
2194 |
|
|
}
|
2195 |
|
|
if( frame==null ) {
|
2196 |
|
|
Test.AnotherWay._show_error( "unable to find frame specified for loading test pages: "+param[1] );
|
2197 |
|
|
}else {
|
2198 |
|
|
if( frame.frameElement!=null ) { // for the following assignement to onload to work, frameElement is required
|
2199 |
|
|
frame=frame.frameElement;
|
2200 |
|
|
}
|
2201 |
|
|
Test.AnotherWay._g_test_iframe=frame;
|
2202 |
|
|
}
|
2203 |
|
|
}
|
2204 |
|
|
}else if( param[0]=="testframe_no_clear" ) {
|
2205 |
|
|
Test.AnotherWay._g_test_frame_no_clear=true;
|
2206 |
|
|
}else if( param[0]=="run" ) {
|
2207 |
|
|
auto_run=true;
|
2208 |
|
|
if( param[1]=="all" ) {
|
2209 |
|
|
Test.AnotherWay._g_pages_to_run="all";
|
2210 |
|
|
}else {
|
2211 |
|
|
if( Test.AnotherWay._g_pages_to_run==null || Test.AnotherWay._g_pages_to_run=="all" ) {
|
2212 |
|
|
Test.AnotherWay._g_pages_to_run=[];
|
2213 |
|
|
}
|
2214 |
|
|
var pages=param[1].split( "," );
|
2215 |
|
|
for( var i=0; i<pages.length; ++i ) {
|
2216 |
|
|
Test.AnotherWay._g_pages_to_run.push( pages[i] );
|
2217 |
|
|
}
|
2218 |
|
|
}
|
2219 |
|
|
}
|
2220 |
|
|
}
|
2221 |
|
|
}
|
2222 |
|
|
if( Test.AnotherWay._g_test_page_urls.length==0 ) { // if no individual pages were given on the command line, load the list
|
2223 |
|
|
var result=Test.AnotherWay._set_iframe_location( window.frames["list_iframe"], testlist_page );
|
2224 |
|
|
if( result.msg!=null ) {
|
2225 |
|
|
Test.AnotherWay._show_error( result.msg );
|
2226 |
|
|
}
|
2227 |
|
|
Test.AnotherWay._g_run_on_list_load=auto_run;
|
2228 |
|
|
}else {
|
2229 |
|
|
Test.AnotherWay._g_run_on_main_load=auto_run;
|
2230 |
|
|
}
|
2231 |
|
|
|
2232 |
|
|
var f=Test.AnotherWay._g_test_iframe;
|
2233 |
|
|
try {
|
2234 |
|
|
if( f.attachEvent!=null ) {
|
2235 |
|
|
f.attachEvent( "onload", Test.AnotherWay._test_page_onload );
|
2236 |
|
|
}else {
|
2237 |
|
|
f.onload=Test.AnotherWay._test_page_onload;
|
2238 |
|
|
}
|
2239 |
|
|
if( Test.AnotherWay._g_test_iframe.nodeType!=null && Test.AnotherWay._g_test_iframe.contentWindow!=null ) { // it's iframe element, not the iframe. we need iframe.
|
2240 |
|
|
Test.AnotherWay._g_test_iframe=Test.AnotherWay._g_test_iframe.contentWindow;
|
2241 |
|
|
}
|
2242 |
|
|
}catch(e) {
|
2243 |
|
|
// ignore stupid opera error if the frame has onload handler assigned in the inline html
|
2244 |
|
|
}
|
2245 |
|
|
var handlers={
|
2246 |
|
|
"run_all": { "onclick": Test.AnotherWay._run_all_onclick },
|
2247 |
|
|
"run_selected": { "onclick": Test.AnotherWay._run_selected_onclick },
|
2248 |
|
|
"unselect_all": { "onclick": Test.AnotherWay._unselect_all_onclick },
|
2249 |
|
|
"record_select": { "onfocus": Test.AnotherWay._record_check_onfocus },
|
2250 |
|
|
"record_input": { "onfocus": Test.AnotherWay._record_check_onfocus },
|
2251 |
|
|
"record_start": { "onclick": Test.AnotherWay._record_start_onclick },
|
2252 |
|
|
"clear_btn": { "onclick": Test.AnotherWay._results_clear_onclick },
|
2253 |
|
|
"results_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout },
|
2254 |
|
|
"debug_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout }
|
2255 |
|
|
};
|
2256 |
|
|
for( var hs in handlers ) {
|
2257 |
|
|
var o=document.getElementById( hs );
|
2258 |
|
|
if( o!=null ) {
|
2259 |
|
|
for( var h in handlers[hs] ) {
|
2260 |
|
|
o[h]=handlers[hs][h];
|
2261 |
|
|
}
|
2262 |
|
|
}else {
|
2263 |
|
|
Test.AnotherWay._show_error( "unable to set "+h+" handler: id "+hs+" not found" );
|
2264 |
|
|
}
|
2265 |
|
|
}
|
2266 |
|
|
|
2267 |
|
|
if( window.opera && !good_opera ) {
|
2268 |
|
|
Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in opera versions prior to 8.0.";
|
2269 |
|
|
}
|
2270 |
|
|
if( is_ie ) {
|
2271 |
|
|
Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in internet explorer.";
|
2272 |
|
|
}
|
2273 |
|
|
if( Test.AnotherWay._g_no_record_msg!=null ) {
|
2274 |
|
|
var no_record_p=document.getElementById( "record_not_supported" );
|
2275 |
|
|
no_record_p.style.display="block";
|
2276 |
|
|
no_record_p.appendChild( document.createTextNode( Test.AnotherWay._g_no_record_msg ) );
|
2277 |
|
|
}
|
2278 |
|
|
|
2279 |
|
|
Test.AnotherWay._g_main_loaded=true;
|
2280 |
|
|
if( Test.AnotherWay._g_run_on_main_load ) {
|
2281 |
|
|
Test.AnotherWay._g_run_on_main_load=false;
|
2282 |
|
|
Test.AnotherWay._run_pages_to_run();
|
2283 |
|
|
}
|
2284 |
|
|
}
|
2285 |
|
|
// -->
|
2286 |
|
|
</script></head><body>
|
2287 |
|
|
|
2288 |
|
|
<div id="col1">
|
2289 |
|
|
<div id="col1_header">Test pages:</div>
|
2290 |
|
|
<div id="scroller">
|
2291 |
|
|
<table id="testtable">
|
2292 |
|
|
</table>
|
2293 |
|
|
</div>
|
2294 |
|
|
<div id="run_buttons">
|
2295 |
|
|
<input type="button" value=" clear " id="clear_btn" />
|
2296 |
|
|
<input type="button" value=" run all " id="run_all" />
|
2297 |
|
|
<input type="button" value=" run selected " id="run_selected" />
|
2298 |
|
|
<input type="button" value=" unselect all " id="unselect_all" />
|
2299 |
|
|
</div>
|
2300 |
|
|
<input type="checkbox" id="dont_close_test_windows" /> do not close windows opened by tests
|
2301 |
|
|
<div id="error"></div>
|
2302 |
|
|
<div id="record_div">
|
2303 |
|
|
<p id="record_not_supported" style="display:none"></p>
|
2304 |
|
|
<p>Record mouse input for the page:</p>
|
2305 |
|
|
<p><input type="radio" name="record_choose" value="select" checked="checked" /> <select id="record_select"><option selected="selected">-- select a page: --</option></select></p>
|
2306 |
|
|
<p><input type="radio" name="record_choose" value="input" /> or enter page url: <input type="text" id="record_input" /></p>
|
2307 |
|
|
<p><input type="button" value=" record " id="record_start" /></p>
|
2308 |
|
|
</div>
|
2309 |
|
|
</div>
|
2310 |
|
|
|
2311 |
|
|
<div id="col2">
|
2312 |
|
|
<div id="right_header">
|
2313 |
|
|
<span id="results_count">Results: <span id="total"></span></span>
|
2314 |
|
|
<span id="results_tab" class="active_tab" style="visibility:hidden">Results</span>
|
2315 |
|
|
<span id="debug_tab" class="inactive_tab" style="visibility:hidden">Debug</span>
|
2316 |
|
|
</div>
|
2317 |
|
|
<div id="right_frame">
|
2318 |
|
|
<div id="results"></div>
|
2319 |
|
|
<div id="debug"></div>
|
2320 |
|
|
</div>
|
2321 |
|
|
</div>
|
2322 |
|
|
|
2323 |
|
|
<span style="display:none">
|
2324 |
|
|
<iframe name="list_iframe" onload="Test.AnotherWay._list_iframe_onload();"></iframe>
|
2325 |
|
|
<iframe name="test_iframe" onload="Test.AnotherWay._test_page_onload();"></iframe>
|
2326 |
|
|
|
2327 |
|
|
<!-- record_control div is to be imported into other documents, so all its styles are inline -->
|
2328 |
|
|
-<div id="record_control" style="position:absolute;bottom:0;left:0;margin:0;padding:0.5em;width:22em;height:22em;border:1px solid;background:#ffd;font: normal normal 8pt sans-serif; color:#000; text-align: left">
|
2329 |
|
|
|
2330 |
|
|
<p style="margin:0 0 0 0; padding:0">
|
2331 |
|
|
|
2332 |
|
|
<span style="display:none;font-weight:bold;color:#408" id="record_indicator">
|
2333 |
|
|
recording. <span style="font-weight:normal">time: <span id="record_time"></span></span><span id="record_pause_indicator"> paused</span>
|
2334 |
|
|
</span>
|
2335 |
|
|
</p>
|
2336 |
|
|
|
2337 |
|
|
<div id="record_cursor_over" style="margin:0;padding:2px;width:14em;height:1.1em;overflow:hidden;float:right;border:1px solid #777;background:#fff;font: normal normal 8pt sans-serif;position:relative;top:3px;color:#000;text-align:left;"> </div>
|
2338 |
|
|
<p style="margin:2px 0 0 0; padding:0">
|
2339 |
|
|
cursor is over
|
2340 |
|
|
</p>
|
2341 |
|
|
|
2342 |
|
|
<p style="margin:8px 0 0 0; padding:0;">
|
2343 |
|
|
keyboard control: press
|
2344 |
|
|
<span id="record_ctrl_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">ctrl</span> -
|
2345 |
|
|
<span id="record_shift_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">shift</span> -
|
2346 |
|
|
</p>
|
2347 |
|
|
|
2348 |
|
|
<p style="margin:4px 0 0 0; padding:0">
|
2349 |
|
|
<span id="record_s" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">s</span>
|
2350 |
|
|
<span id="record_on">to <b>start</b> recording</span>
|
2351 |
|
|
<span id="record_off" style="display:none">to <b>stop</b> recording</span>
|
2352 |
|
|
</p>
|
2353 |
|
|
|
2354 |
|
|
<p style="margin:4px 0 0 0; padding:0">
|
2355 |
|
|
<span id="record_h" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">h</span>
|
2356 |
|
|
<span>to <b>hide/show</b> this window</span>
|
2357 |
|
|
</p>
|
2358 |
|
|
|
2359 |
|
|
<p style="margin:4px 0 0 0; padding:0">
|
2360 |
|
|
<span id="record_m" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">m</span>
|
2361 |
|
|
<span id="record_include_mousemove">to <b> record</b> mousemove</span>
|
2362 |
|
|
<span id="record_omit_mousemove" style="display:none">to <b>omit</b> mousemove</span>
|
2363 |
|
|
</p>
|
2364 |
|
|
|
2365 |
|
|
<p style="margin:4px 0 0 0; padding:0">
|
2366 |
|
|
<span id="record_p" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">p</span>
|
2367 |
|
|
<span id="record_pause_on">to <b> pause</b> recording</span>
|
2368 |
|
|
<span id="record_pause_off" style="display:none">to <b>continue</b> recording</span>
|
2369 |
|
|
</p>
|
2370 |
|
|
|
2371 |
|
|
<p style="margin:4px 0 0 0; padding:0">
|
2372 |
|
|
<span id="record_c" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">c</span>
|
2373 |
|
|
<span>to add checkpoint</span>
|
2374 |
|
|
</p>
|
2375 |
|
|
|
2376 |
|
|
<p style="margin:6px 0 0 0; padding:0">
|
2377 |
|
|
checkpoints:
|
2378 |
|
|
</p>
|
2379 |
|
|
<div id="record_checkpoints" style="position:relative;width:100%;height:6em;overflow:auto;font: normal normal 8pt sans-serif; color:#000; text-align: left">
|
2380 |
|
|
</div>
|
2381 |
|
|
</div>
|
2382 |
|
|
|
2383 |
|
|
</span>
|
2384 |
|
|
</body></html>
|