| <script src="../../../resources/js-test.js"></script> |
| <div id='touchtarget' style='width: 50; height: 50'></div> |
| <script> |
| description("This test checks that we correctly update the touch event handler count as event handlers are added and removed"); |
| |
| debug("Test addEventListener/removeEventListener on the document."); |
| (function() { |
| var listener = function() { } |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| document.addEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| document.addEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| document.addEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '3'); |
| document.removeEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| document.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| // Try removing the capturing listener again. |
| document.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| document.removeEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| document.removeEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test setting touch handlers on the document."); |
| (function() { |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| document.ontouchstart = function() { } |
| document.ontouchmove = function() {} |
| document.ontouchend = function() {} |
| document.ontouchcancel = function() {} |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| document.ontouchstart = function() { } |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| document.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| document.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| document.ontouchend = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| document.ontouchmove = null; |
| document.ontouchcancel = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test addEventListener/removeEventListener on the window."); |
| (function() { |
| var listener = function() { } |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| window.addEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| window.addEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| window.addEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '3'); |
| window.removeEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| window.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| // Try removing the capturing listener again. |
| window.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| window.removeEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| window.removeEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test setting touch handlers on the window."); |
| (function() { |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| window.ontouchstart = function() { } |
| window.ontouchmove = function() {} |
| window.ontouchend = function() {} |
| window.ontouchcancel = function() {} |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| window.ontouchstart = function() { } |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| window.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| window.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| window.ontouchend = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| window.ontouchmove = null; |
| window.ontouchcancel = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test addEventListener/removeEventListener on a div."); |
| (function() { |
| var listener = function() { } |
| var div = document.getElementById('touchtarget'); |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| div.addEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| div.addEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| div.addEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '3'); |
| div.removeEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| div.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| // Try removing the capturing listener again. |
| div.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| div.removeEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| div.removeEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test setting touch handlers on a div."); |
| (function() { |
| var div = document.getElementById('touchtarget'); |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| div.ontouchstart = function() { } |
| div.ontouchmove = function() { } |
| div.ontouchend = function() { } |
| div.ontouchcancel = function() { } |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| div.ontouchstart = function() { } |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| div.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| div.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| div.ontouchend = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| div.ontouchmove = null; |
| div.ontouchcancel = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test redudant addEventListener on a div."); |
| (function() { |
| var listener = function() { } |
| var div = document.getElementById('touchtarget'); |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| div.addEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| div.addEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| div.removeEventListener('touchstart', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| })(); |
| |
| |
| debug("Test addEventListener/removeEventListener on a new div."); |
| (function() { |
| var div = document.createElement('div'); |
| var touchtarget = document.getElementById('touchtarget'); |
| var listener = function() { } |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| |
| div.addEventListener('touchstart', listener, true); |
| div.addEventListener('touchmove', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| |
| touchtarget.appendChild(div); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| |
| div.addEventListener('touchend', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| |
| div.removeEventListener('touchstart', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| touchtarget.removeChild(div); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| div.removeEventListener('touchmove', listener, false); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| |
| div.removeEventListener('touchmove', listener, true); |
| div.removeEventListener('touchend', listener, true); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| })(); |
| |
| debug("Test setting touch handlers on a new div."); |
| (function() { |
| var div = document.createElement('div'); |
| var touchtarget = document.getElementById('touchtarget'); |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| |
| div.ontouchstart = function() { } |
| div.ontouchmove = function() { } |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| |
| touchtarget.appendChild(div); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| |
| div.ontouchend = function() { } |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| |
| div.ontouchstart = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| |
| touchtarget.removeChild(div); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| |
| div.ontouchend = null; |
| div.ontouchmove = null; |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '0'); |
| })(); |
| |
| var nestedDocument; |
| |
| debug("Test that nested Documents' touch handlers are properly tracked in their parent Document."); |
| (function() { |
| var iframe = document.createElement('iframe'); |
| var touchtarget = document.getElementById('touchtarget'); |
| touchtarget.ontouchend = function() {}; |
| |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| |
| touchtarget.appendChild(iframe); |
| |
| nestedDocument = iframe.contentWindow.document; |
| nestedDocument.open('text/html', 'replace'); |
| nestedDocument.write('<!DOCTYPE html>\n<script>\nwindow.ontouchstart=function(){};\n</' + 'script>\n' + |
| '<div id=twoHandlers ontouchmove="function(){}" ontouchcancel="function(){}"></div>'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(nestedDocument)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(nestedDocument)', '2'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| |
| nestedDocument.write('<script>window.ontouchstart=undefined</' + 'script>\n'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(nestedDocument)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(nestedDocument)', '2'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| |
| nestedDocument.write('<script>document.addEventListener("touchmove", function(){});</' + 'script>\n'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(nestedDocument)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(nestedDocument)', '2'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '2'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '2'); |
| |
| nestedDocument.write('<script>document.getElementById("twoHandlers").remove();</' + 'script>\n'); |
| gc(); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(nestedDocument)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(nestedDocument)', '1'); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '1'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| nestedDocument.close(); |
| |
| touchtarget.removeChild(iframe); |
| shouldBe('window.internals.touchStartOrMoveEventHandlerCount(document)', '0'); |
| shouldBe('window.internals.touchEndOrCancelEventHandlerCount(document)', '1'); |
| })(); |
| </script> |
| </body> |