*
* @private
* @param {Object} moduleMap Module map
- * @return {string} Module query string
+ * @return {Object}
+ * @return {string} return.str Module query string
+ * @return {Array} return.list List of module names in matching order
*/
function buildModulesString( moduleMap ) {
var p, prefix,
- arr = [];
+ str = [],
+ list = [];
+
+ function restore( suffix ) {
+ return p + suffix;
+ }
for ( prefix in moduleMap ) {
p = prefix === '' ? '' : prefix + '.';
- arr.push( p + moduleMap[ prefix ].join( ',' ) );
+ str.push( p + moduleMap[ prefix ].join( ',' ) );
+ list.push.apply( list, moduleMap[ prefix ].map( restore ) );
}
- return arr.join( '|' );
+ return {
+ str: str.join( '|' ),
+ list: list
+ };
}
/**
*/
function doRequest() {
// Optimisation: Inherit (Object.create), not copy ($.extend)
- var query = Object.create( currReqBase );
- query.modules = buildModulesString( moduleMap );
- query.version = getCombinedVersion( currReqModules );
+ var query = Object.create( currReqBase ),
+ packed = buildModulesString( moduleMap );
+ query.modules = packed.str;
+ // The packing logic can change the effective order, even if the input was
+ // sorted. As such, the call to getCombinedVersion() must use this
+ // effective order, instead of currReqModules, as otherwise the combined
+ // version will not match the hash expected by the server based on
+ // combining versions from the module query string in-order. (T188076)
+ query.version = getCombinedVersion( packed.list );
query = sortQuery( query );
addScript( sourceLoadScript + '?' + $.param( query ) );
}