This makes startup response smaller.
Change-Id: Id0ae3cd7cd22163f42b92b629c38b0a806d3ca50
class ResourceLoaderStartUpModule extends ResourceLoaderModule {
protected $targets = [ 'desktop', 'mobile' ];
+ private $groupIds = [
+ // These reserved numbers MUST start at 0 and not skip any. These are preset
+ // for forward compatiblity so that they can be safely referenced by mediawiki.js,
+ // even when the code is cached and the order of registrations (and implicit
+ // group ids) changes between versions of the software.
+ 'user' => 0,
+ 'private' => 1,
+ ];
+
/**
* @param ResourceLoaderContext $context
* @return array
$registryData[$name] = [
'version' => $versionHash,
'dependencies' => $module->getDependencies( $context ),
- 'group' => $module->getGroup(),
+ 'group' => $this->getGroupId( $module->getGroup() ),
'source' => $module->getSource(),
'skip' => $skipFunction,
];
return $out;
}
+ private function getGroupId( $groupName ) {
+ if ( $groupName === null ) {
+ return null;
+ }
+
+ if ( !array_key_exists( $groupName, $this->groupIds ) ) {
+ $this->groupIds[$groupName] = count( $this->groupIds );
+ }
+
+ return $this->groupIds[$groupName];
+ }
+
/**
* Base modules implicitly available to all modules.
*
),
'$VARS.storeKey' => ResourceLoader::encodeJsonForScript( $this->getStoreKey() ),
'$VARS.storeVary' => ResourceLoader::encodeJsonForScript( $this->getStoreVary( $context ) ),
+ '$VARS.groupUser' => ResourceLoader::encodeJsonForScript( $this->getGroupId( 'user' ) ),
+ '$VARS.groupPrivate' => ResourceLoader::encodeJsonForScript( $this->getGroupId( 'private' ) ),
];
$profilerStubs = [
'$CODE.profileExecuteStart();' => 'mw.loader.profiler.onExecuteStart( module );',
* // From mw.loader.register()
* 'version': '########' (hash)
* 'dependencies': ['required.foo', 'bar.also', ...]
- * 'group': 'somegroup', (or) null
+ * 'group': string, integer, (or) null
* 'source': 'local', (or) 'anotherwiki'
* 'skip': 'return !!window.Example', (or) null, (or) boolean result of skip
* 'module': export Object
// Optimisation: Inherit (Object.create), not copy ($.extend)
currReqBase = Object.create( reqBase );
// User modules require a user name in the query string.
- if ( group === 'user' && mw.config.get( 'wgUserName' ) !== null ) {
+ if ( group === $VARS.groupUser && mw.config.get( 'wgUserName' ) !== null ) {
currReqBase.user = mw.config.get( 'wgUserName' );
}
packageExports: {},
version: String( version || '' ),
dependencies: dependencies || [],
- group: typeof group === 'string' ? group : null,
+ group: typeof group === 'undefined' ? null : group,
source: typeof source === 'string' ? source : 'local',
state: 'registered',
skip: typeof skip === 'string' ? skip : null
descriptor.state !== 'ready' ||
// Unversioned, private, or site-/user-specific
!descriptor.version ||
- descriptor.group === 'private' ||
- descriptor.group === 'user' ||
+ descriptor.group === $VARS.groupPrivate ||
+ descriptor.group === $VARS.groupUser ||
// Partial descriptor
// (e.g. skipped module, or style module with state=ready)
[ descriptor.script, descriptor.style, descriptor.messages,
"test.group.foo",
"{blankVer}",
[],
- "x-foo"
+ 2
],
[
"test.group.bar",
"{blankVer}",
[],
- "x-bar"
+ 3
]
]);'
] ],
"test.group.foo.1",
"{blankVer}",
[],
- "x-foo"
+ 2
],
[
"test.group.foo.2",
"{blankVer}",
[],
- "x-foo"
+ 2
],
[
"test.group.bar.1",
"{blankVer}",
[],
- "x-bar"
+ 3
],
[
"test.group.bar.2",
"{blankVer}",
[],
- "x-bar",
+ 3,
"example"
]
]);'
fn();
} );
- mw.loader.register( name, 'x', [], 'private' );
+ // See ResourceLoaderStartUpModule::$groupIds
+ mw.loader.register( name, 'x', [], 1 );
assert.strictEqual( mw.loader.store.get( name ), false, 'Not in store' );
mw.loader.implement( name, function () {} );
fn();
} );
- mw.loader.register( name, 'y', [], 'user' );
+ // See ResourceLoaderStartUpModule::$groupIds
+ mw.loader.register( name, 'y', [], 0 );
assert.strictEqual( mw.loader.store.get( name ), false, 'Not in store' );
mw.loader.implement( name, function () {} );