From be5f73b595b8fef0697bf83e9ebd13e85756c099 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: I7b1562b12c8ed1a0286c19ef9db8f76870d4f69e --- 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 d1cb41d6a0..433553ac8e 100644 --- a/resources/mediawiki/mediawiki.js +++ b/resources/mediawiki/mediawiki.js @@ -363,7 +363,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' }, @@ -393,7 +393,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 */ @@ -470,10 +472,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