blob: ad49d6f2ac1f6d85cc734bf59e1f718d9c7be033 [file] [log] [blame]
<!DOCTYPE HTML>
<script src="../../../../resources/js-test.js"></script>
<style>
#target {
width: 50px;
height: 50px;
}
</style>
<iframe id="target" src="resources/event-delegator.html"></iframe>
<div id=console></div>
<script>
var removalEventType;
function onEventInFrame(e) {
debug("Received " + e.type + " in child frame");
if (e.type == removalEventType) {
debug('Removing iframe');
target.parentNode.removeChild(target);
gc();
}
}
function eventLogger(e) {
debug("Received " + e.type + " in main frame");
}
document.addEventListener('mousemove', eventLogger);
document.addEventListener('mousedown', eventLogger);
document.addEventListener('mouseup', eventLogger);
document.addEventListener('click', eventLogger);
description("Verifies that a tap occurring on an iframe that gets removed during tap handling doesn't cause a crash.");
var rect = target.getBoundingClientRect();
var point = {
x: rect.left + rect.width / 2,
y: rect.top + rect.height / 2
};
function doTapAndRemove(type)
{
return new Promise(function(resolve, reject) {
var clone = target.cloneNode();
var insertionPoint = target.nextSibling;
debug('Test case: Remove during ' + type);
removalEventType = type;
eventSender.gestureTapDown(point.x, point.y);
eventSender.gestureShowPress(point.x, point.y);
debug("Sending GestureTap");
eventSender.gestureTap(point.x, point.y);
// Verify that the iframe was removed.
shouldBeNull("document.getElementById('target')");
// Ensure the event is done being processed.
setTimeout(function() {
// Reinsert the target node for the next run.
insertionPoint.parentNode.insertBefore(clone, insertionPoint);
clone.addEventListener('load', function() {
debug('iframe loaded');
debug('');
setTimeout(resolve, 0);
});
window.target = clone;
}, 0);
});
}
if (window.eventSender) {
jsTestIsAsync = true;
target.onload = function() {
doTapAndRemove('mousemove')
.then(function() { return doTapAndRemove('mousedown'); })
.then(function() { return doTapAndRemove('mouseup'); })
.catch(function(err) {
testFailed("Promise rejected: " + err.message);
}).then(finishJSTest);
}
} else {
debug("This test requires eventSender");
}
</script>