From: Gergő Tisza Date: Tue, 7 Jun 2016 20:46:33 +0000 (+0000) Subject: Fix Message::newFromSpecifier for nested RawMessage X-Git-Tag: 1.31.0-rc.0~6690^2 X-Git-Url: https://git.cyclocoop.org//%22?a=commitdiff_plain;h=b6516e11f1fe4d3f5f8085f8ccbbcdf24303b9d8;p=lhc%2Fweb%2Fwiklou.git Fix Message::newFromSpecifier for nested RawMessage This can happen e.g. when something processes Status contents and expects [$key, $param1, ...] and instead gets [$messageObject] Change-Id: I346b35e08bd38ce231e16d0616438ea408b55bff --- diff --git a/includes/Message.php b/includes/Message.php index c204aee032..712d3f17fb 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -384,22 +384,30 @@ class Message implements MessageSpecifier, Serializable { /** * Transform a MessageSpecifier or a primitive value used interchangeably with - * specifiers (a message key string, or a key + params array) into a proper Message + * specifiers (a message key string, or a key + params array) into a proper Message. + * + * Also accepts a MessageSpecifier inside an array: that's not considered a valid format + * but is an easy error to make due to how StatusValue stores messages internally. + * Further array elements are ignored in that case. + * * @param string|array|MessageSpecifier $value * @return Message * @throws InvalidArgumentException * @since 1.27 */ public static function newFromSpecifier( $value ) { + $params = []; + if ( is_array( $value ) ) { + $params = $value; + $value = array_shift( $params ); + } + if ( $value instanceof RawMessage ) { $message = new RawMessage( $value->getKey(), $value->getParams() ); } elseif ( $value instanceof MessageSpecifier ) { $message = new Message( $value ); - } elseif ( is_array( $value ) ) { - $key = array_shift( $value ); - $message = new Message( $key, $value ); } elseif ( is_string( $value ) ) { - $message = new Message( $value ); + $message = new Message( $value, $params ); } else { throw new InvalidArgumentException( __METHOD__ . ': invalid argument type ' . gettype( $value ) ); diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php index 224b0cbdfa..8aa136144d 100644 --- a/tests/phpunit/includes/MessageTest.php +++ b/tests/phpunit/includes/MessageTest.php @@ -603,6 +603,7 @@ class MessageTest extends MediaWikiLangTestCase { 'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ], 'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ], 'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ], + 'nested RawMessage' => [ [ new RawMessage( 'foo ($1)', [ 'bar' ] ) ], 'foo (bar)' ], ]; } }