@@ -759,19 +759,38 @@ function visualizerLoadScripts() {
759759 return;
760760 }
761761 visualizerScriptsLoaded = true;
762+
763+ var promises = [];
762764 document.querySelectorAll("script[data-visualizer-script]").forEach(function(elem) {
763- jQuery.getScript( elem.getAttribute("data-visualizer-script") )
764- .done( function( script, textStatus ) {
765- elem.setAttribute("src", elem.getAttribute("data-visualizer-script"));
766- elem.removeAttribute("data-visualizer-script");
767- setTimeout( function() {
768- visualizerRefreshChart();
765+ var p = jQuery.getScript( elem.getAttribute("data-visualizer-script") )
766+ .done( function() {
767+ elem.setAttribute("src", elem.getAttribute("data-visualizer-script"));
768+ elem.removeAttribute("data-visualizer-script");
769769 } );
770- } );
770+ promises.push( p );
771771 });
772+
773+ // Wait for ALL scripts before refreshing so render-facade and the render
774+ // libraries (render-google, render-chartjs, etc.) are guaranteed to be ready.
775+ jQuery.when.apply( jQuery, promises ).always( function() {
776+ setTimeout( function() {
777+ visualizerRefreshChart();
778+ } );
779+ } );
772780 }
773781
774782 function visualizerRefreshChart() {
783+ // Re-trigger rendering for charts that render-facade queued but the render
784+ // library missed due to the parallel-load race condition.
785+ jQuery( '.viz-facade-loaded.visualizer-front:not(.visualizer-chart-loaded)' ).each( function() {
786+ var id = jQuery( this ).attr( 'id' );
787+ if ( id && window.visualizer ) {
788+ jQuery( 'body' ).trigger(
789+ 'visualizer:render:chart:start',
790+ jQuery.extend( {}, window.visualizer, { id: id } )
791+ );
792+ }
793+ } );
775794 jQuery( '.visualizer-front:not(.visualizer-chart-loaded)' ).resize();
776795 if ( jQuery( 'div.viz-facade-loaded:not(.visualizer-lazy):empty' ).length > 0 ) {
777796 visualizerUserInteractionEvents.forEach( function( event ) {
0 commit comments