Commit 88dd2a89 authored by Tommy Steimel's avatar Tommy Steimel Committed by Commit Bot

Media Controls: Keep more overlay play button events in node

This CL undoes some of crrev.com/c/1067514, which kept fewer events in
node for the overlay play button to fix a menu issue. Instead of
allowing all non-play/pause-causing events through, we are only going
to allow non-play/pause-causing "click" events through. This keeps the
original issue fixed while also fixing a new issue where outer divs
could preventDefault on certain touch events to prevent the overlay
play button from receiving a "click" event.

Bug: 858846
Change-Id: I1c10e188529edd1219cee42ded5865442becb8f8
Reviewed-on: https://chromium-review.googlesource.com/1130826
Commit-Queue: Tommy Steimel <steimel@chromium.org>
Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#573896}
parent 7a295c6b
<!DOCTYPE html>
<html>
<title>Test that a div can't preventDefault on touches to prevent the overlay play button from working.</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../media-controls.js"></script>
<div id="outer">
<video controls width=500 preload=none src="../content/60_sec_video.webm"></video>
</div>
<script>
async_test(t => {
const video = document.querySelector('video');
const outerDiv = document.getElementById('outer');
video.addEventListener('loadedmetadata', t.step_func(() => {
singleTouchOnControl(mediaControlsOverlayPlayButton(video));
}), { once: true });
video.addEventListener('play', t.done.bind(t), { once: true });
['click', 'touchstart', 'touchmove', 'touchend'].forEach(name => {
outerDiv.addEventListener(name, evt => {
evt.preventDefault();
evt.stopPropagation();
});
});
video.load();
});
</script>
</html>
...@@ -521,6 +521,11 @@ function doubleTouchAtCoordinates(x, y, timeout, callback) { ...@@ -521,6 +521,11 @@ function doubleTouchAtCoordinates(x, y, timeout, callback) {
], callback); ], callback);
} }
function singleTouchOnControl(control, callback) {
const coordinates = elementCoordinates(control);
singleTouchAtCoordinates(coordinates[0], coordinates[1], callback);
}
function traverseNextNode(node, stayWithin) { function traverseNextNode(node, stayWithin) {
var nextNode = node.firstChild; var nextNode = node.firstChild;
if (nextNode) if (nextNode)
......
...@@ -266,7 +266,9 @@ void MediaControlOverlayPlayButtonElement::DefaultEventHandler(Event* event) { ...@@ -266,7 +266,9 @@ void MediaControlOverlayPlayButtonElement::DefaultEventHandler(Event* event) {
} }
bool MediaControlOverlayPlayButtonElement::KeepEventInNode(Event* event) { bool MediaControlOverlayPlayButtonElement::KeepEventInNode(Event* event) {
return ShouldCausePlayPause(event); return ShouldCausePlayPause(event) ||
(MediaControlElementsHelper::IsUserInteractionEvent(event) &&
event->type() != EventTypeNames::click);
} }
bool MediaControlOverlayPlayButtonElement::ShouldCausePlayPause( bool MediaControlOverlayPlayButtonElement::ShouldCausePlayPause(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment