Index: Source/core/html/shadow/SliderThumbElement.cpp |
diff --git a/Source/core/html/shadow/SliderThumbElement.cpp b/Source/core/html/shadow/SliderThumbElement.cpp |
index 39043fdfaee819c22262c81b6e86d99c67c3ac6c..d5071c2917bd75bc3acf827c3caf371f5e8038b1 100644 |
--- a/Source/core/html/shadow/SliderThumbElement.cpp |
+++ b/Source/core/html/shadow/SliderThumbElement.cpp |
@@ -62,6 +62,7 @@ inline static bool hasVerticalAppearance(HTMLInputElement* input) |
inline SliderThumbElement::SliderThumbElement(Document& document) |
: HTMLDivElement(document) |
, m_inDragMode(false) |
+ , m_didDragAnywhere(false) |
{ |
} |
@@ -169,6 +170,10 @@ void SliderThumbElement::setPositionFromPoint(const LayoutPoint& point) |
input->setValueFromRenderer(valueString); |
if (layoutObject()) |
layoutObject()->setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::SliderValueChanged); |
+ |
+ // We actually changed the value as part of a drag. |
+ if (m_inDragMode) |
+ m_didDragAnywhere = true; |
} |
void SliderThumbElement::startDragging() |
@@ -176,6 +181,7 @@ void SliderThumbElement::startDragging() |
if (LocalFrame* frame = document().frame()) { |
frame->eventHandler().setCapturingMouseEventsNode(this); |
m_inDragMode = true; |
+ m_didDragAnywhere = false; |
} |
} |
@@ -217,10 +223,19 @@ void SliderThumbElement::defaultEventHandler(Event* event) |
// MediaControlTimelineElement::defaultEventHandler() wants to handle these |
// mouse events. |
if (eventType == EventTypeNames::mousedown && isLeftButton) { |
+ |
+ m_mouseDownLocation = mouseEvent->absoluteLocation(); |
startDragging(); |
return; |
} else if (eventType == EventTypeNames::mouseup && isLeftButton) { |
+ if (m_inDragMode && !m_didDragAnywhere && isMediaSlider()) { |
+ // We got a down / up with no drag in between, and we're a media |
+ // slider. Jump to the touch down. |
+ setPositionFromPoint(m_mouseDownLocation); |
+ } |
+ |
stopDragging(); |
+ |
return; |
} else if (eventType == EventTypeNames::mousemove) { |
if (m_inDragMode) |
@@ -277,11 +292,11 @@ static const AtomicString& mediaSliderThumbShadowPartId() |
return mediaSliderThumb; |
} |
-const AtomicString& SliderThumbElement::shadowPseudoId() const |
+bool SliderThumbElement::isMediaSlider() const |
{ |
HTMLInputElement* input = hostInput(); |
if (!input || !input->layoutObject()) |
- return sliderThumbShadowPartId(); |
+ return false; |
const ComputedStyle& sliderStyle = input->layoutObject()->styleRef(); |
switch (sliderStyle.appearance()) { |
@@ -291,12 +306,19 @@ const AtomicString& SliderThumbElement::shadowPseudoId() const |
case MediaVolumeSliderThumbPart: |
case MediaFullScreenVolumeSliderPart: |
case MediaFullScreenVolumeSliderThumbPart: |
- return mediaSliderThumbShadowPartId(); |
+ return true; |
default: |
- return sliderThumbShadowPartId(); |
+ return false; |
} |
} |
+const AtomicString& SliderThumbElement::shadowPseudoId() const |
+{ |
+ if (isMediaSlider()) |
+ return mediaSliderThumbShadowPartId(); |
+ return sliderThumbShadowPartId(); |
+} |
+ |
// -------------------------------- |
inline SliderContainerElement::SliderContainerElement(Document& document) |