Title: [110448] trunk
Revision
110448
Author
[email protected]
Date
2012-03-12 11:28:40 -0700 (Mon, 12 Mar 2012)

Log Message

Touch event handler count is not updated when adding handlers to the window.
https://bugs.webkit.org/show_bug.cgi?id=80756

Source/WebCore:

Touch event handlers added to the window needs to be included when counting the number of touch event
handlers. This makes touch event handler counting identical to wheel event handler counting.

Patch by Sadrul Habib Chowdhury <[email protected]> on 2012-03-12
Reviewed by Anders Carlsson.

Test: fast/events/touch/touch-handler-count.html

* dom/EventNames.h:
(EventNames):
(WebCore::EventNames::isTouchEventType):
* dom/Node.cpp:
(WebCore):
(WebCore::tryAddEventListener):
(WebCore::tryRemoveEventListener):
* page/DOMWindow.cpp:
(WebCore::DOMWindow::addEventListener):
(WebCore::DOMWindow::removeEventListener):
* testing/Internals.cpp:
(WebCore::Internals::touchEventHandlerCount):
(WebCore):
* testing/Internals.h:
(Internals):
* testing/Internals.idl:

LayoutTests:

Patch by Sadrul Habib Chowdhury <[email protected]> on 2012-03-12
Reviewed by Anders Carlsson.

The new layout tests add and remove touch event handlers on the window, document, and a div in the
document, and tests that the count is updated correctly when handlers are added and/or removed.

* fast/events/touch/touch-handler-count-expected.txt: Added.
* fast/events/touch/touch-handler-count.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (110447 => 110448)


--- trunk/LayoutTests/ChangeLog	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/LayoutTests/ChangeLog	2012-03-12 18:28:40 UTC (rev 110448)
@@ -1,3 +1,16 @@
+2012-03-12  Sadrul Habib Chowdhury  <[email protected]>
+
+        Touch event handler count is not updated when adding handlers to the window.
+        https://bugs.webkit.org/show_bug.cgi?id=80756
+
+        Reviewed by Anders Carlsson.
+
+        The new layout tests add and remove touch event handlers on the window, document, and a div in the
+        document, and tests that the count is updated correctly when handlers are added and/or removed.
+
+        * fast/events/touch/touch-handler-count-expected.txt: Added.
+        * fast/events/touch/touch-handler-count.html: Added.
+
 2012-03-12  Eric Uhrhane  <[email protected]>
 
         [Chromium] fast/filesystem/op-restricted-chars.html fails on Windows

Added: trunk/LayoutTests/fast/events/touch/touch-handler-count-expected.txt (0 => 110448)


--- trunk/LayoutTests/fast/events/touch/touch-handler-count-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/touch-handler-count-expected.txt	2012-03-12 18:28:40 UTC (rev 110448)
@@ -0,0 +1,74 @@
+This test checks that we correctly update the touch event handler count as event handlers are added and removed
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Test addEventListener/removeEventListener on the document.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test setting touch handlers on the document.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 4
+PASS window.internals.touchEventHandlerCount(document) is 4
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test addEventListener/removeEventListener on the window.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test setting touch handlers on the document.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 4
+PASS window.internals.touchEventHandlerCount(document) is 4
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test addEventListener/removeEventListener on a div.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 1
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test setting touch handlers on a div.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 4
+PASS window.internals.touchEventHandlerCount(document) is 4
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test addEventListener/removeEventListener on a new div.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 0
+Test setting touch handlers on a new div.
+PASS window.internals.touchEventHandlerCount(document) is 0
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 3
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 2
+PASS window.internals.touchEventHandlerCount(document) is 0
+

Added: trunk/LayoutTests/fast/events/touch/touch-handler-count.html (0 => 110448)


--- trunk/LayoutTests/fast/events/touch/touch-handler-count.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/touch/touch-handler-count.html	2012-03-12 18:28:40 UTC (rev 110448)
@@ -0,0 +1,208 @@
+<script src=""
+<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.touchEventHandlerCount(document)', '0');
+    document.addEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+    document.addEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+    document.addEventListener('touchstart', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    document.removeEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+    document.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+
+    // Try removing the capturing listener again.
+    document.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+    document.removeEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+
+    document.removeEventListener('touchstart', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+})();
+
+debug("Test setting touch handlers on the document.");
+(function() {
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+    document._ontouchstart_ = function() { }
+    document._ontouchmove_ = function() {}
+    document._ontouchend_ = function() {}
+    document._ontouchcancel_ = function() {}
+    shouldBe('window.internals.touchEventHandlerCount(document)', '4');
+    document._ontouchstart_ = function() { }
+    shouldBe('window.internals.touchEventHandlerCount(document)', '4');
+    document._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    document._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    document._ontouchmove_ = null;
+    document._ontouchend_ = null;
+    document._ontouchcancel_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+})();
+
+debug("Test addEventListener/removeEventListener on the window.");
+(function() {
+    var listener = function() { }
+
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+    window.addEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+    window.addEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+    window.addEventListener('touchstart', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    window.removeEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+    window.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+
+    // Try removing the capturing listener again.
+    window.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+    window.removeEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+
+    window.removeEventListener('touchstart', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+})();
+
+debug("Test setting touch handlers on the document.");
+(function() {
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+    window._ontouchstart_ = function() { }
+    window._ontouchmove_ = function() {}
+    window._ontouchend_ = function() {}
+    window._ontouchcancel_ = function() {}
+    shouldBe('window.internals.touchEventHandlerCount(document)', '4');
+    window._ontouchstart_ = function() { }
+    shouldBe('window.internals.touchEventHandlerCount(document)', '4');
+    window._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    window._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    window._ontouchmove_ = null;
+    window._ontouchend_ = null;
+    window._ontouchcancel_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+})();
+
+debug("Test addEventListener/removeEventListener on a div.");
+(function() {
+    var listener = function() { }
+    var div = document.getElementById('touchtarget');
+
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+    div.addEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+    div.addEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+    div.addEventListener('touchstart', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    div.removeEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+    div.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+
+    // Try removing the capturing listener again.
+    div.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+    div.removeEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '1');
+
+    div.removeEventListener('touchstart', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+})();
+
+debug("Test setting touch handlers on a div.");
+(function() {
+    var div = document.getElementById('touchtarget');
+
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+    div._ontouchstart_ = function() { }
+    div._ontouchmove_ = function() { }
+    div._ontouchend_ = function() { }
+    div._ontouchcancel_ = function() { }
+    shouldBe('window.internals.touchEventHandlerCount(document)', '4');
+    div._ontouchstart_ = function() { }
+    shouldBe('window.internals.touchEventHandlerCount(document)', '4');
+    div._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    div._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+    div._ontouchmove_ = null;
+    div._ontouchend_ = null;
+    div._ontouchcancel_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(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.touchEventHandlerCount(document)', '0');
+
+    div.addEventListener('touchstart', listener, true);
+    div.addEventListener('touchmove', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    touchtarget.appendChild(div);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    div.addEventListener('touchend', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+
+    div.removeEventListener('touchstart', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    touchtarget.removeChild(div);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    div.removeEventListener('touchmove', listener, false);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    div.removeEventListener('touchmove', listener, true);
+    div.removeEventListener('touchend', listener, true);
+    shouldBe('window.internals.touchEventHandlerCount(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.touchEventHandlerCount(document)', '0');
+
+    div._ontouchstart_ = function() { }
+    div._ontouchmove_ = function() { }
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    touchtarget.appendChild(div);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    div._ontouchend_ = function() { }
+    shouldBe('window.internals.touchEventHandlerCount(document)', '3');
+
+    div._ontouchstart_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    touchtarget.removeChild(div);
+    shouldBe('window.internals.touchEventHandlerCount(document)', '2');
+
+    div._ontouchend_ = null;
+    div._ontouchmove_ = null;
+    shouldBe('window.internals.touchEventHandlerCount(document)', '0');
+})();
+
+</script>
+</body>

Modified: trunk/Source/WebCore/ChangeLog (110447 => 110448)


--- trunk/Source/WebCore/ChangeLog	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/ChangeLog	2012-03-12 18:28:40 UTC (rev 110448)
@@ -1,3 +1,32 @@
+2012-03-12  Sadrul Habib Chowdhury  <[email protected]>
+
+        Touch event handler count is not updated when adding handlers to the window.
+        https://bugs.webkit.org/show_bug.cgi?id=80756
+
+        Touch event handlers added to the window needs to be included when counting the number of touch event
+        handlers. This makes touch event handler counting identical to wheel event handler counting.
+
+        Reviewed by Anders Carlsson.
+
+        Test: fast/events/touch/touch-handler-count.html
+
+        * dom/EventNames.h:
+        (EventNames):
+        (WebCore::EventNames::isTouchEventType):
+        * dom/Node.cpp:
+        (WebCore):
+        (WebCore::tryAddEventListener):
+        (WebCore::tryRemoveEventListener):
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::addEventListener):
+        (WebCore::DOMWindow::removeEventListener):
+        * testing/Internals.cpp:
+        (WebCore::Internals::touchEventHandlerCount):
+        (WebCore):
+        * testing/Internals.h:
+        (Internals):
+        * testing/Internals.idl:
+
 2012-03-12  Pavel Podivilov  <[email protected]>
 
         Web Inspector: extract ResourceScriptMapping from MainScriptMapping.

Modified: trunk/Source/WebCore/dom/EventNames.h (110447 => 110448)


--- trunk/Source/WebCore/dom/EventNames.h	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/dom/EventNames.h	2012-03-12 18:28:40 UTC (rev 110448)
@@ -231,6 +231,11 @@
         DOM_EVENT_INTERFACES_FOR_EACH(DOM_EVENT_INTERFACE_DECLARE)
         DOM_EVENT_TARGET_INTERFACES_FOR_EACH(DOM_EVENT_INTERFACE_DECLARE)
         #undef DOM_EVENT_INTERFACE_DECLARE
+
+        inline bool isTouchEventType(const AtomicString& eventType) const
+        {
+            return eventType == touchstartEvent || eventType == touchmoveEvent || eventType == touchendEvent || eventType == touchcancelEvent;
+        }
     };
 
     inline EventNames& eventNames()

Modified: trunk/Source/WebCore/dom/Node.cpp (110447 => 110448)


--- trunk/Source/WebCore/dom/Node.cpp	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/dom/Node.cpp	2012-03-12 18:28:40 UTC (rev 110448)
@@ -2467,11 +2467,6 @@
 }
 #endif
 
-static inline bool isTouchEventType(const AtomicString& eventType)
-{
-    return eventType == eventNames().touchstartEvent || eventType == eventNames().touchmoveEvent || eventType == eventNames().touchendEvent || eventType == eventNames().touchcancelEvent;
-}
-
 static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
 {
     if (!targetNode->EventTarget::addEventListener(eventType, listener, useCapture))
@@ -2481,7 +2476,7 @@
         document->addListenerTypeIfNeeded(eventType);
         if (eventType == eventNames().mousewheelEvent)
             document->didAddWheelEventHandler();
-        else if (isTouchEventType(eventType))
+        else if (eventNames().isTouchEventType(eventType))
             document->didAddTouchEventHandler();
     }
         
@@ -2532,7 +2527,7 @@
     if (Document* document = targetNode->document()) {
         if (eventType == eventNames().mousewheelEvent)
             document->didRemoveWheelEventHandler();
-        else if (isTouchEventType(eventType))
+        else if (eventNames().isTouchEventType(eventType))
             document->didRemoveTouchEventHandler();
     }
     

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (110447 => 110448)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2012-03-12 18:28:40 UTC (rev 110448)
@@ -1476,6 +1476,8 @@
         document->addListenerTypeIfNeeded(eventType);
         if (eventType == eventNames().mousewheelEvent)
             document->didAddWheelEventHandler();
+        else if (eventNames().isTouchEventType(eventType))
+            document->didAddTouchEventHandler();
     }
 
     if (eventType == eventNames().unloadEvent)
@@ -1503,6 +1505,8 @@
     if (Document* document = this->document()) {
         if (eventType == eventNames().mousewheelEvent)
             document->didRemoveWheelEventHandler();
+        else if (eventNames().isTouchEventType(eventType))
+            document->didRemoveTouchEventHandler();
     }
 
     if (eventType == eventNames().unloadEvent)

Modified: trunk/Source/WebCore/testing/Internals.cpp (110447 => 110448)


--- trunk/Source/WebCore/testing/Internals.cpp	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/testing/Internals.cpp	2012-03-12 18:28:40 UTC (rev 110448)
@@ -662,4 +662,14 @@
     return document->wheelEventHandlerCount();
 }
 
+unsigned Internals::touchEventHandlerCount(Document* document, ExceptionCode& ec)
+{
+    if (!document) {
+        ec = INVALID_ACCESS_ERR;
+        return 0;
+    }
+
+    return document->touchEventHandlerCount();
 }
+
+}

Modified: trunk/Source/WebCore/testing/Internals.h (110447 => 110448)


--- trunk/Source/WebCore/testing/Internals.h	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/testing/Internals.h	2012-03-12 18:28:40 UTC (rev 110448)
@@ -120,6 +120,7 @@
     bool shouldDisplayTrackKind(Document*, const String& kind, ExceptionCode&);
 
     unsigned wheelEventHandlerCount(Document*, ExceptionCode&);
+    unsigned touchEventHandlerCount(Document*, ExceptionCode&);
 
     static const char* internalsId;
 

Modified: trunk/Source/WebCore/testing/Internals.idl (110447 => 110448)


--- trunk/Source/WebCore/testing/Internals.idl	2012-03-12 18:02:58 UTC (rev 110447)
+++ trunk/Source/WebCore/testing/Internals.idl	2012-03-12 18:28:40 UTC (rev 110448)
@@ -96,6 +96,7 @@
         attribute [Custom] Array userPreferredLanguages;
 
         unsigned long wheelEventHandlerCount(in Document document) raises (DOMException);
+        unsigned long touchEventHandlerCount(in Document document) raises (DOMException);
 
         readonly attribute InternalSettings settings;
     };
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to