Page MenuHomePhabricator

TypeError: MediaWiki\Parser\ParserOutput::appendJsConfigVar(): Argument #2 ($value) must be of type string, int given
Closed, ResolvedPublicPRODUCTION ERROR

Description

Error
labels.normalized_message
[{reqId}] {exception_url}   TypeError: MediaWiki\Parser\ParserOutput::appendJsConfigVar(): Argument #2 ($value) must be of type string, int given, called in /srv/mediawiki/php-1.45.0-wmf.5/includes/parser/ParserOutput.php on line 2825
FrameLocationCall
from/srv/mediawiki/php-1.45.0-wmf.5/includes/parser/ParserOutput.php(1549)
#0/srv/mediawiki/php-1.45.0-wmf.5/includes/parser/ParserOutput.php(2825)MediaWiki\Parser\ParserOutput->appendJsConfigVar(string, int, string)
#1/srv/mediawiki/php-1.45.0-wmf.5/includes/parser/Parsoid/Config/DataAccess.php(475)MediaWiki\Parser\ParserOutput->collectMetadata(MediaWiki\Parser\ParserOutput)
#2/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wikitext/Wikitext.php(45)MediaWiki\Parser\Parsoid\Config\DataAccess->preprocessWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, MediaWiki\Parser\ParserOutput, string)
#3/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(985)Wikimedia\Parsoid\Wikitext\Wikitext::preprocessFragment(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\Fragments\WikitextPFragment, bool)
#4/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(1057)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->expandTemplate(Wikimedia\Parsoid\Wt2Html\TT\TemplateEncapsulator)
#5/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(1098)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->onTemplate(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#6/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/XMLTagBasedHandler.php(47)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->onTag(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#7/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(126)Wikimedia\Parsoid\Wt2Html\TT\XMLTagBasedHandler->process(array)
#8/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(180)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->processChunk(array)
#9/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(124)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->process(array, array)
#10/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Utils/PipelineUtils.php(135)Wikimedia\Parsoid\Wt2Html\ParserPipeline->parse(string, array)
#11/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Ext/ParsoidExtensionAPI.php(434)Wikimedia\Parsoid\Utils\PipelineUtils::processContentInPipeline(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\Wt2Html\Frame, string, array)
#12/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Ext/ParsoidExtensionAPI.php(485)Wikimedia\Parsoid\Ext\ParsoidExtensionAPI->wikitextToDOM(string, array, bool)
#13/srv/mediawiki/php-1.45.0-wmf.5/extensions/Cite/src/Parsoid/RefTagHandler.php(60)Wikimedia\Parsoid\Ext\ParsoidExtensionAPI->extTagToDOM(array, string, array)
#14/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/ExtensionHandler.php(116)Cite\Parsoid\RefTagHandler->sourceToDom(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI, string, array)
#15/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/ExtensionHandler.php(275)Wikimedia\Parsoid\Wt2Html\TT\ExtensionHandler->onExtension(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#16/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/XMLTagBasedHandler.php(47)Wikimedia\Parsoid\Wt2Html\TT\ExtensionHandler->onTag(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#17/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(126)Wikimedia\Parsoid\Wt2Html\TT\XMLTagBasedHandler->process(array)
#18/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(180)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->processChunk(array)
#19/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(124)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->process(array, array)
#20/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Utils/PipelineUtils.php(135)Wikimedia\Parsoid\Wt2Html\ParserPipeline->parse(string, array)
#21/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Utils/PipelineUtils.php(218)Wikimedia\Parsoid\Utils\PipelineUtils::processContentInPipeline(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\Wt2Html\PageConfigFrame, string, array)
#22/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(590)Wikimedia\Parsoid\Utils\PipelineUtils::processTemplateSource(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\Wt2Html\PageConfigFrame, Wikimedia\Parsoid\Tokens\SelfclosingTagTk, array, string, array)
#23/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(1029)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->processTemplateSource(Wikimedia\Parsoid\Wt2Html\PageConfigFrame, Wikimedia\Parsoid\Tokens\SelfclosingTagTk, array, string, array)
#24/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(1057)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->expandTemplate(Wikimedia\Parsoid\Wt2Html\TT\TemplateEncapsulator)
#25/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/TemplateHandler.php(1098)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->onTemplate(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#26/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TT/XMLTagBasedHandler.php(47)Wikimedia\Parsoid\Wt2Html\TT\TemplateHandler->onTag(Wikimedia\Parsoid\Tokens\SelfclosingTagTk)
#27/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(126)Wikimedia\Parsoid\Wt2Html\TT\XMLTagBasedHandler->process(array)
#28/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(190)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->processChunk(array)
#29/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TokenHandlerPipeline.php(188)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->processChunkily(string, array)
#30/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/TreeBuilder/TreeBuilderStage.php(494)Wikimedia\Parsoid\Wt2Html\TokenHandlerPipeline->processChunkily(string, array)
#31[internal function]Wikimedia\Parsoid\Wt2Html\TreeBuilder\TreeBuilderStage->processChunkily(string, array)
#32/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(188)Generator->current()
#33/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(164)Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->processChunkily(string, array)
#34/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(610)Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#35/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(187)Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#36/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Parsoid.php(201)Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM(Wikimedia\Parsoid\Ext\ParsoidExtensionAPI, null)
#37/srv/mediawiki/php-1.45.0-wmf.5/vendor/wikimedia/parsoid/src/Parsoid.php(267)Wikimedia\Parsoid\Parsoid->parseWikitext(MediaWiki\Parser\Parsoid\Config\PageConfig, MediaWiki\Parser\ParserOutput, array, null)
#38/srv/mediawiki/php-1.45.0-wmf.5/includes/parser/Parsoid/ParsoidParser.php(166)Wikimedia\Parsoid\Parsoid->wikitext2html(MediaWiki\Parser\Parsoid\Config\PageConfig, array, null, MediaWiki\Parser\ParserOutput)
#39/srv/mediawiki/php-1.45.0-wmf.5/includes/parser/Parsoid/ParsoidParser.php(296)MediaWiki\Parser\Parsoid\ParsoidParser->genParserOutput(MediaWiki\Parser\Parsoid\Config\PageConfig, MediaWiki\Parser\ParserOptions, null)
#40/srv/mediawiki/php-1.45.0-wmf.5/includes/content/WikitextContentHandler.php(382)MediaWiki\Parser\Parsoid\ParsoidParser->parse(string, MediaWiki\Title\Title, MediaWiki\Parser\ParserOptions, bool, bool, int, null)
#41/srv/mediawiki/php-1.45.0-wmf.5/includes/content/ContentHandler.php(1693)MediaWiki\Content\WikitextContentHandler->fillParserOutput(MediaWiki\Content\WikitextContent, MediaWiki\Content\Renderer\ContentParseParams, MediaWiki\Parser\ParserOutput)
#42/srv/mediawiki/php-1.45.0-wmf.5/includes/content/Renderer/ContentRenderer.php(75)MediaWiki\Content\ContentHandler->getParserOutput(MediaWiki\Content\WikitextContent, MediaWiki\Content\Renderer\ContentParseParams)
#43/srv/mediawiki/php-1.45.0-wmf.5/includes/Revision/RenderedRevision.php(261)MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(MediaWiki\Content\WikitextContent, MediaWiki\Page\PageIdentityValue, MediaWiki\Revision\RevisionStoreCacheRecord, MediaWiki\Parser\ParserOptions, array)
#44/srv/mediawiki/php-1.45.0-wmf.5/includes/Revision/RenderedRevision.php(233)MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(MediaWiki\Content\WikitextContent, array)
#45/srv/mediawiki/php-1.45.0-wmf.5/includes/Revision/RevisionRenderer.php(236)MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string, array)
#46/srv/mediawiki/php-1.45.0-wmf.5/includes/Revision/RevisionRenderer.php(169)MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, MediaWiki\Parser\ParserOptions, array)
#47/srv/mediawiki/php-1.45.0-wmf.5/includes/Revision/RenderedRevision.php(196)MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#48/srv/mediawiki/php-1.45.0-wmf.5/includes/page/ParserOutputAccess.php(504)MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#49/srv/mediawiki/php-1.45.0-wmf.5/includes/page/ParserOutputAccess.php(598)MediaWiki\Page\ParserOutputAccess->renderRevision(MediaWiki\Page\WikiPage, MediaWiki\Parser\ParserOptions, MediaWiki\Revision\RevisionStoreCacheRecord, int)
#50/srv/mediawiki/php-1.45.0-wmf.5/includes/poolcounter/PoolCounterWorkViaCallback.php(81)MediaWiki\Page\ParserOutputAccess->MediaWiki\Page\{closure}()
#51/srv/mediawiki/php-1.45.0-wmf.5/includes/poolcounter/PoolCounterWork.php(173)MediaWiki\PoolCounter\PoolCounterWorkViaCallback->doWork()
#52/srv/mediawiki/php-1.45.0-wmf.5/includes/page/ParserOutputAccess.php(408)MediaWiki\PoolCounter\PoolCounterWork->execute()
#53/srv/mediawiki/php-1.45.0-wmf.5/includes/page/Article.php(835)MediaWiki\Page\ParserOutputAccess->getParserOutput(MediaWiki\Page\WikiPage, MediaWiki\Parser\ParserOptions, MediaWiki\Revision\RevisionStoreCacheRecord, int)
#54/srv/mediawiki/php-1.45.0-wmf.5/includes/page/Article.php(551)MediaWiki\Page\Article->generateContentOutput(MediaWiki\User\User, MediaWiki\Parser\ParserOptions, int, MediaWiki\Output\OutputPage, array)
#55/srv/mediawiki/php-1.45.0-wmf.5/includes/actions/ViewAction.php(84)MediaWiki\Page\Article->view()
#56/srv/mediawiki/php-1.45.0-wmf.5/includes/actions/ActionEntryPoint.php(728)MediaWiki\Actions\ViewAction->show()
#57/srv/mediawiki/php-1.45.0-wmf.5/includes/actions/ActionEntryPoint.php(505)MediaWiki\Actions\ActionEntryPoint->performAction(MediaWiki\Page\Article, MediaWiki\Title\Title)
#58/srv/mediawiki/php-1.45.0-wmf.5/includes/actions/ActionEntryPoint.php(143)MediaWiki\Actions\ActionEntryPoint->performRequest()
#59/srv/mediawiki/php-1.45.0-wmf.5/includes/MediaWikiEntryPoint.php(198)MediaWiki\Actions\ActionEntryPoint->execute()
#60/srv/mediawiki/php-1.45.0-wmf.5/index.php(58)MediaWiki\MediaWikiEntryPoint->run()
#61/srv/mediawiki/w/index.php(3)require(string)
#62{main}
Notes

10 of these since rolling 1.45.0-wmf.5 (T392175) to group1, so far just for a couple of wiktionaries and enwikivoyage.

Event Timeline

brennen triaged this task as Unbreak Now! priority.Jun 12 2025, 3:11 PM

This has increased in volume to around 500 in the last hour. Elevating to a train blocker.

Subscribed to understand the root cause and determine if there is an opportunity for improvement to QA processes in preventing these blockers.

Change #1156390 had a related patch set uploaded (by Arlolra; author: Arlolra):

[mediawiki/core@master] [WIP] Cast array key to string

https://gerrit.wikimedia.org/r/1156390

Welcome to my favorite misfeature of PHP: numeric strings used as keys to associative arrays are silently converted to ints. I count 16 (string) casts in ParserOutput alone which are all due to this same misfeature. phan doesn't flag this, likely because the false positive rate would be high. I've changed a number of APIs to make the problem less likely to occur for clients, for example ParserOutput::getCategoryNames() returns a list<string> which in connection with ParserOutput::getCategorySortKey() avoiding the problems of the previous interface (::getCategoryMap()) which exported a array<string,string> directly which was really/secretly an array<string|int,string> trapping the unwary (::getCategoryMap() at least documents the correct type now).

(ParserOutput::getLinkList() is another API I added to avoid folks falling into traps with numeric titles.)

Anyway, the error is being thrown because 9fd20c39e9946ffe7817be6f695728e6ab6ecf81 switched ParserOutput to declare( strict_types = 1 );. Hopefully as we slowly transition mediawiki-core to strict types we'll find and fix more of these.

@Arlolra's patch is good and should be backported.

@Arlolra's patch is good and should be backported.

Thanks both. I'll handle the backport shortly.

Change #1156404 had a related patch set uploaded (by Brennen Bearnes; author: Arlolra):

[mediawiki/core@wmf/1.45.0-wmf.5] ParserOutput::collectMetadata: Cast array keys to string

https://gerrit.wikimedia.org/r/1156404

Change #1156390 merged by jenkins-bot:

[mediawiki/core@master] ParserOutput::collectMetadata: Cast array keys to string

https://gerrit.wikimedia.org/r/1156390

Change #1156404 merged by jenkins-bot:

[mediawiki/core@wmf/1.45.0-wmf.5] ParserOutput::collectMetadata: Cast array keys to string

https://gerrit.wikimedia.org/r/1156404

Mentioned in SAL (#wikimedia-operations) [2025-06-12T17:59:27Z] <brennen@deploy1003> Started scap sync-world: Backport for [[gerrit:1156404|ParserOutput::collectMetadata: Cast array keys to string (T396656)]]

Mentioned in SAL (#wikimedia-operations) [2025-06-12T18:01:52Z] <brennen@deploy1003> brennen: Backport for [[gerrit:1156404|ParserOutput::collectMetadata: Cast array keys to string (T396656)]] synced to the testservers (see https://wikitech.wikimedia.org/wiki/Mwdebug). Changes can now be verified there.

Mentioned in SAL (#wikimedia-operations) [2025-06-12T18:10:19Z] <brennen@deploy1003> Finished scap sync-world: Backport for [[gerrit:1156404|ParserOutput::collectMetadata: Cast array keys to string (T396656)]] (duration: 10m 51s)

brennen claimed this task.

Confirming fixed in production. Thanks all.