From 7e0d3369c20e84d51173d44229caab90d177f2e8 Mon Sep 17 00:00:00 2001 From: Andrew Green Date: Wed, 8 Apr 2015 17:34:08 -0400 Subject: [PATCH] resourceloader: Add context param to ResourceLoaderModule::getDependencies By providing context as a parameter in getDependencies, we allow modules to dyanamically determine dependencies based on context. Note: To ease rollout, the parameter is optional in this patch. It is expected that it will be made non-optional in the near future. The use case is for CentralNotice campaigns to be able to add special modules ahead of deciding which banner to show a user. The dynamically chosen RL modules would replace ad-hoc JS currently sent with some banners. A list of possible campaigns and banners is already sent as a PHP- implemented RL module; that's the module that will dynamically choose other modules as dependencies when appropriate. This approach will save a round trip as compared to dynamically loading the modules client-side. For compatibility, extensions that override ResourceLoaderModule::getDependencies() should be updated with the new method signature. Here are changes for extensions currently deployed on Wikimedia wikis: * CentralNotice: I816bffa3815e2eab7e88cb04d1b345070e6aa15f * Gadgets: I0a10fb0cbf17d095ece493e744296caf13dcee02 * EventLogging: I67e957f74d6ca48cfb9a41fb5144bcc78f885e50 * PageTriage: Ica3ba32aa2fc76d11a44f391b6edfc871e7fbe0d * UniversalLanguageSelector: Ic63e617f51702c27104e123d4bed91983a726b7f * VisualEditor: I0ac775ca286e64825e31a9213b94648e41a5bc30 For more on the CentralNotice use case, please see I9f80edcbcacca2. Bug: T98924 Change-Id: Iee61e5b527321d01287baa03ad9b4d4f526ff3ef --- RELEASE-NOTES-1.26 | 5 +++++ includes/resourceloader/ResourceLoaderFileModule.php | 4 ++-- .../resourceloader/ResourceLoaderLanguageDataModule.php | 3 ++- .../resourceloader/ResourceLoaderLanguageNamesModule.php | 6 +++++- includes/resourceloader/ResourceLoaderModule.php | 7 ++++++- .../ResourceLoaderSpecialCharacterDataModule.php | 3 ++- includes/resourceloader/ResourceLoaderStartUpModule.php | 2 +- .../resourceloader/ResourceLoaderUserOptionsModule.php | 3 ++- tests/phpunit/ResourceLoaderTestCase.php | 2 +- 9 files changed, 26 insertions(+), 9 deletions(-) diff --git a/RELEASE-NOTES-1.26 b/RELEASE-NOTES-1.26 index b55e23b950..c862bf38cf 100644 --- a/RELEASE-NOTES-1.26 +++ b/RELEASE-NOTES-1.26 @@ -59,6 +59,11 @@ changes to languages because of Bugzilla reports. * mediaWiki.confirmCloseWindow now returns an object of functions, instead of one function. The callback can't be called directly any more. The callback function is replaced with confirmCloseWindow.release(). +* BREAKING CHANGE: Added an optional ResouceLoaderContext parameter to + ResourceLoaderModule::getDependencies(). Extension classes that override that + method should be updated. If they aren't updated, PHP Strict standards + warnings will appear when E_STRICT error reporting is enabled. Note: in the + near future, this parameter will probably become non-optional. * Removed maintenance script deleteImageMemcached.php. * MWFunction::newObj() was removed (deprecated in 1.25). ObjectFactory::getObjectFromSpec() should be used instead. diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php index 0ee2e7dc45..e6c9bd0439 100644 --- a/includes/resourceloader/ResourceLoaderFileModule.php +++ b/includes/resourceloader/ResourceLoaderFileModule.php @@ -478,10 +478,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { /** * Gets list of names of modules this module depends on. - * + * @param ResourceLoaderContext context * @return array List of module names */ - public function getDependencies() { + public function getDependencies( ResourceLoaderContext $context = null ) { return $this->dependencies; } diff --git a/includes/resourceloader/ResourceLoaderLanguageDataModule.php b/includes/resourceloader/ResourceLoaderLanguageDataModule.php index ebaf366ee8..be15008ef9 100644 --- a/includes/resourceloader/ResourceLoaderLanguageDataModule.php +++ b/includes/resourceloader/ResourceLoaderLanguageDataModule.php @@ -71,9 +71,10 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule { } /** + * @param ResourceLoaderContext $context * @return array */ - public function getDependencies() { + public function getDependencies( ResourceLoaderContext $context = null ) { return array( 'mediawiki.language.init' ); } } diff --git a/includes/resourceloader/ResourceLoaderLanguageNamesModule.php b/includes/resourceloader/ResourceLoaderLanguageNamesModule.php index 31110507c9..827a573feb 100644 --- a/includes/resourceloader/ResourceLoaderLanguageNamesModule.php +++ b/includes/resourceloader/ResourceLoaderLanguageNamesModule.php @@ -60,7 +60,11 @@ class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule { ); } - public function getDependencies() { + /** + * @param ResourceLoaderContext $context + * @return array + */ + public function getDependencies( ResourceLoaderContext $context = null ) { return array( 'mediawiki.language.init' ); } diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php index 958990cc7f..741701c47c 100644 --- a/includes/resourceloader/ResourceLoaderModule.php +++ b/includes/resourceloader/ResourceLoaderModule.php @@ -331,9 +331,14 @@ abstract class ResourceLoaderModule { * * To add dependencies dynamically on the client side, use a custom * loader script, see getLoaderScript() + * + * Note: It is expected that $context will be made non-optional in the near + * future. + * + * @param ResourceLoaderContext $context * @return array List of module names as strings */ - public function getDependencies() { + public function getDependencies( ResourceLoaderContext $context = null ) { // Stub, override expected return array(); } diff --git a/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php b/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php index 5eb4e3ad7e..03f2124537 100644 --- a/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php +++ b/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php @@ -62,9 +62,10 @@ class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule { } /** + * @param ResourceLoaderContext $context * @return array */ - public function getDependencies() { + public function getDependencies( ResourceLoaderContext $context = null ) { return array( 'mediawiki.language' ); } diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 6c078b0ab9..8dbed8e889 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -226,7 +226,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { $registryData[$name] = array( 'version' => $versionHash, - 'dependencies' => $module->getDependencies(), + 'dependencies' => $module->getDependencies( $context ), 'group' => $module->getGroup(), 'source' => $module->getSource(), 'loader' => $module->getLoaderScript(), diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php index 4ed1b876a0..aba0fa6bc6 100644 --- a/includes/resourceloader/ResourceLoaderUserOptionsModule.php +++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php @@ -32,9 +32,10 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule { protected $targets = array( 'desktop', 'mobile' ); /** + * @param ResourceLoaderContext $context * @return array List of module names as strings */ - public function getDependencies() { + public function getDependencies( ResourceLoaderContext $context = null ) { return array( 'user.defaults' ); } diff --git a/tests/phpunit/ResourceLoaderTestCase.php b/tests/phpunit/ResourceLoaderTestCase.php index 6346bb9965..223019cc00 100644 --- a/tests/phpunit/ResourceLoaderTestCase.php +++ b/tests/phpunit/ResourceLoaderTestCase.php @@ -83,7 +83,7 @@ class ResourceLoaderTestModule extends ResourceLoaderModule { return array( '' => $this->styles ); } - public function getDependencies() { + public function getDependencies( ResourceLoaderContext $context = null ) { return $this->dependencies; } -- 2.20.1