Merge "Better handling of Message objects as Message parameters"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 25 Nov 2016 09:01:13 +0000 (09:01 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 25 Nov 2016 09:01:13 +0000 (09:01 +0000)
includes/Message.php
tests/phpunit/includes/MessageTest.php

index 7d86d07..85c78d6 100644 (file)
@@ -766,6 +766,7 @@ class Message implements MessageSpecifier, Serializable {
         */
        public function useDatabase( $useDatabase ) {
                $this->useDatabase = (bool)$useDatabase;
+               $this->message = null;
                return $this;
        }
 
@@ -1132,10 +1133,27 @@ class Message implements MessageSpecifier, Serializable {
                                return [ 'before', '[INVALID]' ];
                        }
                } elseif ( $param instanceof Message ) {
+                       // Match language, flags, etc. to the current message.
+                       $msg = clone $param;
+                       if ( $msg->language !== $this->language || $msg->useDatabase !== $this->useDatabase ) {
+                               // Cache depends on these parameters
+                               $msg->message = null;
+                       }
+                       $msg->interface = $this->interface;
+                       $msg->language = $this->language;
+                       $msg->useDatabase = $this->useDatabase;
+                       $msg->title = $this->title;
+
+                       // DWIM
+                       if ( $format === 'block-parse' ) {
+                               $format = 'parse';
+                       }
+                       $msg->format = $format;
+
                        // Message objects should not be before parameters because
                        // then they'll get double escaped. If the message needs to be
                        // escaped, it'll happen right here when we call toString().
-                       return [ 'after', $param->toString( $format ) ];
+                       return [ 'after', $msg->toString( $format ) ];
                } else {
                        return [ 'before', $param ];
                }
index 8390e1f..e8afb4c 100644 (file)
@@ -512,6 +512,34 @@ class MessageTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * @covers Message::extractParam
+        */
+       public function testMessageAsParam() {
+               $this->setMwGlobals( [
+                       'wgScript' => '/wiki/index.php',
+                       'wgArticlePath' => '/wiki/$1',
+               ] );
+
+               $msg = new Message( 'returnto', [
+                       new Message( 'apihelp-link', [
+                               'foo', new Message( 'mainpage', [], Language::factory( 'en' ) )
+                       ], Language::factory( 'de' ) )
+               ], Language::factory( 'es' ) );
+
+               $this->assertEquals(
+                       'Volver a [[Special:ApiHelp/foo|Página principal]].',
+                       $msg->text(),
+                       'Process with ->text()'
+               );
+               $this->assertEquals(
+                       '<p>Volver a <a href="/wiki/Special:ApiHelp/foo" title="Special:ApiHelp/foo">Página '
+                               . "principal</a>.\n</p>",
+                       $msg->parseAsBlock(),
+                       'Process with ->parseAsBlock()'
+               );
+       }
+
        public static function provideParser() {
                return [
                        [