4 https://bugzilla.mozilla.org/show_bug.cgi?id=687787
7 <title>Test for Bug
687787</title>
8 <script type=
"text/javascript" src=
"/MochiKit/MochiKit.js"></script>
9 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css" />
13 <a target=
"_blank" href=
"https://bugzilla.mozilla.org/show_bug.cgi?id=687787">Mozilla Bug
687787</a>
15 <div id=
"content" style=
"display: none">
20 <script class=
"testbody" type=
"text/javascript">
24 function _callback(e){
25 var event = {'type' : e.type, 'target' : e.target, 'relatedTarget' : e.relatedTarget }
26 eventStack.push(event);
29 function clearEventStack(){
33 window.addEventListener(
"focus", _callback, true);
34 window.addEventListener(
"focusin", _callback, true);
35 window.addEventListener(
"focusout", _callback, true);
36 window.addEventListener(
"blur", _callback, true);
38 function CompareEventToExpected(e, expected) {
39 if (expected == null || e == null)
41 if (e.type == expected.type && e.target == expected.target && e.relatedTarget == expected.relatedTarget)
46 function TestEventOrderNormal() {
48 var input1 = document.createElement('input');
49 var input2 = document.createElement('input');
50 var input3 = document.createElement('input');
51 var content = document.getElementById('content');
53 input1.setAttribute('id', 'input1');
54 input2.setAttribute('id', 'input2');
55 input3.setAttribute('id', 'input3');
56 input1.setAttribute('type', 'text');
57 input2.setAttribute('type', 'text');
58 input3.setAttribute('type', 'text');
60 content.appendChild(input1);
61 content.appendChild(input2);
62 content.appendChild(input3);
63 content.style.display = 'block'
65 let expectedEventOrder = [
68 'relatedTarget' : input2},
71 'relatedTarget' : input2},
74 'relatedTarget' : input1},
77 'relatedTarget' : input1},
80 'relatedTarget' : input3},
83 'relatedTarget' : input3},
86 'relatedTarget' : input2},
89 'relatedTarget' : input2},
98 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length ; i++) {
99 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
101 + expectedEventOrder[i].type + ','
102 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
103 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
105 + eventStack[i].type + ','
106 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
107 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
110 content.innerHTML = '';
113 function TestEventOrderNormalFiresAtRightTime() {
115 var input1 = document.createElement('input');
116 var input2 = document.createElement('input');
117 var input3 = document.createElement('input');
118 var content = document.getElementById('content');
120 input1.setAttribute('id', 'input1');
121 input2.setAttribute('id', 'input2');
122 input3.setAttribute('id', 'input3');
123 input1.setAttribute('type', 'text');
124 input2.setAttribute('type', 'text');
125 input3.setAttribute('type', 'text');
127 input1.onblur = function(e)
129 ok(document.activeElement == document.body, 'input1: not focused when blur fires')
132 input1.addEventListener('focusout', function(e)
134 ok(document.activeElement == document.body, 'input1: not focused when focusout fires')
137 input2.onfocus = function(e)
139 ok(document.activeElement == input2, 'input2: focused when focus fires')
142 input2.addEventListener('focusin', function(e)
144 ok(document.activeElement == input2, 'input2: focused when focusin fires')
147 content.appendChild(input1);
148 content.appendChild(input2);
149 content.style.display = 'block'
151 let expectedEventOrder = [
154 'relatedTarget' : input2},
155 {'type' : 'focusout',
157 'relatedTarget' : input2},
160 'relatedTarget' : input1},
163 'relatedTarget' : input1},
171 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length ; i++) {
172 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
174 + expectedEventOrder[i].type + ','
175 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
176 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
178 + eventStack[i].type + ','
179 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
180 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
183 content.innerHTML = '';
186 function TestFocusOutRedirectsFocus() {
188 var input1 = document.createElement('input');
189 var input2 = document.createElement('input');
190 var input3 = document.createElement('input');
191 var content = document.getElementById('content');
193 input1.setAttribute('id', 'input1');
194 input2.setAttribute('id', 'input2');
195 input3.setAttribute('id', 'input3');
196 input1.setAttribute('type', 'text');
197 input2.setAttribute('type', 'text');
198 input3.setAttribute('type', 'text');
199 input1.addEventListener('focusout', function () {
203 content.appendChild(input1);
204 content.appendChild(input2);
205 content.appendChild(input3);
206 content.style.display = 'block'
208 let expectedEventOrder = [
211 'relatedTarget' : input2},
212 {'type' : 'focusout',
214 'relatedTarget' : input2},
217 'relatedTarget' : null},
220 'relatedTarget' : null},
227 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
228 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
230 + expectedEventOrder[i].type + ','
231 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
232 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
234 + eventStack[i].type + ','
235 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
236 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
239 content.innerHTML = '';
242 function TestFocusInRedirectsFocus() {
244 var input1 = document.createElement('input');
245 var input2 = document.createElement('input');
246 var input3 = document.createElement('input');
247 var content = document.getElementById('content');
249 input1.setAttribute('id', 'input1');
250 input2.setAttribute('id', 'input2');
251 input3.setAttribute('id', 'input3');
252 input1.setAttribute('type', 'text');
253 input2.setAttribute('type', 'text');
254 input3.setAttribute('type', 'text');
255 input2.addEventListener('focusin', function () {
259 content.appendChild(input1);
260 content.appendChild(input2);
261 content.appendChild(input3);
262 content.style.display = 'block'
264 let expectedEventOrder = [
267 'relatedTarget' : input2},
268 {'type' : 'focusout',
270 'relatedTarget' : input2},
273 'relatedTarget' : input1},
276 'relatedTarget' : input1},
279 'relatedTarget' : input3},
280 {'type' : 'focusout',
282 'relatedTarget' : input3},
285 'relatedTarget' : input2},
288 'relatedTarget' : input2},
295 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
296 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
298 + expectedEventOrder[i].type + ','
299 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
300 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
302 + eventStack[i].type + ','
303 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
304 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
307 content.innerHTML = '';
310 function TestBlurRedirectsFocus() {
312 var input1 = document.createElement('input');
313 var input2 = document.createElement('input');
314 var input3 = document.createElement('input');
315 var content = document.getElementById('content');
317 input1.setAttribute('id', 'input1');
318 input2.setAttribute('id', 'input2');
319 input3.setAttribute('id', 'input3');
320 input1.setAttribute('type', 'text');
321 input2.setAttribute('type', 'text');
322 input3.setAttribute('type', 'text');
323 input1.onblur = function () {
327 content.appendChild(input1);
328 content.appendChild(input2);
329 content.appendChild(input3);
330 content.style.display = 'block'
332 let expectedEventOrder = [
335 'relatedTarget' : input2},
338 'relatedTarget' : null},
341 'relatedTarget' : null},
342 {'type' : 'focusout',
344 'relatedTarget' : input2},
351 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
352 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
354 + expectedEventOrder[i].type + ','
355 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
356 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
358 + eventStack[i].type + ','
359 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
360 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
363 content.innerHTML = '';
366 function TestFocusRedirectsFocus() {
368 var input1 = document.createElement('input');
369 var input2 = document.createElement('input');
370 var input3 = document.createElement('input');
371 var content = document.getElementById('content');
373 input1.setAttribute('id', 'input1');
374 input2.setAttribute('id', 'input2');
375 input3.setAttribute('id', 'input3');
376 input1.setAttribute('type', 'text');
377 input2.setAttribute('type', 'text');
378 input3.setAttribute('type', 'text');
379 input2.onfocus = function () {
383 content.appendChild(input1);
384 content.appendChild(input2);
385 content.appendChild(input3);
386 content.style.display = 'block'
388 let expectedEventOrder = [
391 'relatedTarget' : input2},
392 {'type' : 'focusout',
394 'relatedTarget' : input2},
397 'relatedTarget' : input1},
400 'relatedTarget' : input3},
401 {'type' : 'focusout',
403 'relatedTarget' : input3},
406 'relatedTarget' : input2},
409 'relatedTarget' : input2},
416 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
417 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
419 + expectedEventOrder[i].type + ','
420 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
421 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
423 + eventStack[i].type + ','
424 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
425 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
428 content.innerHTML = '';
431 function TestEventOrderDifferentDocument() {
433 var input1 = document.createElement('input');
434 var input2 = document.createElement('input');
435 var iframe1 = document.createElement('iframe');
436 var content = document.getElementById('content');
438 input1.setAttribute('id', 'input1');
439 input2.setAttribute('id', 'input2');
440 iframe1.setAttribute('id', 'iframe1');
441 input1.setAttribute('type', 'text');
442 input2.setAttribute('type', 'text');
444 content.appendChild(input1);
445 content.appendChild(iframe1);
446 iframe1.contentDocument.body.appendChild(input2);
447 content.style.display = 'block'
449 iframe1.contentDocument.addEventListener(
"focus", _callback, true);
450 iframe1.contentDocument.addEventListener(
"focusin", _callback, true);
451 iframe1.contentDocument.addEventListener(
"focusout", _callback, true);
452 iframe1.contentDocument.addEventListener(
"blur", _callback, true);
454 let expectedEventOrder = [
457 'relatedTarget' : null},
458 {'type' : 'focusout',
460 'relatedTarget' : null},
463 'relatedTarget' : null},
466 'relatedTarget' : null},
468 'target' : iframe1.contentDocument,
469 'relatedTarget' : null},
472 'relatedTarget' : null},
475 'relatedTarget' : null},
482 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
483 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
485 + expectedEventOrder[i].type + ','
486 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
487 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
489 + eventStack[i].type + ','
490 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
491 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
494 content.innerHTML = '';
498 function TestFocusOutMovesTarget() {
500 var input1 = document.createElement('input');
501 var input2 = document.createElement('input');
502 var iframe1 = document.createElement('iframe');
503 var content = document.getElementById('content');
505 input1.setAttribute('id', 'input1');
506 input2.setAttribute('id', 'input2');
507 iframe1.setAttribute('id', 'iframe1');
508 input1.setAttribute('type', 'text');
509 input2.setAttribute('type', 'text');
511 input1.addEventListener('focusout', function () {
512 iframe1.contentDocument.body.appendChild(input2);
515 content.appendChild(input1);
516 content.appendChild(input2);
517 content.appendChild(iframe1);
518 content.style.display = 'block'
520 iframe1.contentDocument.addEventListener(
"focus", _callback, true);
521 iframe1.contentDocument.addEventListener(
"focusin", _callback, true);
522 iframe1.contentDocument.addEventListener(
"focusout", _callback, true);
523 iframe1.contentDocument.addEventListener(
"blur", _callback, true);
525 let expectedEventOrder = [
528 'relatedTarget' : input2},
529 {'type' : 'focusout',
531 'relatedTarget' : input2},
534 'relatedTarget' : null},
537 'relatedTarget' : null},
544 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
545 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
547 + expectedEventOrder[i].type + ','
548 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
549 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
551 + eventStack[i].type + ','
552 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
553 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
556 content.innerHTML = '';
559 function TestBlurWindowAndRefocusInputOnlyFiresFocusInOnInput() {
561 var input1 = document.createElement('input');
562 var content = document.getElementById('content');
564 input1.setAttribute('id', 'input1');
565 input1.setAttribute('type', 'text');
567 content.appendChild(input1);
569 let expectedEventOrder = [
572 'relatedTarget' : null},
575 'relatedTarget' : null},
578 'relatedTarget' : null},
581 'relatedTarget' : null},
588 for (var i =
0; i < expectedEventOrder.length || i < eventStack.length; i++) {
589 ok(CompareEventToExpected(expectedEventOrder[i], eventStack[i]), 'Normal event order is correct: Event ' + i + ': '
591 + expectedEventOrder[i].type + ','
592 + (expectedEventOrder[i].target ? expectedEventOrder[i].target.id : null) + ','
593 + (expectedEventOrder[i].relatedTarget ? expectedEventOrder[i].relatedTarget.id : null) + '), '
595 + eventStack[i].type + ','
596 + (eventStack[i].target ? eventStack[i].target.id : null) + ','
597 + (eventStack[i].relatedTarget ? eventStack[i].relatedTarget.id : null) + ')');
600 content.innerHTML = '';
603 TestEventOrderNormal();
604 TestEventOrderNormalFiresAtRightTime();
605 TestFocusOutRedirectsFocus();
606 TestFocusInRedirectsFocus();
607 TestBlurRedirectsFocus();
608 TestFocusRedirectsFocus();
609 TestFocusOutMovesTarget();
610 TestEventOrderDifferentDocument();
611 TestBlurWindowAndRefocusInputOnlyFiresFocusInOnInput();