diff --git a/src/js/_enqueues/vendor/mediaelement/mediaelement-and-player.js b/src/js/_enqueues/vendor/mediaelement/mediaelement-and-player.js index 26b951ec72bf5..e52b600dca28a 100644 --- a/src/js/_enqueues/vendor/mediaelement/mediaelement-and-player.js +++ b/src/js/_enqueues/vendor/mediaelement/mediaelement-and-player.js @@ -2625,7 +2625,12 @@ Object.assign(_player2.default.prototype, { label = _i18n2.default.t(_mejs2.default.language.codes[lang]) || lang; } - t.captionsButton.querySelector('ul').innerHTML += '
  • ' + ('') + ('') + '
  • '; + // The label comes from the track element's `label` attribute and is inserted + // as HTML below. Escape it so a label is always rendered as text rather than + // parsed as markup. + var labelText = ('' + label).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); + + t.captionsButton.querySelector('ul').innerHTML += '
  • ' + ('') + ('') + '
  • '; }, checkForTracks: function checkForTracks() { var t = this;