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
- trunk/LayoutTests/ChangeLog
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/dom/EventNames.h
- trunk/Source/WebCore/dom/Node.cpp
- trunk/Source/WebCore/page/DOMWindow.cpp
- trunk/Source/WebCore/testing/Internals.cpp
- trunk/Source/WebCore/testing/Internals.h
- trunk/Source/WebCore/testing/Internals.idl
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
