diff --git a/resources/src/startup/mediawiki.loader.js b/resources/src/startup/mediawiki.loader.js index 657ff62f977..382948b2856 100644 --- a/resources/src/startup/mediawiki.loader.js +++ b/resources/src/startup/mediawiki.loader.js @@ -587,7 +587,11 @@ var prefix; while ( ( prefix = prefixes.pop() ) !== undefined ) { if ( prefix === '..' ) { - baseDirParts.pop(); + if ( baseDirParts.length ) { + baseDirParts.pop(); + } else { + baseDirParts.push( prefix ); + } } } diff --git a/tests/qunit/resources/startup/mw.loader.test.js b/tests/qunit/resources/startup/mw.loader.test.js index 7e2364a38e9..b8a1316412d 100644 --- a/tests/qunit/resources/startup/mw.loader.test.js +++ b/tests/qunit/resources/startup/mw.loader.test.js @@ -477,7 +477,7 @@ } ); } ); - QUnit.test( '.implement( package files )', ( assert ) => { + QUnit.test( '.implement() [packageFiles long paths]', ( assert ) => { var done = assert.async(), initJsRan = false, counter = 41; @@ -519,6 +519,49 @@ } ); } ); + QUnit.test( '.implement() [packageFiles with parent files]', ( assert ) => { + var done = assert.async(); + var initJsRan = false; + var counter = 41; + mw.loader.implement( + 'test.implement.packageWithParentFiles', + { + main: 'init.js', + files: { + 'data/hello.json': { hello: 'world' }, + 'foo.js': function ( require, module ) { + counter++; + module.exports = { answer: counter }; + }, + '../bar/bar.js': function ( require, module ) { + var core = require( './core.js' ); + module.exports = { data: core.sayHello( 'Alice' ) }; + }, + '../bar/core.js': function ( require, module ) { + module.exports = { sayHello: function ( name ) { + return 'Hello ' + name; + } }; + }, + 'init.js': function ( require ) { + initJsRan = true; + assert.deepEqual( require( './data/hello.json' ), { hello: 'world' }, 'require() .json' ); + assert.deepEqual( require( './foo.js' ), { answer: 42 }, 'require() .js in same dir' ); + assert.deepEqual( require( '../bar/bar.js' ), { data: 'Hello Alice' }, 'require() with ../ ' ); + assert.deepEqual( require( './foo.js' ), { answer: 42 }, 'require() same script twice' ); + } + } + }, + {}, + {}, + {} + ); + + return mw.loader.using( 'test.implement.packageWithParentFiles' ).done( () => { + assert.true( initJsRan, 'main JS file is executed' ); + done(); + } ); + } ); + QUnit.test( '.implement( name with @ )', ( assert ) => { var done = assert.async(); // Calling implement() without a version number works if the '@' is the first character