From c59b0ed189057f96f36c819962995152d72c79e9 Mon Sep 17 00:00:00 2001 From: Amir Sarabadani Date: Wed, 14 Aug 2019 21:39:01 +0200 Subject: [PATCH] resourceloader: Map group names to integers internally This makes startup response smaller. Change-Id: Id0ae3cd7cd22163f42b92b629c38b0a806d3ca50 --- .../ResourceLoaderStartUpModule.php | 25 ++++++++++++++++++- resources/src/startup/mediawiki.js | 10 ++++---- .../ResourceLoaderStartUpModuleTest.php | 12 ++++----- .../mediawiki/mediawiki.loader.test.js | 6 +++-- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 8f026dc87b..58c9ee5b82 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -42,6 +42,15 @@ use MediaWiki\MediaWikiServices; 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 @@ -304,7 +313,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { $registryData[$name] = [ 'version' => $versionHash, 'dependencies' => $module->getDependencies( $context ), - 'group' => $module->getGroup(), + 'group' => $this->getGroupId( $module->getGroup() ), 'source' => $module->getSource(), 'skip' => $skipFunction, ]; @@ -340,6 +349,18 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 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. * @@ -416,6 +437,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { ), '$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 );', diff --git a/resources/src/startup/mediawiki.js b/resources/src/startup/mediawiki.js index ab7f3a074e..a3249de6f1 100644 --- a/resources/src/startup/mediawiki.js +++ b/resources/src/startup/mediawiki.js @@ -506,7 +506,7 @@ * // 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 @@ -1600,7 +1600,7 @@ // 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' ); } @@ -1726,7 +1726,7 @@ 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 @@ -2271,8 +2271,8 @@ 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, diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php index 213eed2aea..d4462e93d0 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php @@ -326,13 +326,13 @@ mw.loader.register([ "test.group.foo", "{blankVer}", [], - "x-foo" + 2 ], [ "test.group.bar", "{blankVer}", [], - "x-bar" + 3 ] ]);' ] ], @@ -640,25 +640,25 @@ mw.loader.register([ "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" ] ]);' diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js index e1b8d55da8..894dd194ca 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js @@ -1015,7 +1015,8 @@ 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 () {} ); @@ -1037,7 +1038,8 @@ 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 () {} ); -- 2.20.1