jenkins-bot has submitted this change and it was merged. Change subject: Hygiene: Move ResourceLoaderParsedMessageModule to MobileFrontend ......................................................................
Hygiene: Move ResourceLoaderParsedMessageModule to MobileFrontend Rename to maintain backwards compatibility See also: https://gerrit.wikimedia.org/r/182959 Change-Id: I627c46b7f673fcc98e3546f31990c31114566c5f --- M MobileFrontend.php M includes/MobileFrontend.hooks.php M includes/Resources.php A includes/modules/MFResourceLoaderParsedMessageModule.php A tests/phpunit/modules/MFResourceLoaderParsedMessageModuleTest.php 5 files changed, 219 insertions(+), 10 deletions(-) Approvals: Kaldari: Looks good to me, approved jenkins-bot: Verified diff --git a/MobileFrontend.php b/MobileFrontend.php index 02b49e1..891f800 100644 --- a/MobileFrontend.php +++ b/MobileFrontend.php @@ -94,6 +94,8 @@ 'MinervaTemplateBeta' => 'skins/MinervaTemplateBeta', 'MinervaTemplateAlpha' => 'skins/MinervaTemplateAlpha', + 'MFResourceLoaderParsedMessageModule' => 'modules/MFResourceLoaderParsedMessageModule', + 'SkinMinerva' => 'skins/SkinMinerva', 'SkinMinervaBeta' => 'skins/SkinMinervaBeta', 'SkinMinervaAlpha' => 'skins/SkinMinervaAlpha', @@ -241,6 +243,14 @@ 'targets' => 'mobile', 'group' => 'other', ); + +/** + * A mobile enabled ResourceLoaderFileModule template which supports parsed messages. + */ +$wgMFResourceParsedMessageModuleBoilerplate = $wgMFResourceBoilerplate + array( + 'class' => 'MFResourceLoaderParsedMessageModule', +); + require_once __DIR__ . "/includes/Resources.php"; /** diff --git a/includes/MobileFrontend.hooks.php b/includes/MobileFrontend.hooks.php index 1b0fdff..e16266b 100644 --- a/includes/MobileFrontend.hooks.php +++ b/includes/MobileFrontend.hooks.php @@ -781,6 +781,7 @@ 'DeviceDetectionTest.php', 'MobileContextTest.php', 'MobileFormatterTest.php', + 'modules/MFResourceLoaderParsedMessageModuleTest.php', 'skins/SkinMinervaTest.php', 'skins/SkinMinervaAlphaTest.php', 'skins/SkinMinervaBetaTest.php', diff --git a/includes/Resources.php b/includes/Resources.php index 62a5fd3..d60e47c 100644 --- a/includes/Resources.php +++ b/includes/Resources.php @@ -339,8 +339,7 @@ ), ), - 'mobile.editor.common' => $wgMFResourceFileModuleBoilerplate + array( - 'class' => 'ResourceLoaderParsedMessageModule', + 'mobile.editor.common' => $wgMFResourceParsedMessageModuleBoilerplate + array( 'dependencies' => array( 'mobile.stable', 'mobile.templates', @@ -413,8 +412,7 @@ ), ), - 'mobile.uploads' => $wgMFResourceFileModuleBoilerplate + array( - 'class' => 'ResourceLoaderParsedMessageModule', + 'mobile.uploads' => $wgMFResourceParsedMessageModuleBoilerplate + array( 'dependencies' => array( 'mobile.stable', 'mobile.templates', @@ -504,8 +502,7 @@ ), ), - 'mobile.search' => $wgMFResourceFileModuleBoilerplate + array( - 'class' => 'ResourceLoaderParsedMessageModule', + 'mobile.search' => $wgMFResourceParsedMessageModuleBoilerplate + array( 'dependencies' => array( 'mobile.pagelist.scripts', 'mobile.overlays', @@ -899,8 +896,7 @@ ), ), - 'mobile.languages' => $wgMFResourceFileModuleBoilerplate + array( - 'class' => 'ResourceLoaderParsedMessageModule', + 'mobile.languages' => $wgMFResourceParsedMessageModuleBoilerplate + array( 'dependencies' => array( 'mobile.overlays', 'mobile.templates', @@ -1106,8 +1102,7 @@ 'position' => 'top', ), - 'mobile.infobox' => $wgMFResourceFileModuleBoilerplate + array( - 'class' => 'ResourceLoaderParsedMessageModule', + 'mobile.infobox' => $wgMFResourceParsedMessageModuleBoilerplate + array( 'dependencies' => array( 'mobile.wikidata.api', 'mobile.ajax', diff --git a/includes/modules/MFResourceLoaderParsedMessageModule.php b/includes/modules/MFResourceLoaderParsedMessageModule.php new file mode 100644 index 0000000..7ae9f8c --- /dev/null +++ b/includes/modules/MFResourceLoaderParsedMessageModule.php @@ -0,0 +1,112 @@ +<?php +/** + * ResourceLoaderModule subclass for mobile + * Allows basic parsing of messages without arguments + */ +class MFResourceLoaderParsedMessageModule extends ResourceLoaderFileModule { + /** @var array Saves a list of messages which have been marked as needing parsing. */ + protected $parsedMessages = array(); + /** @var array Saves a list of message keys used by this module. */ + protected $messages = array(); + /** @var array Saves the target for the module (e.g. desktop and mobile). */ + protected $targets = array( 'mobile', 'desktop' ); + /** @var boolean Whether the module abuses getScripts. */ + protected $hasHackedScriptMode = false; + + /** + * Registers core modules and runs registration hooks. + * @param $options List of options; if not given or empty, an empty module will be constructed + */ + public function __construct( $options ) { + foreach ( $options as $member => $option ) { + switch ( $member ) { + case 'messages': + $this->processMessages( $option ); + $this->hasHackedScriptMode = true; + // Prevent them being reinitialised when parent construct is called. + unset( $options[$member] ); + break; + } + } + + parent::__construct( $options ); + } + + /** + * Processes messages which have been marked as needing parsing + * + * @return string JavaScript code + */ + public function addParsedMessages() { + $js = "\n"; + foreach ( $this->parsedMessages as $key ) { + $value = wfMessage( $key )->parse(); + $js .= Xml::encodeJsCall( 'mw.messages.set', array( $key, $value ) ); + } + return $js; + } + + /** + * Separates messages which have been marked as needing parsing from standard messages + * @param array $messages Array of messages to process + */ + public function processMessages( $messages ) { + foreach ( $messages as $key => $value ) { + if ( is_array( $value ) ) { + foreach ( $value as $directive ) { + if ( $directive == 'parse' ) { + $this->parsedMessages[] = $key; + } + } + } else { + $this->messages[] = $value; + } + } + } + + /** + * Gets list of message keys used by this module. + * + * @return array List of message keys + */ + public function getMessages() { + return $this->messages; + } + + /** + * Gets all scripts for a given context concatenated together including processed messages + * + * @param ResourceLoaderContext $context Context in which to generate script + * @return string JavaScript code for $context + */ + public function getScript( ResourceLoaderContext $context ) { + $script = parent::getScript( $context ); + return $this->addParsedMessages() . $script; + } + + /** + * Get the URL or URLs to load for this module's JS in debug mode. + * @param ResourceLoaderContext $context + * @return array list of urls + * @see ResourceLoaderModule::getScriptURLsForDebug + */ + public function getScriptURLsForDebug( ResourceLoaderContext $context ) { + if ( $this->hasHackedScriptMode ) { + $derivative = new DerivativeResourceLoaderContext( $context ); + $derivative->setDebug( true ); + $derivative->setModules( array( $this->getName() ) ); + // @todo FIXME: Make this templates and update + // makeModuleResponse so that it only outputs template code. + // When this is done you can merge with parent array and + // retain file names. + $derivative->setOnly( 'scripts' ); + $rl = $derivative->getResourceLoader(); + $urls = array( + $rl->createLoaderURL( $this->getSource(), $derivative ), + ); + } else { + $urls = parent::getScriptURLsForDebug( $context ); + } + return $urls; + } +} diff --git a/tests/phpunit/modules/MFResourceLoaderParsedMessageModuleTest.php b/tests/phpunit/modules/MFResourceLoaderParsedMessageModuleTest.php new file mode 100644 index 0000000..4ee5b44 --- /dev/null +++ b/tests/phpunit/modules/MFResourceLoaderParsedMessageModuleTest.php @@ -0,0 +1,91 @@ +<?php + +/** + * @group MobileFrontend + */ +class MFResourceLoaderParsedMessageModuleTest extends MediaWikiTestCase { + private $modules = array( + array( + 'messages' => array( 'foo', 'bar' ), + ), + array( + 'messages' => array( + 'foo', + 'mobile-frontend-photo-license' => array( 'parse' ), + ), + ), + array( + 'messages' => array( + 'foo', + 'mobile-frontend-photo-license' => array( 'unknown' ), + ), + ), + ); + + // providers + public function providerGetMessages() { + return array( + array( + $this->modules[0], + array( 'foo', 'bar' ), + ), + array( + $this->modules[1], + array( 'foo' ), + ), + array( + $this->modules[2], + array( 'foo' ), + ), + ); + } + + public function providerAddParsedMessages() { + $msg = wfMessage( 'mobile-frontend-photo-license' )->parse(); + $expected = "\n" . Xml::encodeJsCall( 'mw.messages.set', + array( 'mobile-frontend-photo-license', $msg ) ); + + return array( + // test case 1 + array( + $this->modules[0], + // expected value + "\n" + ), + // test case 2 + array( + $this->modules[1], + // expected value 2 + $expected + ), + // test case 3 + array( + $this->modules[2], + // expected value 2 + "\n" + ), + ); + } + + // tests + + /** + * @dataProvider providerAddParsedMessages + */ + public function testAddParsedMessages( $module, $expectedJavascript ) { + $rl = new MFResourceLoaderParsedMessageModule( $module ); + $js = $rl->addParsedMessages(); + + $this->assertEquals( $js, $expectedJavascript ); + } + + /** + * @dataProvider providerGetMessages + */ + public function testGetMessages( $module, $expectedMessages ) { + $rl = new MFResourceLoaderParsedMessageModule( $module ); + $msgs = $rl->getMessages(); + + $this->assertEquals( $msgs, $expectedMessages ); + } +} -- To view, visit https://gerrit.wikimedia.org/r/182957 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I627c46b7f673fcc98e3546f31990c31114566c5f Gerrit-PatchSet: 9 Gerrit-Project: mediawiki/extensions/MobileFrontend Gerrit-Branch: master Gerrit-Owner: Jdlrobson <[email protected]> Gerrit-Reviewer: Bmansurov <[email protected]> Gerrit-Reviewer: Florianschmidtwelzow <[email protected]> Gerrit-Reviewer: Jdlrobson <[email protected]> Gerrit-Reviewer: Jhernandez <[email protected]> Gerrit-Reviewer: Kaldari <[email protected]> Gerrit-Reviewer: MaxSem <[email protected]> Gerrit-Reviewer: Phuedx <[email protected]> Gerrit-Reviewer: Robmoen <[email protected]> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
