diff --git a/src/engine-scripts/puppet/jsReady.js b/src/engine-scripts/puppet/jsReady.js new file mode 100644 index 00000000..b904dd73 --- /dev/null +++ b/src/engine-scripts/puppet/jsReady.js @@ -0,0 +1,40 @@ +module.exports = async (page) => { + await page.emulateMediaFeatures([ + { name: 'prefers-reduced-motion', value: 'reduce' }, + ]); + await page.evaluate( async () => { + const skin = mw.config.get( 'skin' ); + let moduleName; + switch( skin ) { + case 'vector-2022': + moduleName = 'skins.vector.js'; + break; + case 'vector': + moduleName = 'skins.vector.legacy.js'; + break; + default: + return true; + } + + // Poll the state of the module until it is ready. + await new Promise((resolve) => { + const id = setInterval(() => { + if ( mw.loader.getState( moduleName ) === 'ready' ) { + clearInterval( id ); + resolve(true); + } + }, 500 ); + }); + + // Wait until the next frame before resolving. collapsibleTabs.js in Vector + // and Vector-2022 make use of rAF. + return new Promise( resolve => { + requestAnimationFrame( () => { + requestAnimationFrame( () => { + resolve(); + } ); + } ); + } ); + + }); +}; diff --git a/src/engine-scripts/puppet/onReady.js b/src/engine-scripts/puppet/onReady.js index c61c555f..3353a72b 100644 --- a/src/engine-scripts/puppet/onReady.js +++ b/src/engine-scripts/puppet/onReady.js @@ -9,5 +9,8 @@ module.exports = async (page, scenario, vp) => { await require('./sidebarState')(page, hashtags); await require('./userMenuState')(page, hashtags); } + + // Make sure the main skin JavaScript module has loaded. + await require('./jsReady')(page); // add more ready handlers here... };