diff options
Diffstat (limited to 'Source/WebCore/dom')
-rw-r--r-- | Source/WebCore/dom/Event.h | 4 | ||||
-rw-r--r-- | Source/WebCore/dom/EventTarget.cpp | 15 | ||||
-rw-r--r-- | Source/WebCore/dom/TouchEvent.cpp | 6 | ||||
-rw-r--r-- | Source/WebCore/dom/TouchEvent.h | 9 |
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; |