diff --git a/README.md b/README.md index d1f8637..60b2c30 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ caching time of 12 hours obviously makes no sense. * Migrated AJAX to REST API * Resolved Javascript compatibility issues with IE11 * Added optional shortcode support for tick content +* Support embedded JavaScript execution in tick content (e.g. for social media integrations) ### 1.1.1 - 2021-03-20 diff --git a/scripts/liveticker.js b/scripts/liveticker.js index cd9f7c2..1df5c38 100644 --- a/scripts/liveticker.js +++ b/scripts/liveticker.js @@ -169,15 +169,37 @@ var content = document.createElement( 'div' ); var cls = t.isWidget ? 'sclt-widget' : 'sclt-tick'; var old; + var scripts = []; - li.id = 'sclt-' + t.id + '-' + u.id; - li.classList.add( cls ); time.classList.add( cls + '-time' ); time.innerText = u.modified_rendered; title.classList.add( cls + '-title' ); title.innerText = u.title.rendered; content.classList.add( cls + '-content' ); content.innerHTML = u.content.rendered; + + // Process embedded scripts, if any. + Array.prototype.forEach.call( + content.getElementsByTagName( 'script' ), + function( script ) { + var script2; + if ( script.src ) { + // Move referenced scripts to page head. + script.parentNode.removeChild( script ); + script2 = document.createElement( 'script' ); + Array.prototype.forEach.call( script.attributes, function( a ) { + script2.setAttribute( a.nodeName, a.nodeValue ); + } ); + document.head.appendChild( script2 ); + } else { + scripts.push( script ); + } + } + ); + + // Create the actual tick element. + li.id = 'sclt-' + t.id + '-' + u.id; + li.classList.add( cls ); li.appendChild( time ); li.appendChild( title ); li.appendChild( content ); @@ -203,6 +225,19 @@ } ); } + + // Evaluate embedded inline scripts. + + // Directly evaluate script otherwise. + scripts.forEach( function( script ) { + try { + // eslint-disable-next-line no-eval + eval( script.innerHTML ); + } catch ( e ) { + // eslint-disable-next-line no-console + console.warn( 'Failed to evaluate embedded script.' ); + } + } ); }; document.addEventListener(