From 97c2c66cc167e9fd34bffe8882b91b99aac2102e Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Fri, 29 Mar 2013 21:09:06 +0100 Subject: [PATCH] mw.loader: Fix regression that caused CSS load after scripts. Follows-up 705d50c which introduced cssText buffer (yielding one tick of the event queue to reduce the number of forced repaints). However since that made CSS loading asynchronoous (be it only for a split second) it caused some nasty side-effects. This was also reflected in the unit tests that had to resort to doing setTimeout from within the mw.loader implemented script to assert the styles. This is now sane again: Scripts execute after styles are inserted. Bug: 46401 Change-Id: Ib54a3e78710b7f798c6730d3f540d3284001e2de --- resources/mediawiki/mediawiki.js | 143 ++++++++++++------ .../resources/mediawiki/mediawiki.test.js | 42 +++-- 2 files changed, 113 insertions(+), 72 deletions(-) diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js index 0da9d875d8..6c7e697889 100644 --- a/resources/mediawiki/mediawiki.js +++ b/resources/mediawiki/mediawiki.js @@ -362,7 +362,7 @@ var mw = ( function ( $, undefined ) { * 'dependencies': ['required.foo', 'bar.also', ...], (or) function () {} * 'group': 'somegroup', (or) null, * 'source': 'local', 'someforeignwiki', (or) null - * 'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing' + * 'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing' * 'script': ..., * 'style': ..., * 'messages': { 'key': 'value' }, @@ -392,7 +392,9 @@ var mw = ( function ( $, undefined ) { // Selector cache for the marker element. Use getMarker() to get/use the marker! $marker = null, // Buffer for addEmbeddedCSS. - cssBuffer = ''; + cssBuffer = '', + // Callbacks for addEmbeddedCSS. + cssCallbacks = $.Callbacks(); /* Private methods */ @@ -469,10 +471,15 @@ var mw = ( function ( $, undefined ) { /** * @param {string} [cssText=cssBuffer] If called without cssText, * the internal buffer will be inserted instead. + * @param {Function} [callback] */ - function addEmbeddedCSS( cssText ) { + function addEmbeddedCSS( cssText, callback ) { var $style, styleEl; + if ( callback ) { + cssCallbacks.add( callback ); + } + // Yield once before inserting the