summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/dom
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom')
-rw-r--r--Source/WebCore/dom/Event.h4
-rw-r--r--Source/WebCore/dom/EventTarget.cpp15
-rw-r--r--Source/WebCore/dom/TouchEvent.cpp6
-rw-r--r--Source/WebCore/dom/TouchEvent.h9
4 files changed, 34 insertions, 0 deletions
diff --git a/Source/WebCore/dom/Event.h b/Source/WebCore/dom/Event.h
index f6e5586..e913745 100644
--- a/Source/WebCore/dom/Event.h
+++ b/Source/WebCore/dom/Event.h
@@ -136,6 +136,10 @@ namespace WebCore {
virtual bool isErrorEvent() const;
#if ENABLE(TOUCH_EVENTS)
virtual bool isTouchEvent() const;
+#if PLATFORM(ANDROID)
+ virtual bool hitTouchHandler() const { return false; }
+ virtual void setHitTouchHandler() { }
+#endif
#endif
#if ENABLE(DEVICE_ORIENTATION)
virtual bool isDeviceMotionEvent() const;
diff --git a/Source/WebCore/dom/EventTarget.cpp b/Source/WebCore/dom/EventTarget.cpp
index d84d66b..c9cece2 100644
--- a/Source/WebCore/dom/EventTarget.cpp
+++ b/Source/WebCore/dom/EventTarget.cpp
@@ -326,6 +326,16 @@ bool EventTarget::fireEventListeners(Event* event)
EventListenerMap::iterator result = d->eventListenerMap.find(event->type());
if (result != d->eventListenerMap.end())
fireEventListeners(event, d, *result->second);
+
+#if ENABLE(TOUCH_EVENTS) && PLATFORM(ANDROID)
+ if (event->isTouchEvent() && !event->hitTouchHandler()) {
+ // Check for touchmove or touchend to see if we can skip
+ // the rest of the stream (we always get touchstart, don't need to check that)
+ if (d->eventListenerMap.contains(eventNames().touchmoveEvent)
+ || d->eventListenerMap.contains(eventNames().touchendEvent))
+ event->setHitTouchHandler();
+ }
+#endif
return !event->defaultPrevented();
}
@@ -334,6 +344,11 @@ void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
{
RefPtr<EventTarget> protect = this;
+#if ENABLE(TOUCH_EVENTS) && PLATFORM(ANDROID)
+ if (event->isTouchEvent())
+ event->setHitTouchHandler();
+#endif
+
// Fire all listeners registered for this event. Don't fire listeners removed
// during event dispatch. Also, don't fire event listeners added during event
// dispatch. Conveniently, all new event listeners will be added after 'end',
diff --git a/Source/WebCore/dom/TouchEvent.cpp b/Source/WebCore/dom/TouchEvent.cpp
index 225e3ae..bd1577d 100644
--- a/Source/WebCore/dom/TouchEvent.cpp
+++ b/Source/WebCore/dom/TouchEvent.cpp
@@ -33,6 +33,9 @@ namespace WebCore {
TouchEvent::TouchEvent()
{
+#if PLATFORM(ANDROID)
+ m_hitTouchHandler = false;
+#endif
}
TouchEvent::TouchEvent(TouchList* touches, TouchList* targetTouches,
@@ -45,6 +48,9 @@ TouchEvent::TouchEvent(TouchList* touches, TouchList* targetTouches,
, m_targetTouches(targetTouches)
, m_changedTouches(changedTouches)
{
+#if PLATFORM(ANDROID)
+ m_hitTouchHandler = false;
+#endif
}
TouchEvent::~TouchEvent()
diff --git a/Source/WebCore/dom/TouchEvent.h b/Source/WebCore/dom/TouchEvent.h
index 1514cf8..fba613f 100644
--- a/Source/WebCore/dom/TouchEvent.h
+++ b/Source/WebCore/dom/TouchEvent.h
@@ -62,6 +62,11 @@ public:
TouchList* targetTouches() const { return m_targetTouches.get(); }
TouchList* changedTouches() const { return m_changedTouches.get(); }
+#if PLATFORM(ANDROID)
+ virtual bool hitTouchHandler() const { return m_hitTouchHandler; }
+ virtual void setHitTouchHandler() { m_hitTouchHandler = true; }
+#endif
+
private:
TouchEvent();
TouchEvent(TouchList* touches, TouchList* targetTouches,
@@ -72,6 +77,10 @@ private:
virtual bool isTouchEvent() const { return true; }
+#if PLATFORM(ANDROID)
+ bool m_hitTouchHandler;
+#endif
+
RefPtr<TouchList> m_touches;
RefPtr<TouchList> m_targetTouches;
RefPtr<TouchList> m_changedTouches;