function getTouchEventForTarget(target, cwu, id) { var bcr = target.getBoundingClientRect(); var touch = new testtouch({
page: {x: Math.round(bcr.left + bcr.width/2),
y: Math.round(bcr.top + bcr.height/2)},
target: target,
identifier: id,
}); var event = new touchEvent({
touches: [touch],
targetTouches: [touch],
changedTouches: [touch]
});
return event;
}
function runTests() { var d0 = document.getElementById("d0"); var d1 = document.getElementById("d1"); var d2 = document.getElementById("d2"); var d3 = document.getElementById("d3");
// Test Pointer firing before any mouse/touch original source
var mouseDownTriggered = 0; var pointerDownTriggered = 0; var touchDownTriggered = 0; var touchCancelTriggered = 0; var pointerCancelTriggered = 0;
// Test pointer event generated from mouse event
d0.addEventListener("mousedown", (e) => {
++mouseDownTriggered;
is(pointerDownTriggered , mouseDownTriggered, "Mouse event must be triggered after pointer event!");
}, {once: true});
d0.addEventListener("pointerdown", (e) => {
++pointerDownTriggered;
is(pointerDownTriggered, mouseDownTriggered + 1, "Pointer event must be triggered before mouse event!");
}, {once: true});
// Test pointer event generated from touch event
mouseDownTriggered = 0;
pointerDownTriggered = 0;
d0.addEventListener("touchstart", (e) => {
++touchDownTriggered;
is(pointerDownTriggered, touchDownTriggered, "Touch event must be triggered after pointer event!");
}, {once: true});
d0.addEventListener("mousedown", (e) => {
++mouseDownTriggered;
is(pointerDownTriggered , mouseDownTriggered, "Mouse event must be triggered after pointer event!");
}, {once: true});
d0.addEventListener("pointerdown", (e) => {
++pointerDownTriggered;
is(pointerDownTriggered, touchDownTriggered + 1, "Pointer event must be triggered before mouse event!");
is(pointerDownTriggered, mouseDownTriggered + 1, "Pointer event must be triggered before mouse event!");
}, {once: true});
d0.addEventListener("touchcancel", (e) => {
++touchCancelTriggered;
is(pointerCancelTriggered, touchCancelTriggered, "Touch cancel event must be triggered after pointer event!");
}, {once: true});
d0.addEventListener("pointercancel", function(ev) {
is(ev.pointerId, 0, "Correct default pointerId");
is(ev.bubbles, true, "bubbles should be true");
is(ev.cancelable, false, "pointercancel cancelable should be false ");
++pointerCancelTriggered;
is(pointerCancelTriggered, touchCancelTriggered + 1, "Pointer event must be triggered before touch event!");
}, {once: true});
var cwu = SpecialPowers.getDOMWindowUtils(window); var event1 = getTouchEventForTarget(d1, cwu, 0);
sendTouchEvent(cwu, "touchstart", event1, 0);
sendTouchEvent(cwu, "touchmove", event1, 0);
// Test Touch to Pointer Cancel
sendTouchEvent(cwu, "touchcancel", event1, 0);
// Check Pointer enter/leave from mouse generated event var mouseEnterTriggered = 0; var pointerEnterTriggered = 0;
d2.onpointerenter = function(e) {
pointerEnterTriggered = 1;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
is(mouseEnterTriggered, 0, "Pointer event must be triggered before mouse event!");
};
d2.onmouseenter = function(e) {
mouseEnterTriggered = 1;
is(pointerEnterTriggered , 1, "Mouse event must be triggered after pointer event!");
};
synthesizeMouse(d2, 3, 3, { type: "mousemove"});
d2.onmouseenter = function(e) {}
// Test Multi Pointer enter/leave for pointers generated from Mouse and Touch at the same time
// Enter mouse and touch generated pointers to different elements var d1enterCount = 0; var d2enterCount = 0; var d3enterCount = 0; var d1leaveCount = 0; var d2leaveCount = 0; var d3leaveCount = 0; var mousePointerEnterLeaveCount = 0; var touchPointerEnterLeaveCount = 0;
var checkPointerType = function(pointerType) {
if (pointerType == "mouse") {
++mousePointerEnterLeaveCount;
} else if (pointerType == "touch") {
++touchPointerEnterLeaveCount;
}
};
d1.onpointerenter = function(e) {
++d1enterCount;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
checkPointerType(e.pointerType);
};
d2.onpointerenter = function(e) {
++d2enterCount;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
checkPointerType(e.pointerType);
};
d3.onpointerenter = function(e) {
++d3enterCount;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
checkPointerType(e.pointerType);
};
d1.onpointerleave = function(e) {
++d1leaveCount;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
checkPointerType(e.pointerType);
};
d2.onpointerleave = function(e) {
++d2leaveCount;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
checkPointerType(e.pointerType);
};
d3.onpointerleave = function(e) {
++d3leaveCount;
is(e.bubbles, false, "bubbles should be false");
is(e.cancelable, false, "cancelable should be false");
checkPointerType(e.pointerType);
};
// Test for pointer buttons when it generated from mousemove event
d1.onpointermove = function(e) {
is(e.buttons, 0, "Buttons must be 0 on pointer generated from mousemove");
is(e.button, -1, "Button must be -1 on pointer generated from mousemove when no buttons pressed");
is(e.pointerType, "mouse", "Pointer type must be mouse");
};
cwu.sendMouseEvent("mousemove", 4, 4, 0, 0, 0, false, 0, 0);
d1.onpointermove = function(e) {
is(e.buttons, 1, "Buttons must be 1 on pointermove generated from touch event");
is(e.button, -1, "Button must be -1 on pointermove generated from touch event");
is(e.pointerType, "touch", "Pointer type must be touch");
};
sendTouchEvent(cwu, "touchmove", getTouchEventForTarget(d1, cwu, 2), 0);
// Test for cancel trigger pointerOut (Touch Pointer must be at d1 now)
pointerCancelTriggered = 0; var pointerOutTriggeredForCancelEvent = 0; var pointerLeaveTriggeredForCancelEvent = 0;
d1.onpointerout = function(e) {
if (pointerOutTriggeredForCancelEvent == 0) {
is(e.pointerId, 3, "Wrong Pointer type, should be id from Touch event");
is(e.pointerType, "touch", "Wrong Pointer type, should be touch type");
} else {
is(e.pointerId, 0, "Wrong Pointer type, should be id from mouse event");
is(e.pointerType, "mouse", "Wrong Pointer type, should be mouse type");
}
pointerOutTriggeredForCancelEvent = 1;
};
d1.onpointerleave = function(e) {
is(pointerOutTriggeredForCancelEvent, 1, "Pointer Out must be dispatched bedore Pointer leave");
if (pointerLeaveTriggeredForCancelEvent == 0) {
is(e.pointerId, 3, "Wrong Pointer type, should be id from Touch event");
is(e.pointerType, "touch", "Wrong Pointer type, should be touch type");
} else {
is(e.pointerId, 0, "Wrong Pointer type, should be id from mouse event");
is(e.pointerType, "mouse", "Wrong Pointer type, should be mouse type");
}
pointerLeaveTriggeredForCancelEvent = 1;
}
sendTouchEvent(cwu, "touchcancel", getTouchEventForTarget(d1, cwu, 3), 0);
is(pointerOutTriggeredForCancelEvent, 1, "Pointer Out not dispatched on PointerCancel");
is(pointerLeaveTriggeredForCancelEvent, 1, "Pointer Leave not dispatched on PointerCancel");
finishTest();
}
function finishTest() {
// Let window.onerror have a chance to fire
setTimeout(function() {
setTimeout(function() {
window.parent.postMessage("run next", "*");
}, 0);
}, 0);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.