diff --git a/index.js b/index.js index 2b74358..2b0e87b 100644 --- a/index.js +++ b/index.js @@ -149,7 +149,9 @@ function pause(forceEvents) { if (!player.hasAudio) { dispatchEventAsync(video, 'pause'); } - if (video.ended) { + + // Handle the 'ended' event only if it's not fullscreen + if (video.ended && !video.webkitDisplayingFullscreen) { video[ಠevent] = true; dispatchEventAsync(video, 'ended'); } @@ -245,6 +247,12 @@ function addPlayer(video, hasAudio) { } } +function preventWithPropOrFullscreen(el) { + const isAllowed = el[ಠevent]; + delete el[ಠevent]; + return !el.webkitDisplayingFullscreen && !isAllowed; +} + function overloadAPI(video) { const player = video[ಠ]; video[ಠplay] = video.play; @@ -256,10 +264,17 @@ function overloadAPI(video) { proxyProperty(video, 'playbackRate', player.driver, true); proxyProperty(video, 'ended', player.driver); proxyProperty(video, 'loop', player.driver, true); - preventEvent(video, 'seeking'); - preventEvent(video, 'seeked'); - preventEvent(video, 'timeupdate', ಠevent, false); - preventEvent(video, 'ended', ಠevent, false); // Prevent occasional native ended events + + // IIV works by seeking 60 times per second. + // These events are now useless. + preventEvent(video, 'seeking', el => !el.webkitDisplayingFullscreen); + preventEvent(video, 'seeked', el => !el.webkitDisplayingFullscreen); + + // Limit timeupdate events + preventEvent(video, 'timeupdate', preventWithPropOrFullscreen); + + // Prevent occasional native ended events + preventEvent(video, 'ended', preventWithPropOrFullscreen); } export default function enableInlineVideo(video, opts = {}) { diff --git a/lib/prevent-event.js b/lib/prevent-event.js index 488db47..d9162a1 100644 --- a/lib/prevent-event.js +++ b/lib/prevent-event.js @@ -1,12 +1,11 @@ -export default function preventEvent(element, eventName, toggleProperty, preventWithProperty) { +export default function preventEvent(element, eventName, test) { function handler(e) { - if (Boolean(element[toggleProperty]) === Boolean(preventWithProperty)) { + if (!test || test(element, eventName)) { e.stopImmediatePropagation(); // // console.log(eventName, 'prevented on', element); } - delete element[toggleProperty]; } - element.addEventListener(eventName, handler, false); + element.addEventListener(eventName, handler); // Return handler to allow to disable the prevention. Usage: // const preventionHandler = preventEvent(el, 'click');