Merge "resourceloader: Jobs created in request() should wait for executing modules"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 15 Sep 2015 14:03:31 +0000 (14:03 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 15 Sep 2015 14:03:31 +0000 (14:03 +0000)
resources/src/mediawiki/mediawiki.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js

index af89b9a..122e512 100644 (file)
                                // Add ready and error callbacks if they were given
                                if ( ready !== undefined || error !== undefined ) {
                                        jobs.push( {
+                                               // Narrow down the list to modules that are worth waiting for
                                                dependencies: $.grep( dependencies, function ( module ) {
                                                        var state = mw.loader.getState( module );
-                                                       return state === 'registered' || state === 'loaded' || state === 'loading';
+                                                       return state === 'registered' || state === 'loaded' || state === 'loading' || state === 'executing';
                                                } ),
                                                ready: ready,
                                                error: error
index 86c2eb8..b55b1e7 100644 (file)
                mw.loader.load( target );
        } );
 
+       QUnit.asyncTest( 'mw.loader() executing race (T112232)', 2, function ( assert ) {
+               var done = false;
+
+               // The red herring schedules its CSS buffer first. In T112232, a bug in the
+               // state machine would cause the job for testRaceLoadMe to run with an earlier job.
+               mw.loader.implement(
+                       'testRaceRedHerring',
+                       function () {},
+                       { css: [ '.mw-testRaceRedHerring {}' ] }
+               );
+               mw.loader.implement(
+                       'testRaceLoadMe',
+                       function () {
+                               done = true;
+                       },
+                       { css: [ '.mw-testRaceLoadMe { float: left; }' ] }
+               );
+
+               mw.loader.load( [ 'testRaceRedHerring', 'testRaceLoadMe' ] );
+               mw.loader.using( 'testRaceLoadMe', function () {
+                       assert.strictEqual( done, true, 'script ran' );
+                       assert.strictEqual( mw.loader.getState( 'testRaceLoadMe' ), 'ready', 'state' );
+               } ).always( QUnit.start );
+       } );
+
        QUnit.test( 'mw.html', 13, function ( assert ) {
                assert.throws( function () {
                        mw.html.escape();