aboutsummaryrefslogtreecommitdiffstats
path: root/src/js/listeners.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/listeners.js')
-rw-r--r--src/js/listeners.js82
1 files changed, 51 insertions, 31 deletions
diff --git a/src/js/listeners.js b/src/js/listeners.js
index f5c9cda8..cd468083 100644
--- a/src/js/listeners.js
+++ b/src/js/listeners.js
@@ -6,9 +6,10 @@ import controls from './controls';
import ui from './ui';
import { repaint } from './utils/animation';
import browser from './utils/browser';
-import { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';
+import { getElement, getElements, matches, toggleClass } from './utils/elements';
import { off, on, once, toggleListener, triggerEvent } from './utils/events';
import is from './utils/is';
+import { silencePromise } from './utils/promise';
import { getAspectRatio, setAspectRatio } from './utils/style';
class Listeners {
@@ -99,7 +100,7 @@ class Listeners {
case 75:
// Space and K key
if (!repeat) {
- player.togglePlay();
+ silencePromise(player.togglePlay());
}
break;
@@ -301,14 +302,6 @@ class Listeners {
},
);
- // Force edge to repaint on exit fullscreen
- // TODO: Fix weird bug where Edge doesn't re-draw when exiting fullscreen
- /* if (browser.isEdge) {
- on.call(player, elements.container, 'exitfullscreen', () => {
- setTimeout(() => repaint(elements.container), 100);
- });
- } */
-
// Set a gutter for Vimeo
const setGutter = (ratio, padding, toggle) => {
if (!player.isVimeo) {
@@ -344,8 +337,13 @@ class Listeners {
on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {
const { target, usingNative } = player.fullscreen;
- // Ignore for iOS native
- if (!player.isEmbed || target !== elements.container) {
+ // Ignore events not from target
+ if (target !== elements.container) {
+ return;
+ }
+
+ // If it's not an embed and no ratio specified
+ if (!player.isEmbed && is.empty(player.config.ratio)) {
return;
}
@@ -380,19 +378,15 @@ class Listeners {
controls.durationUpdate.call(player, event),
);
- // Check for audio tracks on load
- // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
- on.call(player, player.media, 'canplay loadeddata', () => {
- toggleHidden(elements.volume, !player.hasAudio);
- toggleHidden(elements.buttons.mute, !player.hasAudio);
- });
-
// Handle the media finishing
on.call(player, player.media, 'ended', () => {
// Show poster on end
if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
// Restart
player.restart();
+
+ // Call pause otherwise IE11 will start playing the video again
+ player.pause();
}
});
@@ -438,9 +432,21 @@ class Listeners {
if (player.ended) {
this.proxy(event, player.restart, 'restart');
- this.proxy(event, player.play, 'play');
+ this.proxy(
+ event,
+ () => {
+ silencePromise(player.play());
+ },
+ 'play',
+ );
} else {
- this.proxy(event, player.togglePlay, 'play');
+ this.proxy(
+ event,
+ () => {
+ silencePromise(player.togglePlay());
+ },
+ 'play',
+ );
}
});
}
@@ -516,7 +522,7 @@ class Listeners {
}
// Only call default handler if not prevented in custom handler
- if (returned && is.function(defaultHandler)) {
+ if (returned !== false && is.function(defaultHandler)) {
defaultHandler.call(player, event);
}
}
@@ -546,7 +552,14 @@ class Listeners {
// Play/pause toggle
if (elements.buttons.play) {
Array.from(elements.buttons.play).forEach(button => {
- this.bind(button, 'click', player.togglePlay, 'play');
+ this.bind(
+ button,
+ 'click',
+ () => {
+ silencePromise(player.togglePlay());
+ },
+ 'play',
+ );
});
}
@@ -606,12 +619,19 @@ class Listeners {
this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');
// Settings menu - click toggle
- this.bind(elements.buttons.settings, 'click', event => {
- // Prevent the document click listener closing the menu
- event.stopPropagation();
+ this.bind(
+ elements.buttons.settings,
+ 'click',
+ event => {
+ // Prevent the document click listener closing the menu
+ event.stopPropagation();
+ event.preventDefault();
- controls.toggleMenu.call(player, event);
- });
+ controls.toggleMenu.call(player, event);
+ },
+ null,
+ false,
+ ); // Can't be passive as we're preventing default
// Settings menu - keyboard toggle
// We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
@@ -666,7 +686,7 @@ class Listeners {
const code = event.keyCode ? event.keyCode : event.which;
const attribute = 'play-on-seeked';
- if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {
+ if (is.keyboardEvent(event) && code !== 39 && code !== 37) {
return;
}
@@ -681,7 +701,7 @@ class Listeners {
// If we're done seeking and it was playing, resume playback
if (play && done) {
seek.removeAttribute(attribute);
- player.play();
+ silencePromise(player.play());
} else if (!done && player.playing) {
seek.setAttribute(attribute, '');
player.pause();
@@ -732,7 +752,7 @@ class Listeners {
});
// Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
- this.bind(elements.progress, 'mouseleave click', () => {
+ this.bind(elements.progress, 'mouseleave touchend click', () => {
const { previewThumbnails } = player;
if (previewThumbnails && previewThumbnails.loaded) {