blob: a6a6b955f5e9f0c197e7637d266fdf6a612626b8 [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<form><input></form>
<div id="editor" contenteditable>world</div>
<div id="console"></div>
<script src="../../resources/js-test-pre.js"></script>
<script>
var eventType;
var composed;
function logEvent(event) {
eventType = event.type;
composed = event.composed;
}
function checkFlags(code, expected) {
shouldBeEqualToString(code ? code + '; eventType' : 'eventType', expected.eventType);
shouldBe('composed', expected.composed.toString());
debug('');
}
var lastTarget;
var lastEventName;
function log(target, eventName) {
eventType = undefined;
composed = undefined;
if (lastTarget)
lastTarget.removeEventListener(lastEventName, logEvent);
target.addEventListener(eventName, logEvent);
lastTarget = target;
lastEventName = eventName;
}
var input = document.querySelector('input');
var form = document.querySelector('form');
form.tabIndex = 0;
checkFlags('input.type = "radio"; log(input, "change"); input.click()', {eventType: 'change', composed: false});
checkFlags('log(form, "reset"); form.reset()', {eventType: 'reset', composed: false});
checkFlags('form.focus(); log(input, "focus"); input.focus()', {eventType: 'focus', composed: true});
checkFlags('log(input, "blur"); form.focus()', {eventType: 'blur', composed: true});
if (!window.eventSender)
testFailed('This test requires eventSender');
else {
testRunner.waitUntilDone();
eventSender.dragMode = false;
var x = input.offsetLeft + input.offsetWidth / 2;
var y = input.offsetTop + input.offsetHeight / 2;
checkFlags('input.type = "text"; log(input, "mousemove"); eventSender.mouseMoveTo(x, y)', {eventType: 'mousemove', composed: true});
checkFlags('log(input, "mousedown"); eventSender.mouseDown()', {eventType: 'mousedown', composed: true});
checkFlags('log(input, "mouseup"); eventSender.mouseUp()', {eventType: 'mouseup', composed: true});
checkFlags('log(input, "mouseout"); eventSender.mouseMoveTo(0, 0)', {eventType: 'mouseout', composed: true});
checkFlags('log(input, "mouseover"); eventSender.mouseMoveTo(x, y)', {eventType: 'mouseover', composed: true});
evalAndLog('input.value = "hello"; eventSender.mouseMoveTo(input.offsetLeft + 1, y); eventSender.mouseDown();');
checkFlags('log(input, "select"); eventSender.mouseMoveTo(input.offsetLeft + input.offsetWidth - 2, y); eventSender.mouseUp()',
{eventType: 'select', composed: false});
var editableElement = document.getElementById('editor');
y = editableElement.offsetTop + editableElement.offsetHeight / 2;
checkFlags('log(editableElement, "selectstart"); eventSender.mouseMoveTo(editableElement.offsetLeft + 1, y); eventSender.mouseDown()',
{eventType: 'selectstart', composed: false});
}
function testLoadEvent() {
var scriptThatLoads = document.createElement('script');
scriptThatLoads.src = "resources/event-path-test-helpers.js";
scriptThatLoads.onload = function (event) {
logEvent(event);
checkFlags('', {eventType: 'load', composed: false});
testErrorEvent();
}
document.body.appendChild(scriptThatLoads);
}
function testErrorEvent() {
var scriptThatFailsToLoad = document.createElement('script');
scriptThatFailsToLoad.src = "bad.js";
scriptThatFailsToLoad.onerror = function (event) {
logEvent(event);
checkFlags('', {eventType: 'error', composed: false});
testScrollEvent();
}
document.body.appendChild(scriptThatFailsToLoad);
}
function testScrollEvent() {
document.body.style.marginBottom = '1000px';
log(window, 'scroll');
setTimeout(function () {
window.scrollTo(0, 1000);
setTimeout(function () {
checkFlags('', {eventType: 'scroll', composed: false});
window.scrollTo(0, 0);
testResizeEvent();
}, 0);
}, 0);
}
function testResizeEvent() {
var iframe = document.createElement('iframe');
iframe.style.width = '100px';
iframe.style.height = '100px';
iframe.onload = function () {
requestAnimationFrame(function () {
setTimeout(function () {
iframe.contentDocument.body.getBoundingClientRect();
log(iframe.contentWindow, "resize");
iframe.style.width = '200px';
iframe.style.height = '200px';
iframe.contentDocument.body.getBoundingClientRect();
requestAnimationFrame(function () {
checkFlags('', {eventType: 'resize', composed: false});
finishJSTest();
});
}, 0);
});
}
document.body.appendChild(iframe);
}
testLoadEvent();
// FIXME: Test abort and loadedmetadata events.
jsTestIsAsync = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>