WPT
wpt / touch-events / single-touch.html
Spec: Touch Events ↗
Runs: Chrome 155.0.8042.0 (wpt@4eb09bcd9, 2026-09-04) | Firefox 157.0a1 (wpt@c3fcbf4ba, 2026-09-04) | Safari 251 preview (wpt@e7122b73f, 2026-09-04) | Ladybird 1.0-52f0f (wpt@a1ecd0c09, 2026-09-04) | Servo Servo 0.6 (wpt@2c385f65e, 2026-09-04) | Blitz a50cb8971 (wpt@a95401e4e, 2026-09-03)
View on the Blitz WPT dashboard | Open test on wpt.live | wpt.fyi
| Chrome | Firefox | Safari | Ladybird | Servo | Blitz | |
|---|---|---|---|---|---|---|
| Total | 227/227 | 226/227 | 0/227 | 0/227 | 0/227 | NOT RUN |
| Subtest | Chrome | Firefox | Safari | Ladybird | Servo | Blitz |
|---|---|---|---|---|---|---|
| Verify touch events for a single touch drag operation | PASS | FAIL | FAIL | FAIL | — | — |
| touchstart event is a TouchEvent event | PASS | PASS | — | — | — | — |
| touchstart.touches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.touches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchstart.touches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchstart.touches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchstart.touches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchstart.touches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchstart.touches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchstart.touches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.touches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.targetTouches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchstart.targetTouches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.targetTouches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.changedTouches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchstart.changedTouches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchstart.changedTouches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchstart.altKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.altKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchstart.metaKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.metaKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchstart.ctrlKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.ctrlKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchstart.shiftKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchstart.shiftKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchstart: all TouchList lengths are correct | PASS | PASS | — | — | — | — |
| touchstart: all TouchList identifiers are consistent | PASS | PASS | — | — | — | — |
| touchstart: event target same as targetTouches target | PASS | PASS | — | — | — | — |
| touchstart: touch pageX/pageY inside of target element | PASS | PASS | — | — | — | — |
| touchstart: touch clientX/clientY is consistent with pageX/pageY | PASS | PASS | — | — | — | — |
| touchstart: touch screenX/screenY pageX/pageY and clientX/clientY values are no less than 0 | PASS | PASS | — | — | — | — |
| touchmove event is a TouchEvent event | PASS | PASS | — | — | — | — |
| touchmove.touches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.touches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchmove.touches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchmove.touches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchmove.touches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchmove.touches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchmove.touches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchmove.touches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.touches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.targetTouches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchmove.targetTouches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.targetTouches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.changedTouches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchmove.changedTouches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchmove.changedTouches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchmove.altKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.altKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchmove.metaKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.metaKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchmove.ctrlKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.ctrlKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchmove.shiftKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchmove.shiftKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchmove: all TouchList lengths are correct | PASS | PASS | — | — | — | — |
| touchmove: all TouchList identifiers matches touchstart identifier | PASS | PASS | — | — | — | — |
| touchmove: event target same as targetTouches target | PASS | PASS | — | — | — | — |
| touchmove: touch pageX/pageY inside of one of the target elements | PASS | PASS | — | — | — | — |
| touchmove: touch clientX/clientY is consistent with pageX/pageY | PASS | PASS | — | — | — | — |
| touchmove: touch screenX/screenY pageX/pageY and clientX/clientY values are no less than 0 | PASS | PASS | — | — | — | — |
| touchend event is a TouchEvent event | PASS | PASS | — | — | — | — |
| touchend.touches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.touches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchend.touches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchend.touches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchend.touches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchend.touches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchend.touches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchend.targetTouches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.targetTouches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchend.targetTouches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchend.targetTouches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchend.targetTouches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchend.targetTouches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchend.targetTouches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchend.changedTouches attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.changedTouches attribute is of type TouchList | PASS | PASS | — | — | — | — |
| touchend.changedTouches's touch list is a TouchList object | PASS | PASS | — | — | — | — |
| touchend.changedTouches.TouchList.length attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches.TouchList.length attribute is of type number (unsigned long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches.TouchList.item attribute exists check_touchList_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches.TouchList.item attribute is of type function | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0]'s touch point is a Touch object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.identifier attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.identifier attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.target attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.target attribute is of type Element | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.screenX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.screenX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.screenY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.screenY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.clientX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.clientX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.clientY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.clientY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.pageX attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.pageX attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.pageY attribute exists check_Touch_object | PASS | PASS | — | — | — | — |
| touchend.changedTouches[0].Touch.pageY attribute is of type number (long) | PASS | PASS | — | — | — | — |
| touchend.altKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.altKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchend.metaKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.metaKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchend.ctrlKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.ctrlKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchend.shiftKey attribute exists check_TouchEvent | PASS | PASS | — | — | — | — |
| touchend.shiftKey attribute is of type boolean | PASS | PASS | — | — | — | — |
| touchend: all TouchList lengths are correct | PASS | PASS | — | — | — | — |
| touchend: touches identifier matches changedTouches identifier | PASS | PASS | — | — | — | — |
| touchend: touch pageX/pageY inside expected element | PASS | PASS | — | — | — | — |
| touchend: touch clientX/clientY is consistent with pageX/pageY | PASS | PASS | — | — | — | — |
| touchend: touch screenX/screenY pageX/pageY and clientX/clientY values are no less than 0 | PASS | PASS | — | — | — | — |