From: jenkins-bot Date: Mon, 2 May 2016 20:52:46 +0000 (+0000) Subject: Merge "Unify HTMLForm message handling" X-Git-Tag: 1.31.0-rc.0~7125 X-Git-Url: https://git.cyclocoop.org/%7B%7B%20url_for%28?a=commitdiff_plain;h=46deecce89b76e2d45e61f5f696928bb859ae324;hp=9b612af4204095ead747620699f1521dd04377f7;p=lhc%2Fweb%2Fwiklou.git Merge "Unify HTMLForm message handling" --- diff --git a/includes/Message.php b/includes/Message.php index fd016fcb37..8ac73b34d8 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -382,6 +382,31 @@ class Message implements MessageSpecifier, Serializable { return new self( $key, $params ); } + /** + * Transform a MessageSpecifier or a primitive value used interchangeably with + * specifiers (a message key string, or a key + params array) into a proper Message + * @param string|array|MessageSpecifier $value + * @return Message + * @throws InvalidArgumentException + */ + public static function newFromSpecifier( $value ) { + 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 ); + } else { + throw new InvalidArgumentException( __METHOD__ . ': invalid argument type ' + . gettype( $value ) ); + } + + return $message; + } + /** * Factory function accepting multiple message keys and returning a message instance * for the first message which is non-empty. If all messages are empty then an diff --git a/includes/htmlform/HTMLForm.php b/includes/htmlform/HTMLForm.php index d671029a25..38e6ecb77a 100644 --- a/includes/htmlform/HTMLForm.php +++ b/includes/htmlform/HTMLForm.php @@ -1117,7 +1117,7 @@ class HTMLForm extends ContextSource { ]; if ( isset( $button['label-message'] ) ) { - $label = $this->msg( $button['label-message'] )->parse(); + $label = $this->getMessage( $button['label-message'] )->parse(); } elseif ( isset( $button['label'] ) ) { $label = htmlspecialchars( $button['label'] ); } elseif ( isset( $button['label-raw'] ) ) { @@ -1198,17 +1198,10 @@ class HTMLForm extends ContextSource { $errorstr = ''; foreach ( $errors as $error ) { - if ( is_array( $error ) ) { - $msg = array_shift( $error ); - } else { - $msg = $error; - $error = []; - } - $errorstr .= Html::rawElement( 'li', [], - $this->msg( $msg, $error )->parse() + $this->getMessage( $error )->parse() ); } @@ -1725,4 +1718,14 @@ class HTMLForm extends ContextSource { return $this; } + + /** + * Turns a *-message parameter (which could be a MessageSpecifier, or a message name, or a + * name + parameters array) into a Message. + * @param mixed $value + * @return Message + */ + protected function getMessage( $value ) { + return Message::newFromSpecifier( $value )->setContext( $this ); + } } diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php index d14fa90d94..380b11d441 100644 --- a/includes/htmlform/HTMLFormField.php +++ b/includes/htmlform/HTMLFormField.php @@ -1095,16 +1095,7 @@ abstract class HTMLFormField { * @return Message */ protected function getMessage( $value ) { - if ( $value instanceof Message ) { - return $value; - } elseif ( $value instanceof MessageSpecifier ) { - return Message::newFromKey( $value ); - } elseif ( is_array( $value ) ) { - $msg = array_shift( $value ); - return $this->msg( $msg, $value ); - } else { - return $this->msg( $value, [] ); - } + return Message::newFromSpecifier( $value )->setContext( $this->mParent ); } /** diff --git a/includes/htmlform/OOUIHTMLForm.php b/includes/htmlform/OOUIHTMLForm.php index 278d4532aa..7a2ed5078d 100644 --- a/includes/htmlform/OOUIHTMLForm.php +++ b/includes/htmlform/OOUIHTMLForm.php @@ -100,7 +100,7 @@ class OOUIHTMLForm extends HTMLForm { if ( $isBadIE ) { $label = $button['value']; } elseif ( isset( $button['label-message'] ) ) { - $label = new OOUI\HtmlSnippet( $this->msg( $button['label-message'] )->parse() ); + $label = new OOUI\HtmlSnippet( $this->getMessage( $button['label-message'] )->parse() ); } elseif ( isset( $button['label'] ) ) { $label = $button['label']; } elseif ( isset( $button['label-raw'] ) ) { @@ -198,18 +198,7 @@ class OOUIHTMLForm extends HTMLForm { } foreach ( $errors as &$error ) { - if ( is_array( $error ) ) { - $msg = array_shift( $error ); - } else { - $msg = $error; - $error = []; - } - // if the error is already a message object, don't use it as a message key - if ( !$msg instanceof Message ) { - $error = $this->msg( $msg, $error )->parse(); - } else { - $error = $msg->parse(); - } + $error = $this->getMessage( $error )->parse(); $error = new OOUI\HtmlSnippet( $error ); } diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php index cf34b18713..224b0cbdfa 100644 --- a/tests/phpunit/includes/MessageTest.php +++ b/tests/phpunit/includes/MessageTest.php @@ -581,4 +581,29 @@ class MessageTest extends MediaWikiLangTestCase { $msg = unserialize( serialize( $msg ) ); $this->assertEquals( 'Hauptseite', $msg->plain() ); } + + /** + * @covers Message::newFromSpecifier + * @dataProvider provideNewFromSpecifier + */ + public function testNewFromSpecifier( $value, $expectedText ) { + $message = Message::newFromSpecifier( $value ); + $this->assertInstanceOf( Message::class, $message ); + $this->assertSame( $expectedText, $message->text() ); + } + + public function provideNewFromSpecifier() { + $messageSpecifier = $this->getMockForAbstractClass( MessageSpecifier::class ); + $messageSpecifier->expects( $this->any() )->method( 'getKey' )->willReturn( 'mainpage' ); + $messageSpecifier->expects( $this->any() )->method( 'getParams' )->willReturn( [] ); + + return [ + 'string' => [ 'mainpage', 'Main Page' ], + 'array' => [ [ 'youhavenewmessages', 'foo', 'bar' ], 'You have foo (bar).' ], + 'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ], + 'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ], + 'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ], + ]; + } } +