Chromium Code Reviews| Index: Source/core/html/shadow/MediaControls.cpp |
| diff --git a/Source/core/html/shadow/MediaControls.cpp b/Source/core/html/shadow/MediaControls.cpp |
| index 2f827bd203aee4f1c7007dc251071ed56f3c3b56..d107aacd99ae3690ac50f86513ebe1513ca1990b 100644 |
| --- a/Source/core/html/shadow/MediaControls.cpp |
| +++ b/Source/core/html/shadow/MediaControls.cpp |
| @@ -360,6 +360,11 @@ void MediaControls::textTracksChanged() |
| refreshClosedCaptionsButtonVisibility(); |
| } |
| +void MediaControls::timelineKnobDragged() |
| +{ |
| + resetHideMediaControlsTimer(); |
| +} |
| + |
| static Element* elementFromCenter(Element& element) |
| { |
| RefPtrWillBeRawPtr<ClientRect> clientRect = element.getBoundingClientRect(); |
| @@ -435,6 +440,17 @@ void MediaControls::stoppedCasting() |
| m_overlayCastButton->setIsPlayingRemotely(false); |
| } |
| +bool MediaControls::isInactiveElement(Node* node) const |
|
philipj_slow
2015/02/16 10:45:19
If isn't mate moot by other changes, would willRes
|
| +{ |
| + if (node == m_mediaElement |
| + || node == m_textDisplayContainer |
| + || node == m_overlayEnclosure |
| + || node == m_enclosure) |
| + return true; |
| + |
| + return false; |
| +} |
| + |
| void MediaControls::defaultEventHandler(Event* event) |
| { |
| HTMLDivElement::defaultEventHandler(event); |
| @@ -443,11 +459,40 @@ void MediaControls::defaultEventHandler(Event* event) |
| // to allow the hide-timer to do the right thing when it fires. |
| // FIXME: Preferably we would only do this when we're actually handling the event |
| // here ourselves. |
| + bool mouseIsSynthetic = event->isMouseEvent() && toMouseEvent(event)->fromTouch(); |
|
philipj_slow
2015/02/16 10:45:19
Perhaps isMouseEventFromTouch will make sound less
|
| bool wasLastEventTouch = event->isTouchEvent() || event->isGestureEvent() |
|
philipj_slow
2015/02/16 10:45:18
I just renamed this, but actually isTouchEvent wou
|
| - || (event->isMouseEvent() && toMouseEvent(event)->fromTouch()); |
| + || mouseIsSynthetic; |
| + |
| m_hideTimerBehaviorFlags |= wasLastEventTouch ? IgnoreControlsHover : IgnoreNone; |
| - if (event->type() == EventTypeNames::mouseover) { |
| + // Separate tap gestures from mouse clicks unless the tap |
| + // is intended for an input element like a button. |
| + if (event->type() == EventTypeNames::gesturetap) { |
|
philipj_slow
2015/02/16 10:45:19
Did you first try using the touchstart and click e
Tima Vaisburd
2015/02/16 20:32:11
No, I must admit I haven't tried the touchstart ev
philipj_slow
2015/02/17 02:37:24
Overriding Node::willRespondToTouchEvents() ought
Tima Vaisburd
2015/02/19 19:32:28
I was wrong: whether touch events propagate or not
|
| + Node * targetNode = event->target() ? event->target()->toNode() : nullptr; |
| + if (!targetNode || isInactiveElement(targetNode)) { |
| + // Do not generate mouse events from this tap, |
| + // otherwise a tap to show controls might also |
| + // trigger some unexpected action like stop or seek. |
| + event->preventDefault(); |
|
philipj_slow
2015/02/16 10:45:19
This will be observable to Web content. An alterna
|
| + |
| + if (!m_panel->isOpaque()) { |
| + makeOpaque(); |
| + startHideMediaControlsTimer(); |
| + // Prevent immediate hiding by playbackProgressed() |
| + m_isMouseOverControls = true; |
|
philipj_slow
2015/02/16 10:45:19
This seems like an abuse of this state variable, a
|
| + } else { |
| + stopHideMediaControlsTimer(); |
| + makeTransparent(); |
| + } |
| + } else { |
| + // Prevent the controls from disappearing while we are working with them |
| + if (m_panel->isOpaque()) |
| + resetHideMediaControlsTimer(); |
| + } |
| + return; |
| + } |
| + |
| + if (event->type() == EventTypeNames::mouseover && !mouseIsSynthetic) { |
| if (!containsRelatedTarget(event)) { |
| m_isMouseOverControls = true; |
| if (!mediaElement().togglePlayStateWillPlay()) { |
| @@ -459,7 +504,7 @@ void MediaControls::defaultEventHandler(Event* event) |
| return; |
| } |
| - if (event->type() == EventTypeNames::mouseout) { |
| + if (event->type() == EventTypeNames::mouseout && !mouseIsSynthetic) { |
| if (!containsRelatedTarget(event)) { |
| m_isMouseOverControls = false; |
| stopHideMediaControlsTimer(); |
| @@ -467,7 +512,7 @@ void MediaControls::defaultEventHandler(Event* event) |
| return; |
| } |
| - if (event->type() == EventTypeNames::mousemove) { |
| + if (event->type() == EventTypeNames::mousemove && !mouseIsSynthetic) { |
| // When we get a mouse move, show the media controls, and start a timer |
| // that will hide the media controls after a 3 seconds without a mouse move. |
| makeOpaque(); |