From c84f666b55ffa63799746096be5d17e6eb425196 Mon Sep 17 00:00:00 2001 From: Albin Larsson Date: Wed, 27 Sep 2017 00:24:54 +0200 Subject: [PATCH 1/3] Fix 'TypeError: Cannot read property 'kind' of null' in captions feature detection if video lacks captions --- src/js/plyr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/plyr.js b/src/js/plyr.js index db17ad00..ebf0d444 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -2448,7 +2448,7 @@ }); // Check if suported kind - var supported = utils.inArray(['captions', 'subtitles'], player.captions.currentTrack.kind); + var supported = utils.inArray(['captions', 'subtitles'], player.captions.currentTrack && player.captions.currentTrack.kind); if (utils.is.track(player.captions.currentTrack) && supported) { utils.on(player.captions.currentTrack, 'cuechange', setActiveCue); From ec091266aa1cc39a59ecd8436afd8a3304990607 Mon Sep 17 00:00:00 2001 From: Albin Larsson Date: Wed, 27 Sep 2017 02:34:23 +0200 Subject: [PATCH 2/3] Prevent buttons from submitting form --- src/js/plyr.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/js/plyr.js b/src/js/plyr.js index ebf0d444..ae1755a0 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -1511,6 +1511,10 @@ attributes = {}; } + if (!('type' in attributes)) { + attributes.type = 'button'; + } + if ('class' in attributes) { if (attributes.class.indexOf(player.config.classNames.control) === -1) { attributes.class += ' ' + player.config.classNames.control; From ebd13c63e872063b7e2aa24526499b5ee0209cfc Mon Sep 17 00:00:00 2001 From: Albin Larsson Date: Wed, 27 Sep 2017 05:09:56 +0200 Subject: [PATCH 3/3] Avoid multiple errors when initiating plyr without 'settings' in controls --- src/js/plyr.js | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/js/plyr.js b/src/js/plyr.js index ebf0d444..eae31494 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -1948,7 +1948,9 @@ player.elements.controls = controls; //setLoopMenu(); - setSpeedMenu(); + if (utils.inArray(player.config.controls, 'settings') && utils.inArray(player.config.settings, 'speed')) { + setSpeedMenu(); + } return controls; } @@ -2101,6 +2103,7 @@ // Update the selected setting function updateSetting(setting, list) { + var pane = player.elements.settings.panes[setting]; var value = null; switch (setting) { @@ -2131,11 +2134,11 @@ // Get the list if we need to if (!utils.is.htmlElement(list)) { - list = player.elements.settings.panes[setting].querySelector('ul'); + list = pane && pane.querySelector('ul'); } // Find the radio option - var target = list.querySelector('input[value="' + value + '"]'); + var target = list && list.querySelector('input[value="' + value + '"]'); if (!utils.is.htmlElement(target)) { return; @@ -2367,7 +2370,9 @@ player.captions.tracks = null; // Clear menu and hide - setCaptionsMenu(); + if (utils.inArray(player.config.controls, 'settings') && utils.inArray(player.config.settings, 'captions')) { + setCaptionsMenu(); + } return; } @@ -2463,7 +2468,9 @@ } // Set available languages in list - setCaptionsMenu(); + if (utils.inArray(player.config.controls, 'settings') && utils.inArray(player.config.settings, 'captions')) { + setCaptionsMenu(); + } } // Get current selected caption language @@ -3050,7 +3057,9 @@ player.media.muted = instance.isMuted(); // Get available speeds - setSpeedMenu(instance.getAvailablePlaybackRates(), instance.getPlaybackRate()); + if (utils.inArray(player.config.controls, 'settings') && utils.inArray(player.config.settings, 'speed')) { + setSpeedMenu(instance.getAvailablePlaybackRates(), instance.getPlaybackRate()); + } // Set title player.config.title = instance.getVideoData().title; @@ -3376,10 +3385,10 @@ function toggleMenu(event) { var form = player.elements.settings.form; var button = player.elements.buttons.settings; - var show = utils.is.boolean(event) ? event : form.getAttribute('aria-hidden') === 'true'; + var show = utils.is.boolean(event) ? event : (form && form.getAttribute('aria-hidden') === 'true'); if (utils.is.event(event)) { - var isMenuItem = form.contains(event.target); + var isMenuItem = form && form.contains(event.target); var isButton = event.target === player.elements.buttons.settings; // If the click was inside the form or if the click @@ -3396,13 +3405,16 @@ } // Set form and button attributes - form.setAttribute('aria-hidden', !show); - button.setAttribute('aria-expanded', show); - - if (show) { - form.removeAttribute('tabindex'); - } else { - form.setAttribute('tabindex', -1); + if (button) { + button.setAttribute('aria-expanded', show); + } + if (form) { + form.setAttribute('aria-hidden', !show); + if (show) { + form.removeAttribute('tabindex'); + } else { + form.setAttribute('tabindex', -1); + } } } @@ -5579,7 +5591,9 @@ // Trigger event and close menu if (toggled) { player.core.trigger(player.media, 'controlshidden'); - player.core.toggleMenu(false); + if (utils.inArray(player.config.controls, 'settings') && !utils.is.empty(player.config.settings)) { + player.core.toggleMenu(false); + } } }, delay); }