fix(epub): retry a malformed XHTML section as HTML in loadDocument - #70
Merged
Conversation
A manifest can declare a section as application/xhtml+xml while the file is not well-formed XML. Adobe InDesign and Digital Editions ship an unclosed `<meta charset="utf-8">` constantly. The XML parser then hands back a `parsererror` document whose `body` is null. The render path already recovers from this: `loadReplaced` reparses as text/html when it sees a `parsererror` or a namespace-less root. `loadDocument`, which backs `Section.createDocument()`, did not, so every off-screen consumer got the error document instead of the chapter. Readest converts KOReader CREngine XPointers through `createDocument()` whenever the target section is not the rendered one, and walks `document.body.children` to resolve the path. Against a body-less error document that threw `TypeError: Cannot read properties of null (reading 'children')`, which silently killed cross-device reading progress sync. Refs: readest/readest#5625
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
A manifest can declare a section as
application/xhtml+xmlwhile the file is not well-formed XML. Adobe InDesign and Digital Editions ship an unclosed<meta charset="utf-8">constantly. The XML parser then hands back aparsererrordocument whosebodyis null.The render path already recovers from this.
loadReplacedreparses astext/htmlwhen it sees aparsererroror a namespace-less root:loadDocument, which backsSection.createDocument(), did not, so every off-screen consumer got the error document instead of the chapter.Impact
Readest converts KOReader CREngine XPointers through
createDocument()whenever the target section is not the rendered one, and walksdocument.body.childrento resolve the path. Against a body-less error document that threw:which silently killed cross-device reading progress sync.
Fix
Apply the same fallback in
loadDocument.Verification
Confirmed in real Chromium and WebKit (via Playwright) that for such a file
doc.body === nullanddoc.querySelector('parsererror')matches, so the same testloadReplaceduses is the right one here. Covered by a regression test in the Readest repo (foliate-epub-malformed-xhtml.test.ts) that builds an EPUB with a malformed chapter and asserts bothcreateDocument()and the full XPointer conversion; it reproduces theTypeErrorverbatim without this change.Refs: readest/readest#5625