function testSingleTouch(name) {
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target = document.getElementById("testTarget");
let target2 = document.getElementById("testTarget2");
let bcr = target.getBoundingClientRect();
let bcr2 = target2.getBoundingClientRect();
let touch1 = new testtouch({
page: {x: Math.round(bcr.left + bcr.width/2),
y: Math.round(bcr.top + bcr.height/2)},
target
});
let event = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
// test touchstart event fires correctly var checkFunction = checkEvent(event);
window.addEventListener("touchstart", checkFunction);
sendTouchEvent(cwu, "touchstart", event, 0);
window.removeEventListener("touchstart", checkFunction);
function testSingleTouch2(name) {
// firing a touchstart that includes only one touch will evict any touches in the queue with touchend messages
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target = document.getElementById("testTarget");
let target2 = document.getElementById("testTarget2");
let bcr = target.getBoundingClientRect();
let bcr2 = target2.getBoundingClientRect();
let touch1 = new testtouch({
identifier: 0,
page: {x: Math.round(bcr.left + bcr.width/2),
y: Math.round(bcr.top + bcr.height/2)},
target
});
let event1 = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
let touch2 = new testtouch({
identifier: 1,
page: {x: Math.round(bcr2.left + bcr2.width/2),
y: Math.round(bcr2.top + bcr2.height/2)},
target: target2
});
let event2 = new touchEvent({
touches: [touch2],
targetTouches: [touch2],
changedTouches: [touch2]
});
// test touchstart event fires correctly var checkFunction1 = checkEvent(event1);
window.addEventListener("touchstart", checkFunction1);
sendTouchEvent(cwu, "touchstart", event1, 0);
window.removeEventListener("touchstart", checkFunction1);
function testMultiTouch(name) {
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target1 = document.getElementById("testTarget");
let target2 = document.getElementById("testTarget2");
let bcr = target1.getBoundingClientRect();
let bcr2 = target2.getBoundingClientRect();
let touch1 = new testtouch({
identifier: 0,
page: {x: Math.round(bcr.left + bcr.width/2),
y: Math.round(bcr.top + bcr.height/2)},
target: target1
});
let touch2 = new testtouch({
identifier: 1,
page: {x: Math.round(bcr2.left + bcr2.width/2),
y: Math.round(bcr2.top + bcr2.height/2)},
target: target2
});
let event = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
// test touchstart event fires correctly var checkFunction = checkEvent(event);
window.addEventListener("touchstart", checkFunction);
sendTouchEvent(cwu, "touchstart", event, 0);
window.removeEventListener("touchstart", checkFunction);
// test moving one touch point
event.touches[0].page.x -= 1;
event.targetTouches = [event.touches[0]];
event.changedTouches = [event.touches[0]];
window.addEventListener("touchmove", checkFunction);
sendTouchEvent(cwu, "touchmove", event, 0);
window.removeEventListener("touchmove", checkFunction);
// test moving both touch points -- two touchmove events should fire, one on each target
event.touches[0].page.x -= 1;
event.touches[1].page.x -= 1;
event.targetTouches = event.touches;
event.changedTouches = event.touches; var touchMoveEvents = 0; var checkFunction2 = function(aEvent) {
is(event.ctrlKey, aEvent.ctrlKey, "Correct ctrlKey");
is(event.altKey, aEvent.altKey, "Correct altKey");
is(event.shiftKey, aEvent.shiftKey, "Correct shiftKey");
is(event.metaKey, aEvent.metaKey, "Correct metaKey");
checkTouches(event.touches, aEvent.touches);
checkTouches(event.changedTouches, aEvent.changedTouches);
if (aEvent.targetTouches[0].target == target1) {
checkTouches([event.touches[0]], aEvent.targetTouches);
} else if (aEvent.targetTouches[0].target == target2) {
checkTouches([event.touches[1]], aEvent.targetTouches);
} else
ok(false, "Event target is incorrect: " + event.targetTouches[0].target.nodeName + "#" + event.targetTouches[0].target.id);
touchMoveEvents++;
};
window.addEventListener("touchmove", checkFunction2);
sendTouchEvent(cwu, "touchmove", event, 0);
is(touchMoveEvents, 2, "Correct number of touchmove events fired");
window.removeEventListener("touchmove", checkFunction2);
// test removing just one finger var expected = new touchEvent({
touches: [touch2],
targetTouches: [],
changedTouches: [touch1]
});
checkFunction = checkEvent(expected);
// test removing the other finger
window.addEventListener("touchend", checkFunction);
sendTouchEvent(cwu, "touchend", event, 0);
window.removeEventListener("touchend", checkFunction);
function testTouchChanged() {
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target1 = document.getElementById("testTarget");
let bcr = target1.getBoundingClientRect();
let touch1 = new testtouch({
identifier: 0,
page: {x: Math.round(bcr.left + bcr.width/2),
y: Math.round(bcr.top + bcr.height/2)},
target: target1
});
let event = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
var checkFunction = checkEvent(event);
sendTouchEvent(cwu, "touchstart", event, 0);
var moveEvents = 0;
function onMove(aEvent) {
moveEvents++;
}
window.addEventListener("touchmove", onMove);
// the first touchmove should always fire an event
sendTouchEvent(cwu, "touchmove", event, 0);
// changing nothing should not fire a touchmove event
sendTouchEvent(cwu, "touchmove", event, 0);
// test moving x
event.touches[0].page.x -= 1;
sendTouchEvent(cwu, "touchmove", event, 0);
// test moving y
event.touches[0].page.y -= 1;
sendTouchEvent(cwu, "touchmove", event, 0);
// test changing y radius
event.touches[0].radius.y += 1;
sendTouchEvent(cwu, "touchmove", event, 0);
// test changing x radius
event.touches[0].radius.x += 1;
sendTouchEvent(cwu, "touchmove", event, 0);
function testPreventDefault() {
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target = document.getElementById("testTarget");
let target2 = document.getElementById("testTarget2");
let bcr = target.getBoundingClientRect();
let bcr2 = target2.getBoundingClientRect();
let touch1 = new testtouch({
page: {x: bcr.left + bcr.width/2,
y: bcr.top + bcr.height/2},
target
});
let event = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
let preventFunction = function(aEvent) {
aEvent.preventDefault();
}
if (aTest.doPrevent)
target.removeEventListener(aTest.name, preventFunction);
}
for (var i = 0; i < subTests.length; i++) {
for (var j = 0; j < subTests[i].length; j++) {
dotest(subTests[i][j]);
}
}
nextTest();
}
function testRemovingElement() {
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target = document.getElementById("testTarget");
let bcr = document.getElementById("testTarget").getBoundingClientRect();
let touch1 = new testtouch({
page: {x: bcr.left + bcr.width/2,
y: bcr.top + bcr.height/2},
});
let e = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
var touchEvents = 0; var removeTarget = function(aEvent) {
aEvent.target.remove();
};
var checkTarget = function(aEvent) {
is(aEvent.target, target, "Event has correct target");
touchEvents++;
};
is(touchEvents, 2, "Check target was called twice");
nextTest();
}
function testNAC() {
let cwu = SpecialPowers.getDOMWindowUtils(window);
let target = document.getElementById("testTarget3");
let bcr = target.getBoundingClientRect();
let touch1 = new testtouch({
page: {x: Math.round(bcr.left + bcr.width/2),
y: Math.round(bcr.top + bcr.height/2)},
target
});
let event = new touchEvent({
touches: [touch1],
targetTouches: [touch1],
changedTouches: [touch1]
});
// test touchstart event fires correctly var checkFunction = checkEvent(event);
window.addEventListener("touchstart", checkFunction);
sendTouchEvent(cwu, "touchstart", event, 0);
window.removeEventListener("touchstart", checkFunction);
sendTouchEvent(cwu, "touchend", event, 0);
nextTest();
}
function doTest() {
tests.push(testSingleTouch);
tests.push(testSingleTouch2);
tests.push(testMultiTouch);
tests.push(testPreventDefault);
tests.push(testTouchChanged);
tests.push(testRemovingElement);
tests.push(testNAC);
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.