diff options
author | Bartosz Dziewoński <dziewonski@fastmail.fm> | 2024-06-06 02:12:57 +0200 |
---|---|---|
committer | Bartosz Dziewoński <dziewonski@fastmail.fm> | 2024-06-06 02:16:35 +0200 |
commit | d38c9a1ad1fb8597bb60e8199c46b518342fb893 (patch) | |
tree | d97a3b1fd695cc229eece582b421ae23ea14d7d7 | |
parent | 8dd74ae1290750b229b80db851054c496c9dd4fc (diff) | |
download | mediawikicore-d38c9a1ad1fb8597bb60e8199c46b518342fb893.tar.gz mediawikicore-d38c9a1ad1fb8597bb60e8199c46b518342fb893.zip |
StatusValue: Fix filtering out duplicate Message objects with context
Normally two Message objects can be compared with `==`, and they will
compare equal if they have the same key, parameters and internal state
such as the selected language.
However, if you call `setContext()` on a Message, it will never
compare equal to any other Message object, because a unique closure
is stored in the `userLangCallback` property.
Most implementations of MessageLocalizer::msg() use `setContext()`,
so filtering out duplicate Message objects in StatusValue usually
didn't work. Luckily most uses of StatusValue use string message keys.
Change-Id: Id22075bf73d37fd139c2ef7d80c69eeb462a7b68
-rw-r--r-- | includes/libs/StatusValue.php | 4 | ||||
-rw-r--r-- | tests/phpunit/includes/Status/StatusTest.php | 5 |
2 files changed, 7 insertions, 2 deletions
diff --git a/includes/libs/StatusValue.php b/includes/libs/StatusValue.php index 53001560c7e2..4ae6cc82b92d 100644 --- a/includes/libs/StatusValue.php +++ b/includes/libs/StatusValue.php @@ -221,8 +221,8 @@ class StatusValue { $isEqual = static function ( $key, $params ) use ( $newError ) { if ( $key instanceof MessageSpecifier ) { - // compare attributes of both MessageSpecifiers - return $newError['message'] == $key; + return $newError['message']->getKey() === $key->getKey() && + $newError['message']->getParams() === $key->getParams(); } else { return $newError['message']->getKey() === $key && $newError['message']->getParams() === $params; diff --git a/tests/phpunit/includes/Status/StatusTest.php b/tests/phpunit/includes/Status/StatusTest.php index 6de7780bf67b..46c8776fc77d 100644 --- a/tests/phpunit/includes/Status/StatusTest.php +++ b/tests/phpunit/includes/Status/StatusTest.php @@ -1,6 +1,8 @@ <?php +use MediaWiki\Context\RequestContext; use MediaWiki\Language\RawMessage; +use MediaWiki\Message\Message; use MediaWiki\Status\Status; use Wikimedia\Message\MessageValue; @@ -781,6 +783,9 @@ class StatusTest extends MediaWikiLangTestCase { yield [ $message, $message ]; yield [ $message, [ 'foo', 1, 2 ] ]; yield [ [ 'foo', 1, 2 ], $message ]; + $messageWithContext1 = ( new Message( 'foo' ) )->setContext( RequestContext::getMain() ); + $messageWithContext2 = ( new Message( 'foo' ) )->setContext( RequestContext::getMain() ); + yield [ $messageWithContext1, $messageWithContext2 ]; } /** |