| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="../../../resources/js-test.js"></script> |
| </head> |
| <body> |
| <p id="description"></p> |
| <div id="target" style="padding: 10px; background-color: blue;"></div> |
| <div id="console"></div> |
| <script> |
| description("Tests that events are received properly even when we never saw the touchstart for the first finger (eg. was skipped by cc touch hit testing) - crbug.com/363321"); |
| |
| var event; |
| var expectingStart = false; |
| var expectingEnd = false; |
| |
| var target = document.getElementById('target'); |
| var rect = target.getBoundingClientRect(); |
| var targetX = rect.left + rect.width / 2; |
| var targetY = rect.top + rect.height / 2; |
| |
| window.addEventListener('touchstart', function(e) { |
| if (!expectingStart) { |
| testFailed('Got unexpected touchstart event'); |
| return; |
| } |
| expectingStart = false; |
| event = e; |
| |
| shouldBe('event.target', 'target'); |
| |
| // Touch ID 0 is the one we never got a touchstart for, so it should |
| // be targeted at the document. |
| shouldBe('event.touches.length', '2'); |
| shouldBe('event.touches[0].identifier', '0'); |
| shouldBe('event.touches[0].pageX', '12'); |
| shouldBe('event.touches[0].pageY', '0'); |
| shouldBe('event.touches[0].target', 'document'); |
| |
| // Touch ID 1 should be the new touch. |
| shouldBe('event.touches[1].identifier', '1'); |
| shouldBe('event.touches[1].pageX', 'targetX'); |
| shouldBe('event.touches[1].pageY', 'targetY'); |
| shouldBe('event.touches[1].target', 'target'); |
| |
| shouldBe('event.changedTouches.length', '1'); |
| shouldBe('event.changedTouches[0].identifier', '1'); |
| |
| shouldBe('event.targetTouches.length', '1'); |
| shouldBe('event.targetTouches[0].identifier', '1'); |
| }); |
| |
| window.addEventListener('touchmove', function(e) { |
| testFailed('Got unexpected touchmove event'); |
| }); |
| |
| window.addEventListener('touchend', function(e) { |
| if (!expectingEnd) { |
| testFailed('Got unexpected touchstart event'); |
| return; |
| } |
| expectingEnd = false; |
| event = e; |
| |
| shouldBe('event.target', 'target'); |
| |
| shouldBe('event.touches.length', '0'); |
| |
| shouldBe('event.changedTouches.length', '1'); |
| shouldBe('event.changedTouches[0].identifier', '1'); |
| shouldBe('event.changedTouches[0].pageX', 'targetX'); |
| shouldBe('event.changedTouches[0].pageY', 'targetY'); |
| shouldBe('event.changedTouches[0].target', 'target'); |
| |
| shouldBe('event.targetTouches.length', '0'); |
| }); |
| |
| if (document.elementFromPoint(targetX, targetY) != target) { |
| testFailed('Failed to hit expected target at ' + targetX + ',' + targetY); |
| } else if (!window.eventSender) { |
| testFailed('This test requires eventSender'); |
| } else { |
| eventSender.clearTouchPoints(); |
| |
| // First touch point is outside our target, but we never actually |
| // get a touchstart event sent to the renderer for it. |
| eventSender.addTouchPoint(10, 0); |
| eventSender.updateTouchPoint(0, 12, 0); |
| |
| // Second point is on our target and we expect touchstart |
| eventSender.addTouchPoint(targetX, targetY); |
| debug('Sending touchstart event.'); |
| expectingStart = true; |
| eventSender.touchStart(); |
| if (expectingStart) |
| testFailed("Didn't receive expected touchstart event"); |
| debug(''); |
| |
| // Make sure we don't get any events (or crash) if we receive a move or |
| // end for just the first touch point. |
| debug('Sending touchmove and touchend for unrelated touch point.'); |
| eventSender.updateTouchPoint(0, 13, 0); |
| eventSender.touchMove(); |
| eventSender.releaseTouchPoint(0); |
| eventSender.touchEnd(); |
| debug(''); |
| |
| // If the 2nd touch point lifts, we get an event showing just that change. |
| debug('Sending touchend.'); |
| eventSender.releaseTouchPoint(0); |
| expectingEnd = true; |
| eventSender.touchEnd(); |
| if (expectingEnd) |
| testFailed("Didn't receive expected touchend event"); |
| debug(''); |
| } |
| </script> |
| </body> |
| </html> |
| |