summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/html/shadow/SliderThumbElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/html/shadow/SliderThumbElement.cpp')
-rw-r--r--Source/WebCore/html/shadow/SliderThumbElement.cpp114
1 files changed, 59 insertions, 55 deletions
diff --git a/Source/WebCore/html/shadow/SliderThumbElement.cpp b/Source/WebCore/html/shadow/SliderThumbElement.cpp
index e68ab00..6f4fedb 100644
--- a/Source/WebCore/html/shadow/SliderThumbElement.cpp
+++ b/Source/WebCore/html/shadow/SliderThumbElement.cpp
@@ -87,6 +87,39 @@ void RenderSliderThumb::layout()
RenderBlock::layout();
}
+#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
+class SliderTouchEventListener : public EventListener {
+public:
+ static PassRefPtr<SliderTouchEventListener> create(SliderThumbElement* slider)
+ {
+ return adoptRef(new SliderTouchEventListener(slider));
+ }
+ virtual bool operator==(const EventListener& other) {
+ return this == &other;
+ }
+ virtual void handleEvent(ScriptExecutionContext*, Event* event)
+ {
+ if (!event || !event->isTouchEvent())
+ return;
+ TouchEvent* touchEvent = static_cast<TouchEvent*>(event);
+ if (touchEvent->touches() && touchEvent->touches()->item(0)) {
+ IntPoint curPoint;
+ curPoint.setX(touchEvent->touches()->item(0)->pageX());
+ curPoint.setY(touchEvent->touches()->item(0)->pageY());
+ m_slider->setPositionFromPoint(curPoint);
+ touchEvent->setDefaultHandled();
+ touchEvent->setDefaultPrevented(true);
+ }
+ }
+private:
+ SliderTouchEventListener(SliderThumbElement* slider)
+ : EventListener(NativeEventListenerType)
+ , m_slider(slider)
+ {}
+ SliderThumbElement* m_slider;
+};
+#endif
+
void SliderThumbElement::setPositionFromValue()
{
// Since today the code to calculate position is in the RenderSlider layout
@@ -170,10 +203,6 @@ void SliderThumbElement::stopDragging()
if (Frame* frame = document()->frame())
frame->eventHandler()->setCapturingMouseEventsNode(0);
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- if (Frame* frame = document()->frame())
- frame->page()->mainFrame()->eventHandler()->setCapturingTouchEventsNode(0);
-#endif
m_inDragMode = false;
if (renderer())
renderer()->setNeedsLayout(true);
@@ -181,82 +210,57 @@ void SliderThumbElement::stopDragging()
void SliderThumbElement::defaultEventHandler(Event* event)
{
- if (!event->isMouseEvent()
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- && !event->isTouchEvent()
-#endif
- ) {
+ if (!event->isMouseEvent()) {
HTMLDivElement::defaultEventHandler(event);
return;
}
-
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- bool isLeftButton = false;
-
- if (event->isMouseEvent()) {
- MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
- isLeftButton = mouseEvent->button() == LeftButton;
- }
-#else
MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
bool isLeftButton = mouseEvent->button() == LeftButton;
-#endif
const AtomicString& eventType = event->type();
- if (eventType == eventNames().mousedownEvent && isLeftButton
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- || eventType == eventNames().touchstartEvent
-#endif
- ) {
+ if (eventType == eventNames().mousedownEvent && isLeftButton) {
startDragging();
return;
- } else if (eventType == eventNames().mouseupEvent && isLeftButton
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- || eventType == eventNames().touchendEvent
- || eventType == eventNames().touchcancelEvent
-#endif
- ) {
+ } else if (eventType == eventNames().mouseupEvent && isLeftButton) {
stopDragging();
return;
- } else if (eventType == eventNames().mousemoveEvent
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- || eventType == eventNames().touchmoveEvent
-#endif
- ) {
+ } else if (eventType == eventNames().mousemoveEvent) {
if (m_inDragMode)
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- {
- if (event->isMouseEvent()) {
- MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
-#endif
setPositionFromPoint(mouseEvent->absoluteLocation());
-#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
- } else if (event->isTouchEvent()) {
- TouchEvent* touchEvent = static_cast<TouchEvent*>(event);
- if (touchEvent->touches() && touchEvent->touches()->item(0)) {
- IntPoint curPoint;
- curPoint.setX(touchEvent->touches()->item(0)->pageX());
- curPoint.setY(touchEvent->touches()->item(0)->pageY());
- setPositionFromPoint(curPoint);
- // Tell the webview that webkit will handle the following move events
- event->setDefaultPrevented(true);
- }
- }
-
- }
-#endif
return;
}
HTMLDivElement::defaultEventHandler(event);
}
+#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
+void SliderThumbElement::attach()
+{
+ HTMLDivElement::attach();
+ // Add a touch event handler to ensure we get touch events.
+ if (!m_touchListener)
+ m_touchListener = SliderTouchEventListener::create(this);
+ addEventListener(eventNames().touchstartEvent,
+ m_touchListener, false);
+ addEventListener(eventNames().touchmoveEvent,
+ m_touchListener, false);
+}
+#endif
+
void SliderThumbElement::detach()
{
if (m_inDragMode) {
if (Frame* frame = document()->frame())
frame->eventHandler()->setCapturingMouseEventsNode(0);
}
+#if PLATFORM(ANDROID) && ENABLE(TOUCH_EVENTS)
+ if (m_touchListener) {
+ removeEventListener(eventNames().touchstartEvent,
+ m_touchListener.get(), false);
+ removeEventListener(eventNames().touchmoveEvent,
+ m_touchListener.get(), false);
+ }
+#endif
HTMLDivElement::detach();
}