Page MenuHomePhabricator

WikifunctionsPFragmentHandler: Response empty string causes PHP exception
Closed, ResolvedPublicBUG REPORT

Description

Description

A function call that renders an empty string as a result

{{#function:Z10000||}}

Throws a PHP exception:

2025-04-10 14:07:10 befe9d397078 my_wiki: [b53c87eaeb0035724bb8f98e] /w/api.php   PHP Warning: Attempt to read property "ownerDocument" on null
#0 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/PipelineUtils.php(777): MediaWiki\Exception\MWExceptionHandler::handleError()
#1 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOM/Handlers/UnpackDOMFragments.php(150): Wikimedia\Parsoid\Utils\PipelineUtils::addSpanWrappers()
#2 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(110): Wikimedia\Parsoid\Wt2Html\DOM\Handlers\UnpackDOMFragments::handler()
#3 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(188): Wikimedia\Parsoid\Utils\DOMTraverser->callHandlers()
#4 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(202): Wikimedia\Parsoid\Utils\DOMTraverser->traverseInternal()
#5 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(202): Wikimedia\Parsoid\Utils\DOMTraverser->traverseInternal()
#6 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(144): Wikimedia\Parsoid\Utils\DOMTraverser->traverseInternal()
#7 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOM/Processors/DOMPPTraverser.php(43): Wikimedia\Parsoid\Utils\DOMTraverser->traverse()
#8 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(132): Wikimedia\Parsoid\Wt2Html\DOM\Processors\DOMPPTraverser->run()
#9 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(171): Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->doPostProcess()
#10 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(189): Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->process()
#11 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(164): Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->processChunkily()
#12 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(590): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily()
#13 /var/www/html/w/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(183): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse()
#14 /var/www/html/w/vendor/wikimedia/parsoid/src/Parsoid.php(198): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM()
#15 /var/www/html/w/vendor/wikimedia/parsoid/src/Parsoid.php(264): Wikimedia\Parsoid\Parsoid->parseWikitext()
#16 /var/www/html/w/includes/parser/Parsoid/ParsoidParser.php(164): Wikimedia\Parsoid\Parsoid->wikitext2html()
#17 /var/www/html/w/includes/parser/Parsoid/ParsoidParser.php(294): MediaWiki\Parser\Parsoid\ParsoidParser->genParserOutput()
#18 /var/www/html/w/includes/content/WikitextContentHandler.php(380): MediaWiki\Parser\Parsoid\ParsoidParser->parse()
#19 /var/www/html/w/includes/content/ContentHandler.php(1684): MediaWiki\Content\WikitextContentHandler->fillParserOutput()
#20 /var/www/html/w/includes/content/Renderer/ContentRenderer.php(75): MediaWiki\Content\ContentHandler->getParserOutput()
#21 /var/www/html/w/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput()
#22 /var/www/html/w/includes/Revision/RenderedRevision.php(233): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached()
#23 /var/www/html/w/includes/Revision/RevisionRenderer.php(236): MediaWiki\Revision\RenderedRevision->getSlotParserOutput()
#24 /var/www/html/w/includes/Revision/RevisionRenderer.php(169): MediaWiki\Revision\RevisionRenderer->combineSlotOutput()
#25 /var/www/html/w/includes/Revision/RenderedRevision.php(196): MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}()
#26 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(943): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#27 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(892): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->parseUncacheable()
#28 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(635): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutputInternal()
#29 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(493): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutput()
#30 /var/www/html/w/extensions/VisualEditor/includes/DirectParsoidClient.php(178): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getHtml()
#31 /var/www/html/w/extensions/VisualEditor/includes/ApiParsoidTrait.php(147): MediaWiki\Extension\VisualEditor\DirectParsoidClient->transformWikitext()
#32 /var/www/html/w/extensions/VisualEditor/includes/ApiVisualEditor.php(499): MediaWiki\Extension\VisualEditor\ApiVisualEditor->transformWikitext()
#33 /var/www/html/w/includes/api/ApiMain.php(2005): MediaWiki\Extension\VisualEditor\ApiVisualEditor->execute()
#34 /var/www/html/w/includes/api/ApiMain.php(947): MediaWiki\Api\ApiMain->executeAction()
#35 /var/www/html/w/includes/api/ApiMain.php(918): MediaWiki\Api\ApiMain->executeActionWithErrorHandling()
#36 /var/www/html/w/includes/api/ApiEntryPoint.php(152): MediaWiki\Api\ApiMain->execute()
#37 /var/www/html/w/includes/MediaWikiEntryPoint.php(202): MediaWiki\Api\ApiEntryPoint->execute()
#38 /var/www/html/w/api.php(44): MediaWiki\MediaWikiEntryPoint->run()
#39 {main}
2025-04-10 14:07:10 befe9d397078 my_wiki: [b53c87eaeb0035724bb8f98e] /w/api.php   Wikimedia\Assert\InvariantException: Invariant failed: Expected an element
#0 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMUtils.php(144): Wikimedia\Assert\Assert::invariant()
#1 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOM/Handlers/UnpackDOMFragments.php(154): Wikimedia\Parsoid\Utils\DOMUtils::assertElt()
#2 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(110): Wikimedia\Parsoid\Wt2Html\DOM\Handlers\UnpackDOMFragments::handler()
#3 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(188): Wikimedia\Parsoid\Utils\DOMTraverser->callHandlers()
#4 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(202): Wikimedia\Parsoid\Utils\DOMTraverser->traverseInternal()
#5 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(202): Wikimedia\Parsoid\Utils\DOMTraverser->traverseInternal()
#6 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMTraverser.php(144): Wikimedia\Parsoid\Utils\DOMTraverser->traverseInternal()
#7 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOM/Processors/DOMPPTraverser.php(43): Wikimedia\Parsoid\Utils\DOMTraverser->traverse()
#8 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(132): Wikimedia\Parsoid\Wt2Html\DOM\Processors\DOMPPTraverser->run()
#9 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(171): Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->doPostProcess()
#10 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/DOMProcessorPipeline.php(189): Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->process()
#11 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(164): Wikimedia\Parsoid\Wt2Html\DOMProcessorPipeline->processChunkily()
#12 /var/www/html/w/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(590): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily()
#13 /var/www/html/w/vendor/wikimedia/parsoid/src/Wikitext/ContentModelHandler.php(183): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse()
#14 /var/www/html/w/vendor/wikimedia/parsoid/src/Parsoid.php(198): Wikimedia\Parsoid\Wikitext\ContentModelHandler->toDOM()
#15 /var/www/html/w/vendor/wikimedia/parsoid/src/Parsoid.php(264): Wikimedia\Parsoid\Parsoid->parseWikitext()
#16 /var/www/html/w/includes/parser/Parsoid/ParsoidParser.php(164): Wikimedia\Parsoid\Parsoid->wikitext2html()
#17 /var/www/html/w/includes/parser/Parsoid/ParsoidParser.php(294): MediaWiki\Parser\Parsoid\ParsoidParser->genParserOutput()
#18 /var/www/html/w/includes/content/WikitextContentHandler.php(380): MediaWiki\Parser\Parsoid\ParsoidParser->parse()
#19 /var/www/html/w/includes/content/ContentHandler.php(1684): MediaWiki\Content\WikitextContentHandler->fillParserOutput()
#20 /var/www/html/w/includes/content/Renderer/ContentRenderer.php(75): MediaWiki\Content\ContentHandler->getParserOutput()
#21 /var/www/html/w/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput()
#22 /var/www/html/w/includes/Revision/RenderedRevision.php(233): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached()
#23 /var/www/html/w/includes/Revision/RevisionRenderer.php(236): MediaWiki\Revision\RenderedRevision->getSlotParserOutput()
#24 /var/www/html/w/includes/Revision/RevisionRenderer.php(169): MediaWiki\Revision\RevisionRenderer->combineSlotOutput()
#25 /var/www/html/w/includes/Revision/RenderedRevision.php(196): MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}()
#26 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(943): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#27 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(892): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->parseUncacheable()
#28 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(635): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutputInternal()
#29 /var/www/html/w/includes/Rest/Handler/Helper/HtmlOutputRendererHelper.php(493): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getParserOutput()
#30 /var/www/html/w/extensions/VisualEditor/includes/DirectParsoidClient.php(178): MediaWiki\Rest\Handler\Helper\HtmlOutputRendererHelper->getHtml()
#31 /var/www/html/w/extensions/VisualEditor/includes/ApiParsoidTrait.php(147): MediaWiki\Extension\VisualEditor\DirectParsoidClient->transformWikitext()
#32 /var/www/html/w/extensions/VisualEditor/includes/ApiVisualEditor.php(499): MediaWiki\Extension\VisualEditor\ApiVisualEditor->transformWikitext()
#33 /var/www/html/w/includes/api/ApiMain.php(2005): MediaWiki\Extension\VisualEditor\ApiVisualEditor->execute()
#34 /var/www/html/w/includes/api/ApiMain.php(947): MediaWiki\Api\ApiMain->executeAction()
#35 /var/www/html/w/includes/api/ApiMain.php(918): MediaWiki\Api\ApiMain->executeActionWithErrorHandling()
#36 /var/www/html/w/includes/api/ApiEntryPoint.php(152): MediaWiki\Api\ApiMain->execute()
#37 /var/www/html/w/includes/MediaWikiEntryPoint.php(202): MediaWiki\Api\ApiEntryPoint->execute()
#38 /var/www/html/w/api.php(44): MediaWiki\MediaWikiEntryPoint->run()
#39 {main}

Completion checklist

Event Timeline

Change #1147034 had a related patch set uploaded (by Genoveva Galarza; author: Genoveva Galarza):

[mediawiki/extensions/WikiLambda@master] Overwrite LiteralStringPFragment::asDom for empty values

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

@cscott LiteralStringPFragment::asDom fails when the value is an empty string and it returns DocumentFragment without a child node in it.
I'm just pushing a Wikilambda patch to overwrites asDom in WikifunctionsPFragment, but wanted to get your eyes in here, in case LiteralStringPFragment needs fixin

gengh changed the task status from Open to In Progress.May 16 2025, 5:23 PM

Change #1147034 merged by jenkins-bot:

[mediawiki/extensions/WikiLambda@master] Overwrite LiteralStringPFragment::asDom for empty values

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