Upstream repros
Generated from repros/README.md when the site was built at 7aa23e2.
Minimal standalone repros of the upstream bugs niso works around, and of the
layout bugs the Acid tests found (tests/acid). Each directory is its own cargo
project depending directly on the upstream crate at niso’s pinned revision
(blitz be60597, stylo 2dca345, parley through the oofdere/parley fork 00cbfc6,
or plain parley 0.12.0 where the fork already has the fix). cargo run exits
1 while the bug reproduces. Each README says what niso does about it, expected
against actual, whether the crate’s current main still has it, any existing
issue or PR, and an issue text ready to file. None has been filed.
ios-chronod-dismissed-activity-reload-loop is an iOS app rather than a cargo
project: its repro.sh runs it on a simulator and exits 1 while the bug
reproduces.
The porffor-* directories are JS repros described in docs/engines/porffor.md.
quickjs-date-now-hook is a patch rather than a repro: it adds
JS_SetDateNowFunc to QuickJS-ng so Date can read niso’s clock, with a
test.sh that applies it to a scratch copy and runs QuickJS-ng’s api-test.
| Repro | Bug | Upstream main | Issue or PR |
|---|---|---|---|
| blitz-dom-bounding-rect-fixed-scroll | get_client_bounding_rect moves position: fixed boxes with the viewport scroll |
reproduces | none |
| blitz-dom-bounding-rect-scroller-own-offset | get_client_bounding_rect moves a scroller’s own box by its scroll offset |
reproduces | none |
| blitz-dom-child-list-quadratic | removing or moving a node costs O(siblings) (index_of_child, then retain), so n removals or moves cost n² |
same code on main | none; DioxusLabs/blitz#1232 (open) caches the index only |
| blitz-dom-animation-state-hidden-by-canvas | with a <canvas src>, nothing public tells whether CSS animations need ticks; may_have_animations stays set for paused, forwards-filled and finished ones |
not checked | none searched |
| blitz-dom-cssom-inline-style-round-trip | no inline-style edit keeps both: style_attr_set_property + set_attribute reparses the six-digit serialization, set_style_property leaves the style attribute stale |
same code on main | none |
| blitz-dom-focussed-node-root-fallback | get_focussed_node_id returns the root element when nothing has focus |
reproduces | none |
| blitz-dom-hit-ignores-clips | Node::hit finds boxes that overflow clips and clip-path hide |
same code on main | none |
| blitz-dom-hidden-containing-block-keeps-hoisted | a containing block laid out as display: none keeps its hoisted out-of-flow boxes, so layout panics (“invalid SlotMap key used”) once one is freed |
same code on main | none |
| blitz-dom-inline-keeps-layout-children | an element with children restyled from a box (block, inline-block, flow-root) to inline keeps layout children whose layout_parent is the inline root, so debug builds panic in resolve |
not checked | none searched |
| blitz-dom-inline-rect-line-height | an inline’s rect has the line box’s height, not its content area’s | reproduces | none |
| blitz-dom-inline-rect-trailing-space | an inline’s rect includes the space hanging at the end of a wrapped line | reproduces | none for rects; DioxusLabs/blitz#1009 for painting |
| blitz-dom-legend-not-rendered | a fieldset’s legend is laid out as a full-width block inside the border, not a shrink-to-fit rendered legend on it | not checked | none searched |
| blitz-dom-namespaced-attribute-special-cased | attributes in a namespace get the special handling (style, id, class…) of the same-named attribute in no namespace |
reproduces | none; DioxusLabs/blitz#1292 fixes open only |
| blitz-dom-no-step-between-style-and-layout | no public step between styling and layout, so every resolve restyles animating elements before laying out an embedder’s style edits (niso’s text scale); includes a patch, and niso’s side of it |
not checked | none searched |
| blitz-dom-outer-html-serialization | outer_html drops comments and template contents, writes <p /> |
reproduces | DioxusLabs/blitz#1204 fixes part |
| blitz-dom-overflow-propagation | the body’s overflow doesn’t propagate to the viewport, so the body scrolls and clips instead of the document; overflow-propagation.patch fixes it |
reproduces (by inspection) | none |
| blitz-dom-quirks-mode-ignored | the doctype’s quirks mode is never applied | reproduces | none |
| blitz-dom-subtree-walk-recursive | iter_subtree_mut recurses per level, so connecting or removing a ~100k-deep subtree overflows an 8 MiB stack |
same code on main | none |
| blitz-dom-table-anonymous-boxes | non-table-internal children of a table are dropped | reproduces | DioxusLabs/blitz#1430; fixed by #1370 (open) |
| blitz-dom-table-cell-row-height | cells are not stretched to their row’s height | reproduces | fixed by DioxusLabs/blitz#1370 (open) |
| blitz-dom-table-row-box | rows and row groups have no box | reproduces | fixed by DioxusLabs/blitz#1370 (open) |
| blitz-html-doctype-dropped | the doctype is dropped; no DocumentType node | reproduces | none |
| fontique-android-roboto-flex-generic | Android sans-serif and system-ui are Roboto Flex, not Roboto |
same code (needs a device) | none |
| html5ever-p-in-button-scope-quadratic | each block start tag walks the whole stack of open elements, so nested <div>s parse in O(depth²) |
fixed (servo/html5ever#811 caps the stack at 512), unreleased | servo/html5ever#811 |
| icu-segmenter-non-complex-warns | the new_for_non_complex_scripts segmenters print “No segmentation model” to stderr for every CJK or Southeast Asian run in debug builds |
same code on main | linebender/parley#623 (parley side); none in ICU4X |
| ios-chronod-dismissed-activity-reload-loop | after a restart, chronod keeps reloading a Live Activity the app ended before SpringBoard’s restored scene subscribed (“Could not find a descriptor”), retrying every ~10.7 minutes | reproduces on iOS 27.0 (24A434), simulator | none; Feedback not filed |
| parley-strut-zero-height-inline-box | a line holding only a zero-height inline box gets no strut | fixed (linebender/parley#902), unreleased | linebender/parley#902 |
| parley-trak-scaled-point-size | trak looked up at the device-scaled size |
fixed (linebender/parley#942), unreleased | linebender/parley#942 |
| porffor-local-module-pulls-node-runtime | a local named module compiles in Porffor’s Node runtime (module system, Buffer, url with ada), and the native program exits 1 with ReferenceError: module#… is not defined |
not checked (alpha 22 is the newest release) | none |
| rust-url-wpt-url-spec-gaps | url 2.5.8 differs from the URL Standard: ASCII domains, opaque-path trailing spaces, file hosts, blob origins, /// |
reproduces; ASCII domains fixed by servo/rust-url#1170 (open), part of file URLs by #1166 (open) | servo/rust-url#1170, #1166, #1164, #504; none for opaque paths or blob origins |
| stylo-app-units-per-device-pixel-truncated | servo’s app units per device pixel truncate (22 at ratio 2.625, Gecko 23), so a 3px border is 2.933px | same code on main | none |
| stylo-accent-color-gecko-only | accent-color is engine = "gecko", so servo drops it |
reproduces | none |
| stylo-color-animation-weights-cancel | a colour animated at progress 2^31 gets f32 weights that sum to 0, and mix_many returns the start colour |
reproduces | none |
| stylo-dir-pseudo-class-gecko-only | :dir() is Gecko-only, so servo-engine selectors with it fail to parse |
reproduces | none |
| stylo-servo-viewport-variants-and-safe-area | servo resolves sv*, lv* and dv* like vh and its env(safe-area-inset-*) is always 0, with no MediaData input for either, so a viewport-fit=cover page cannot find the safe area or the viewport the bars leave it; includes a patch |
same code on main | none |
| stylo-servo-user-preference-media-features | servo has no prefers-reduced-motion, prefers-reduced-transparency or prefers-contrast, and its system colors (AccentColor…) are hard-coded with no embedder input; includes a patch |
reproduces | servo/stylo#288 (approved, stale; predates MediaData), servo/stylo#477; none for system colors |