Krinkle has uploaded a new change for review.
https://gerrit.wikimedia.org/r/322150
Change subject: mw.loader: For using() errors, reject Promise instead of
throwing
......................................................................
mw.loader: For using() errors, reject Promise instead of throwing
The "Unknown module" and "Circular dependency" errors both come from the
resolve() function. Add a try/catch around that and reject the promise
if caught.
Bug: T131612
Change-Id: I900909cd00df6a51f3bf1f3df91bdb610c11c446
---
M resources/src/mediawiki/mediawiki.js
M tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
2 files changed, 51 insertions(+), 13 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/50/322150/1
diff --git a/resources/src/mediawiki/mediawiki.js
b/resources/src/mediawiki/mediawiki.js
index 4dce192..dd3d6de 100644
--- a/resources/src/mediawiki/mediawiki.js
+++ b/resources/src/mediawiki/mediawiki.js
@@ -1168,6 +1168,7 @@
* @private
* @param {string[]} modules Array of string module
names
* @return {Array} List of dependencies, including
'module'.
+ * @throws {Error} If an unregistered module or a
dependency loop is encountered
*/
function resolve( modules ) {
var resolved = [];
@@ -1993,8 +1994,12 @@
deferred.fail( error );
}
- // Resolve entire dependency map
- dependencies = resolve( dependencies );
+ try {
+ // Resolve entire dependency map
+ dependencies = resolve(
dependencies );
+ } catch ( e ) {
+ return deferred.reject( e
).promise();
+ }
if ( allReady( dependencies ) ) {
// Run ready immediately
deferred.resolve(
mw.loader.require );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
index 505d9a1..6d24e6e 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
@@ -134,6 +134,50 @@
} );
} );
+ QUnit.test( '.using() Error: Circular dependency', function ( assert ) {
+ mw.loader.register( [
+ [ 'test.circle1', '0', [ 'test.circle2' ] ],
+ [ 'test.circle2', '0', [ 'test.circle3' ] ],
+ [ 'test.circle3', '0', [ 'test.circle1' ] ]
+ ] );
+ mw.loader.using( 'test.circle3' ).then(
+ function done() {
+ assert.ok( false, 'Unexpected resolution,
expected error.' );
+ },
+ function fail( e ) {
+ assert.ok( /Circular/.test( String( e ) ),
'Detect circular dependency' );
+ }
+ );
+ } );
+
+ QUnit.test( '.load() - Error: Circular dependency', function ( assert )
{
+ mw.loader.register( [
+ [ 'test.circleA', '0', [ 'test.circleB' ] ],
+ [ 'test.circleB', '0', [ 'test.circleC' ] ],
+ [ 'test.circleC', '0', [ 'test.circleA' ] ]
+ ] );
+ assert.throws( function () {
+ mw.loader.load( 'test.circleC' );
+ }, /Circular/, 'Detect circular dependency' );
+ } );
+
+ QUnit.test( '.using() Error: Unregistered', function ( assert ) {
+ mw.loader.using( 'test.using.unreg' ).then(
+ function done() {
+ assert.ok( false, 'Unexpected resolution,
expected error.' );
+ },
+ function fail( e ) {
+ assert.ok( /Unknown/.test( String( e ) ),
'Detect unknown dependency' );
+ }
+ );
+ } );
+
+ QUnit.test( '.load() Error: Unregistered', function ( assert ) {
+ assert.throws( function () {
+ mw.loader.load( 'test.using.unreg' );
+ }, /Unknown/, 'Detect unknown dependency' );
+ } );
+
QUnit.test( '.implement( styles={ "css": [text, ..] } )', 2, function (
assert ) {
var $element = $( '<div class="mw-test-implement-a"></div>'
).appendTo( '#qunit-fixture' );
@@ -418,17 +462,6 @@
assert.strictEqual( mw.loader.getState( 'test.module3' ),
'error', 'Expected "error" state for test.module3' );
assert.strictEqual( mw.track.callCount, 1 );
- } );
-
- QUnit.test( 'Circular dependency', 1, function ( assert ) {
- mw.loader.register( [
- [ 'test.circle1', '0', [ 'test.circle2' ] ],
- [ 'test.circle2', '0', [ 'test.circle3' ] ],
- [ 'test.circle3', '0', [ 'test.circle1' ] ]
- ] );
- assert.throws( function () {
- mw.loader.using( 'test.circle3' );
- }, /Circular/, 'Detect circular dependency' );
} );
QUnit.test( 'Out-of-order implementation', 9, function ( assert ) {
--
To view, visit https://gerrit.wikimedia.org/r/322150
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I900909cd00df6a51f3bf1f3df91bdb610c11c446
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Krinkle <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits