| OLD | NEW |
| 1 <!DOCTYPE HTML> | 1 <!DOCTYPE HTML> |
| 2 <script src="../../../../resources/js-test.js"></script> | 2 <script src="../../../../resources/js-test.js"></script> |
| 3 <style> | 3 <style> |
| 4 #target { | 4 #target { |
| 5 width: 50px; | 5 width: 50px; |
| 6 height: 50px; | 6 height: 50px; |
| 7 } | 7 } |
| 8 </style> | 8 </style> |
| 9 <iframe id="target" src="resources/event-delegator.html"></iframe> | 9 <iframe id="target" src="resources/event-delegator.html"></iframe> |
| 10 <div id=console></div> | 10 <div id=console></div> |
| 11 <script> | 11 <script> |
| 12 var removalEventType; |
| 13 |
| 12 function onEventInFrame(e) { | 14 function onEventInFrame(e) { |
| 13 debug("Received " + e.type + " in child frame"); | 15 debug("Received " + e.type + " in child frame"); |
| 14 if (e.type == 'mousemove') { | 16 if (e.type == removalEventType) { |
| 15 debug('Removing iframe'); | 17 debug('Removing iframe'); |
| 16 target.parentNode.removeChild(target); | 18 target.parentNode.removeChild(target); |
| 17 internals.gc(); | 19 internals.gc(); |
| 18 } | 20 } |
| 19 } | 21 } |
| 20 | 22 |
| 21 function eventLogger(e) { | 23 function eventLogger(e) { |
| 22 debug("Received " + e.type + " in main frame"); | 24 debug("Received " + e.type + " in main frame"); |
| 23 } | 25 } |
| 24 | 26 |
| 25 document.addEventListener('mousemove', eventLogger); | 27 document.addEventListener('mousemove', eventLogger); |
| 26 document.addEventListener('mousedown', eventLogger); | 28 document.addEventListener('mousedown', eventLogger); |
| 27 document.addEventListener('mouseup', eventLogger); | 29 document.addEventListener('mouseup', eventLogger); |
| 28 document.addEventListener('click', eventLogger); | 30 document.addEventListener('click', eventLogger); |
| 29 | 31 |
| 32 description("Verifies that a tap occuring on an iframe that gets removed during
tap handling doesn't cause a crash."); |
| 33 |
| 30 var rect = target.getBoundingClientRect(); | 34 var rect = target.getBoundingClientRect(); |
| 31 var point = { | 35 var point = { |
| 32 x: rect.left + rect.width / 2, | 36 x: rect.left + rect.width / 2, |
| 33 y: rect.top + rect.height / 2 | 37 y: rect.top + rect.height / 2 |
| 34 }; | 38 }; |
| 35 | 39 |
| 36 description("Verifies that a tap occuring on an iframe that gets removed during
tap handling doesn't cause a crash."); | 40 function doTapAndRemove(type) |
| 41 { |
| 42 return new Promise(function(resolve, reject) { |
| 43 |
| 44 var clone = target.cloneNode(); |
| 45 var insertionPoint = target.nextSibling; |
| 46 |
| 47 debug('Test case: Remove during ' + type); |
| 48 removalEventType = type; |
| 49 |
| 50 eventSender.gestureTapDown(point.x, point.y); |
| 51 eventSender.gestureShowPress(point.x, point.y); |
| 52 debug("Sending GestureTap"); |
| 53 eventSender.gestureTap(point.x, point.y); |
| 54 |
| 55 // Verify that the iframe was removed. |
| 56 shouldBeNull("document.getElementById('target')"); |
| 57 |
| 58 // Ensure the event is done being processed. |
| 59 setTimeout(function() { |
| 60 // Reinsert the target node for the next run. |
| 61 insertionPoint.parentNode.insertBefore(clone, insertionPoint); |
| 62 clone.addEventListener('load', function() { |
| 63 debug('iframe loaded'); |
| 64 debug(''); |
| 65 setTimeout(resolve, 0); |
| 66 }); |
| 67 window.target = clone; |
| 68 }, 0); |
| 69 }); |
| 70 } |
| 37 | 71 |
| 38 if (window.eventSender) { | 72 if (window.eventSender) { |
| 39 jsTestIsAsync = true; | 73 jsTestIsAsync = true; |
| 40 target.onload = function() { | 74 target.onload = function() { |
| 41 debug("Sending GestureTapDown"); | 75 doTapAndRemove('mousemove') |
| 42 eventSender.gestureTapDown(point.x, point.y); | 76 .then(function() { return doTapAndRemove('mousedown'); }) |
| 43 | 77 .then(function() { return doTapAndRemove('mouseup'); }) |
| 44 debug("Sending GestureShowPress"); | 78 .catch(function(err) { |
| 45 eventSender.gestureShowPress(point.x, point.y); | 79 testFailed("Promise rejected: " + err.message); |
| 46 | 80 }).then(finishJSTest); |
| 47 debug("Sending GestureTap"); | |
| 48 eventSender.gestureTap(point.x, point.y); | |
| 49 | |
| 50 shouldBeNull("document.getElementById('target')"); | |
| 51 | |
| 52 setTimeout(finishJSTest, 0); | |
| 53 } | 81 } |
| 54 } else { | 82 } else { |
| 55 debug("This test requires eventSender"); | 83 debug("This test requires eventSender"); |
| 56 } | 84 } |
| 57 </script> | 85 </script> |
| OLD | NEW |