Page MenuHomePhabricator

PHP Notice: Undefined property: Wikimedia\Parsoid\NodeData\DataParsoid::$tsr
Closed, ResolvedPublicPRODUCTION ERROR

Description

Stack Trace:
from /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(99)
#0 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(99): MWExceptionHandler::handleError(integer, string, string, integer, array)
#1 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(225): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::insertTransclusionMetas(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\DOM\Compat\Element)
#2 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#3 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#4 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#5 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#6 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#7 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#8 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#9 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#10 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#11 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#12 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#13 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(235): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#14 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/PP/Processors/MarkFosteredContent.php(249): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent::processRecursively(Wikimedia\Parsoid\DOM\Compat\Element, Wikimedia\Parsoid\Config\Env)
#15 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(160): Wikimedia\Parsoid\Wt2Html\PP\Processors\MarkFosteredContent->run(Wikimedia\Parsoid\Config\Env, Wikimedia\Parsoid\DOM\Compat\Element, array, boolean)
#16 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(986): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->Wikimedia\Parsoid\Wt2Html\{closure}(Wikimedia\Parsoid\DOM\Compat\Element, array, boolean)
#17 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(1027): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->doPostProcess(Wikimedia\Parsoid\DOM\Compat\Element)
#18 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/DOMPostProcessor.php(1045): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->process(Wikimedia\Parsoid\DOM\Compat\Element)
#19 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipeline.php(180): Wikimedia\Parsoid\Wt2Html\DOMPostProcessor->processChunkily(string, array)
#20 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Wt2Html/ParserPipelineFactory.php(308): Wikimedia\Parsoid\Wt2Html\ParserPipeline->parseChunkily(string, array)
#21 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Core/WikitextContentModelHandler.php(106): Wikimedia\Parsoid\Wt2Html\ParserPipelineFactory->parse(string)
#22 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Parsoid.php(166): Wikimedia\Parsoid\Core\WikitextContentModelHandler->toDOM(Wikimedia\Parsoid\Config\Env)
#23 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/src/Parsoid.php(198): Wikimedia\Parsoid\Parsoid->parseWikitext(MWParsoid\Config\PageConfig, array)
#24 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/extension/src/Rest/Handler/ParsoidHandler.php(584): Wikimedia\Parsoid\Parsoid->wikitext2html(MWParsoid\Config\PageConfig, array, NULL)
#25 /srv/mediawiki/php-1.38.0-wmf.17/vendor/wikimedia/parsoid/extension/src/Rest/Handler/PageHandler.php(88): MWParsoid\Rest\Handler\ParsoidHandler->wt2html(MWParsoid\Config\PageConfig, array)
#26 /srv/mediawiki/php-1.38.0-wmf.17/includes/Rest/Router.php(414): MWParsoid\Rest\Handler\PageHandler->execute()
#27 /srv/mediawiki/php-1.38.0-wmf.17/includes/Rest/Router.php(338): MediaWiki\Rest\Router->executeHandler(MWParsoid\Rest\Handler\PageHandler)
#28 /srv/mediawiki/php-1.38.0-wmf.17/includes/Rest/EntryPoint.php(167): MediaWiki\Rest\Router->execute(MediaWiki\Rest\RequestFromGlobals)
#29 /srv/mediawiki/php-1.38.0-wmf.17/includes/Rest/EntryPoint.php(132): MediaWiki\Rest\EntryPoint->execute()
#30 /srv/mediawiki/php-1.38.0-wmf.17/rest.php(31): MediaWiki\Rest\EntryPoint::main()
#31 /srv/mediawiki/w/rest.php(3): require(string)
#32 {main}

Details

Request URL
https://it.wikipedia.org/w/rest.php/it.wikipedia.org/v3/page/pagebundle/Mens_Sana_Basketball_Academy/125130054

Event Timeline

Arlolra triaged this task as Medium priority.Jan 18 2022, 8:49 PM
Arlolra moved this task from Needs Triage to Bugs & Crashers on the Parsoid board.
Arlolra subscribed.

Isolated crasher,

|-{{Roster PC/inizio

|larghezza_percentuale = 100

|squadra = Mens Sana Basketball Academy 2019-2020

|sfondo1 = #228b22

|colore1 = #ffffff

|sfondo2 = #000000

|colore2 = #ffffff

|altezza = 

|peso = 

}}

{{Roster PC|n°=0|nazione=ITA|ruolo=GA|nome=Niccolò Carapelli|anno=2001|altezza=186|peso=80}}

The underlying problem can be seen with this snippet below.

[subbu@earth:~/work/wmf/parsoid] echo "|-{{1x|a}}" | php bin/parse.php --dump tplsrc
[dump/tplsrc] ================================================================================
[dump/tplsrc] TEMPLATE: Template:1x ; TRANSCLUSION: "{{1x|a}}"
[dump/tplsrc] --------------------------------------------------------------------------------
[dump/tplsrc] a
[dump/tplsrc] --------------------------------------------------------------------------------
[dump/tplsrc] ================================================================================
[dump/tplsrc] TEMPLATE: Template:1x ; TRANSCLUSION: "{{1x|a}}"
[dump/tplsrc] --------------------------------------------------------------------------------
[dump/tplsrc] a
[dump/tplsrc] --------------------------------------------------------------------------------
<p data-parsoid='{"dsr":[0,10,0,0]}'>|-<span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]],"dsr":[2,10,null,null]}' data-mw='{"parts":[{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span></p>

While the output is correct, the template is being expanded twice. In this case, it is just wasteful duplicate processing.
But, when the template argument is a table (as below), somehow the table is included twice for some reason which then messes up fostering code when the table is not closed.

[subbu@earth:~/work/wmf/parsoid] cat /tmp/wt
|-{{1x|
{{{!}}
{{!}}foo
{{!}}}
}}

[subbu@earth:~/work/wmf/parsoid] php bin/parse.php < /tmp/wt
<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"dsr":[0,33,0,0],"pi":[[{"k":"1"}],[{"k":"1"}]],"firstWikitextNode":"TR"}' data-mw='{"parts":["|-",{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"\n{{{!}}\n{{!}}foo\n{{!}}}\n"}},"i":0}},{"template":{"target":{"wt":"1x","href":"./Template:1x"},"params":{"1":{"wt":"\n{{{!}}\n{{!}}foo\n{{!}}}\n"}},"i":1}}]}'>|-</p><span about="#mwt1">
</span><table about="#mwt1">
<tbody><tr><td>foo</td></tr>
</tbody></table><span about="#mwt1">
</span><span about="#mwt1">
</span><table about="#mwt1">
<tbody><tr><td>foo</td></tr>
</tbody></table><span about="#mwt1">
</span>

I am certain this is the AttributeHandler fixups fighting with the TokenStreamPatcher fixups.

The AttributeHandler already extracts the content out of the the <tr> tag and splices it below (because it happens to have been a table). Now, TSP comes along, looks at token src, and re-expands it in place which duplicates the table and everything explodes.

See commit message of https://gerrit.wikimedia.org/r/c/mediawiki/services/parsoid/+/755039 for some relevant "hindsight is 20/20" wisdom.

But, I suppose we need a better handle on all the backtracking that we need to do in later parts of the pipeline because (a) we decouple template processing from the top-level, and (b) the PEG tokenizer generates the wrong tokens because of (a).

Change 766189 had a related patch set uploaded (by Subramanya Sastry; author: Subramanya Sastry):

[mediawiki/services/parsoid@master] AttributeExpander: Update token attributes/tsr correctly after processing

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

Change 766189 merged by jenkins-bot:

[mediawiki/services/parsoid@master] AttributeExpander: Update token attributes/tsr correctly after processing

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

Will go out on next week's train.

Change 768825 had a related patch set uploaded (by Subramanya Sastry; author: Subramanya Sastry):

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.15.0-a23

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

Change 768825 merged by jenkins-bot:

[mediawiki/vendor@master] Bump wikimedia/parsoid to 0.15.0-a23

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