Page MenuHomePhabricator

JsCalendar "Internal Error" when new pages are added
Closed, InvalidPublicBUG REPORT

Description

Steps to replicate the issue:

OR

<EventCalendar>
prefix=Sandbox/
dateFormat = Y-m-d
symbols = 500
</EventCalendar>

( *recently added = added today or yesterday (4th/5th March 2023), though likely it applies to pages added this month or even earlier. Not earlier than 4th October 2022 though, as that's when it still worked correctly. )


What happens?:

  • A: The page displays an internal error.
[82678c109be9dee8a50cadc0] 2023-03-05 11:13:13: Fatal exception of type "Exception"

Calendar-error error.png (306×1 px, 11 KB)

This happens when the recently added page that is targeted by the calendar includes certain characters. I don't know the exact pattern but at least lowercase o and the ^ symbol trigger this behavior.

  • B: The calendar displays correctly, but the event page contents are completely wrong. For example, test appears in the calendar as +I-. (none of the characters in test seem to trigger the internal error).

Calendar-error page.png (273×557 px, 7 KB)

Calendar-error calendar.png (257×1 px, 31 KB)

Please note that older pages display correctly. There seems to be something wrong with parsing contents of pages that have been recently added.


Examples on the wiki:


What should have happened instead?:
The calendar should display the events without any internal errors with the correct contents of these pages (as seen in the B scenario example with the older page).


Software version
MediaWiki 1.39.2


Other information:

  • I'm using Google Chrome, the result is the same regardless if using incognito mode or not. Purging or hard refreshing does nothing.
  • It's worth noting that the calendar works perfectly fine when the "symbols" parameter is not present or has an invalid value (like symbols = -1 or symbols = abc). Citing the documentation, the "symbols" parameter causes the entry in the calendar to display a certain amount of page contents instead of the page name:
Instead of the page name, a HTML snippet of the first N symbols can be shown for each event page. To enable, use the following parameter:

   symbols = 500

So the process of displaying page contents in the calendar has to contribute to the error somehow.

  • The date in the page name has no impact on this issue. Tested these scenarios, and none had any changes (older pages still displayed correctly, recently added ones triggered the error or displayed wrongly depending on their contents):
    • Moving an older page to a recent date (like 2023-03-02)
    • Moving a recently added page to an older or newer date (so that it doesn't appear in the current month)
    • deleting and undeleting a page
    • moving a recently added page to a name previously occupied by an older page
    • making an empty edit to an older page
  • Making a non-empty edit to an older page will cause it to behave like a recently-added page.
  • Please note that when testing on a calendar on a page (not ExpandTemplates), the page may need to be purged to display changes.
  • This is an issue similar to something that has been fixed on the side of our wiki's host (Miraheze) before, but is now caused by something different (that's why I'm reporting it here). On the Miraheze Phabricator, Universal_Omega checked the related error which is cited below:
In https://phabricator.miraheze.org/T9688, Universal_Omega wrote:

This is a different error:

preg_match_all error 4: Malformed UTF-8 characters, possibly incorrectly encoded
from /srv/mediawiki/w/includes/MagicWordArray.php(319)
#0 /srv/mediawiki/w/includes/parser/Parser.php(4116): MagicWordArray->matchAndRemove(string)
#1 /srv/mediawiki/w/includes/parser/Parser.php(1636): Parser->handleDoubleUnderscore(string)
#2 /srv/mediawiki/w/includes/parser/Parser.php(882): Parser->internalParse(string, boolean, boolean)
#3 /srv/mediawiki/w/includes/parser/Parser.php(906): Parser->recursiveTagParse(string, boolean)
#4 /srv/mediawiki/w/extensions/JsCalendar/includes/EventCalendar.php(192): Parser->recursiveTagParseFully(string)
#5 /srv/mediawiki/w/extensions/JsCalendar/includes/EventCalendar.php(348): MediaWiki\JsCalendar\EventCalendar::findEvents(array, Parser)
#6 /srv/mediawiki/w/extensions/JsCalendar/includes/Hooks.php(48): MediaWiki\JsCalendar\EventCalendar::renderEventCalendar(string, Parser)
#7 /srv/mediawiki/w/includes/parser/Parser.php(4023): MediaWiki\JsCalendar\Hooks::parserFunction(string, array, Parser, PPFrame_Hash)
#8 /srv/mediawiki/w/includes/parser/PPFrame_Hash.php(354): Parser->extensionSubstitution(array, PPFrame_Hash, boolean)
#9 /srv/mediawiki/w/includes/parser/Parser.php(2955): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#10 /srv/mediawiki/w/includes/parser/Parser.php(1610): Parser->replaceVariables(string)
#11 /srv/mediawiki/w/includes/parser/Parser.php(724): Parser->internalParse(string)
#12 /srv/mediawiki/w/includes/content/WikitextContentHandler.php(301): Parser->parse(string, Title, ParserOptions, boolean, boolean, integer)
#13 /srv/mediawiki/w/includes/content/ContentHandler.php(1721): WikitextContentHandler->fillParserOutput(WikitextContent, MediaWiki\Content\Renderer\ContentParseParams, ParserOutput)
#14 /srv/mediawiki/w/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(WikitextContent, MediaWiki\Content\Renderer\ContentParseParams)
#15 /srv/mediawiki/w/includes/Revision/RenderedRevision.php(266): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(WikitextContent, Title, integer, ParserOptions, boolean)
#16 /srv/mediawiki/w/includes/Revision/RenderedRevision.php(237): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(WikitextContent, boolean)
#17 /srv/mediawiki/w/includes/Revision/RevisionRenderer.php(221): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string, array)
#18 /srv/mediawiki/w/includes/Revision/RevisionRenderer.php(158): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, array)
#19 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#20 /srv/mediawiki/w/includes/Revision/RenderedRevision.php(199): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array)
#21 /srv/mediawiki/w/includes/poolcounter/PoolWorkArticleView.php(91): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#22 /srv/mediawiki/w/includes/poolcounter/PoolWorkArticleViewCurrent.php(97): PoolWorkArticleView->renderRevision()
#23 /srv/mediawiki/w/includes/poolcounter/PoolCounterWork.php(162): PoolWorkArticleViewCurrent->doWork()
#24 /srv/mediawiki/w/includes/page/ParserOutputAccess.php(299): PoolCounterWork->execute()
#25 /srv/mediawiki/w/includes/page/Article.php(714): MediaWiki\Page\ParserOutputAccess->getParserOutput(WikiPage, ParserOptions, MediaWiki\Revision\RevisionStoreCacheRecord, integer)
#26 /srv/mediawiki/w/includes/page/Article.php(528): Article->generateContentOutput(User, ParserOptions, integer, OutputPage, array)
#27 /srv/mediawiki/w/includes/actions/ViewAction.php(78): Article->view()
#28 /srv/mediawiki/w/includes/MediaWiki.php(542): ViewAction->show()
#29 /srv/mediawiki/w/includes/MediaWiki.php(322): MediaWiki->performAction(Article, Title)
#30 /srv/mediawiki/w/includes/MediaWiki.php(904): MediaWiki->performRequest()
#31 /srv/mediawiki/w/includes/MediaWiki.php(562): MediaWiki->main()
#32 /srv/mediawiki/w/index.php(50): MediaWiki->run()
#33 /srv/mediawiki/w/index.php(46): wfIndexMain()
#34 {main}