aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartosz Dziewoński <dziewonski@fastmail.fm>2024-06-06 02:12:57 +0200
committerBartosz Dziewoński <dziewonski@fastmail.fm>2024-06-06 02:16:35 +0200
commitd38c9a1ad1fb8597bb60e8199c46b518342fb893 (patch)
treed97a3b1fd695cc229eece582b421ae23ea14d7d7
parent8dd74ae1290750b229b80db851054c496c9dd4fc (diff)
downloadmediawikicore-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.php4
-rw-r--r--tests/phpunit/includes/Status/StatusTest.php5
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 ];
}
/**