From b6516e11f1fe4d3f5f8085f8ccbbcdf24303b9d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gerg=C5=91=20Tisza?= Date: Tue, 7 Jun 2016 20:46:33 +0000 Subject: [PATCH] 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 --- includes/Message.php | 18 +++++++++++++----- tests/phpunit/includes/MessageTest.php | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) 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)' ], ]; } } -- 2.20.1