Fix Message::newFromSpecifier for nested RawMessage
authorGergő Tisza <gtisza@wikimedia.org>
Tue, 7 Jun 2016 20:46:33 +0000 (20:46 +0000)
committerGergő Tisza <gtisza@wikimedia.org>
Tue, 7 Jun 2016 22:30:54 +0000 (22:30 +0000)
This can happen e.g. when something processes Status contents
and expects [$key, $param1, ...] and instead gets [$messageObject]

Change-Id: I346b35e08bd38ce231e16d0616438ea408b55bff

includes/Message.php
tests/phpunit/includes/MessageTest.php

index c204aee..712d3f1 100644 (file)
@@ -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 ) );
index 224b0cb..8aa1361 100644 (file)
@@ -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)' ],
                ];
        }
 }