Loading…
Loading…
Dataset 20261011-0550-f160c57 · measured 2026-10-11 05:50 UTC
Web Platform Tests · 28,687 test files · 29,311 judged · 117 suites
ReflowPDF renders HTML and CSS to PDF, including paged media, without a browser. It runs the Web Platform Tests — the suite browsers are measured by — and counts them the way wpt.fyi counts a browser: a reftest is one test, a scripted file is its subtests.
Subtests
94.44%
54,743 of 57,968 subtests pass. A reftest is one subtest; a scripted file is counted by its assertions.
Tests
94.11%
27,584 of 29,311 tests pass. A test passes only when every subtest in it passes.
Score
94.68%
Averaged over 29,311 tests. A test without subtests scores 1; a test with subtests scores the fraction of its subtests that pass; the figure is the mean over tests. The definition is Servo’s.
1,488 files are not run at all. ReflowPDF has no JavaScript runtime, and these files state what they expect only from script. Counting them as failures gives 89.56% of 30,799 tests. There is no such figure for subtests: how many assertions a file we cannot run would have reported is not known.
Dataset 20261011-0550-f160c57, measured 11 Oct 2026, 05:50 UTC, engine 146bce3e. The raw verdicts are linked below.
The two rates answer different questions. Subtests say how much of what the suite asserts holds; tests say how many files hold completely. Neither hides the third line: what this engine cannot run at all. How we count. Why the number changed on 11 September 2026: How We Measure CSS Conformance on the Web Platform Tests.
The same run, read four ways. Pick whichever matches what you came to check.
The test suite and the property atlas measure different things. The test suite is self-contained: a test file and its reference are both rendered by our engine and compared, with no browser anywhere in the loop. It answers whether the engine agrees with the specification’s own definition of correct. The property atlas is the opposite: every example is drawn twice, once by us and once by Chrome, so it answers whether we agree with an outside implementation. Neither question subsumes the other, which is why both are here.
ReflowPDF has no JavaScript runtime, so it judges 25.6% of the subtests wpt.fyi measures in css/ (55,955 of 218,751). The percentages below are relative to what is judged.
| Area | Tests | Subtests | Score | Coverage |
|---|---|---|---|---|
| css/css-grid | 1,667/1,813 (92.0%) | 11,089/11,519 (96.3%) | 93.7% | 11,519/16,477 (69.9%) |
| css/CSS2 | 6,153/6,229 (98.8%) | 6,177/6,256 (98.7%) | 98.8% | 6,256/8,801 (71.1%) |
| css/css-flexbox | 1,174/1,220 (96.2%) | 4,692/4,816 (97.4%) | 97.9% | 4,816/5,787 (83.2%) |
| css/css-align | 190/199 (95.5%) | 2,354/2,388 (98.6%) | 98.2% | 2,388/5,364 (44.5%) |
| css/css-text | 1,559/1,623 (96.1%) | 2,300/2,366 (97.2%) | 96.3% | 2,366/7,160 (33%) |
| css/css-sizing | 640/655 (97.7%) | 1,895/1,927 (98.3%) | 98.4% | 1,927/6,548 (29.4%) |
| css/css-backgrounds | 738/774 (95.3%) | 1,354/1,398 (96.8%) | 95.9% | 1,398/6,960 (20.1%) |
| css/css-break | 1,204/1,217 (98.9%) | 1,281/1,294 (99.0%) | 98.9% | 1,294/1,917 (67.5%) |
| css/css-ui | 959/1,006 (95.3%) | 1,185/1,282 (92.4%) | 95.9% | 1,282/2,900 (44.2%) |
| css/css-writing-modes | 1,138/1,169 (97.3%) | 1,163/1,194 (97.4%) | 97.3% | 1,194/1,557 (76.7%) |
| css/css-transforms | 798/820 (97.3%) | 1,148/1,172 (98.0%) | 97.6% | 1,172/6,333 (18.5%) |
| css/css-fonts | 429/449 (95.5%) | 1,031/1,074 (96.0%) | 97.0% | 1,074/9,039 (11.9%) |
| css/css-tables | 238/259 (91.9%) | 909/1,037 (87.7%) | 96.9% | 1,037/1,122 (92.4%) |
| css/css-overflow | 603/641 (94.1%) | 896/951 (94.2%) | 94.6% | 951/1,821 (52.2%) |
| css/css-inline | 371/390 (95.1%) | 817/850 (96.1%) | 97.1% | 850/1,212 (70.1%) |
| css/css-multicol | 657/670 (98.1%) | 829/842 (98.5%) | 98.2% | 842/2,243 (37.5%) |
| css/css-masking | 399/462 (86.4%) | 756/826 (91.5%) | 87.0% | 826/6,894 (12%) |
| css/css-values | 217/249 (87.2%) | 678/741 (91.5%) | 88.3% | 741/10,612 (7%) |
| css/css-contain | 488/498 (98.0%) | 699/724 (96.5%) | 98.3% | 724/984 (73.6%) |
| css/css-images | 463/486 (95.3%) | 656/703 (93.3%) | 95.8% | 703/4,061 (17.3%) |
| css/css-text-decor | 340/352 (96.6%) | 686/698 (98.3%) | 97.1% | 698/1,693 (41.2%) |
| css/css-shapes | 260/278 (93.5%) | 643/679 (94.7%) | 95.5% | 679/7,752 (8.8%) |
| css/filter-effects | 336/362 (92.8%) | 608/669 (90.9%) | 93.0% | 669/3,362 (19.9%) |
| css/css-anchor-position | 221/285 (77.5%) | 555/650 (85.4%) | 78.8% | 650/13,918 (4.7%) |
| css/css-color | 315/325 (96.9%) | 630/641 (98.3%) | 97.2% | 641/12,966 (4.9%) |
| css/selectors | 396/411 (96.3%) | 613/631 (97.2%) | 97.3% | 631/6,412 (9.8%) |
| css/css-borders | 188/214 (87.8%) | 496/609 (81.4%) | 87.8% | 609/1,759 (34.6%) |
| css/css-display | 213/226 (94.3%) | 504/536 (94.0%) | 94.5% | 536/776 (69.1%) |
| css/css-logical | 56/60 (93.3%) | 485/489 (99.2%) | 99.2% | 489/1,372 (35.6%) |
| css/css-animations | 73/84 (86.9%) | 428/442 (96.8%) | 87.9% | 442/1,488 (29.7%) |
| css/css-lists | 191/197 (97.0%) | 416/425 (97.9%) | 98.2% | 425/1,159 (36.7%) |
| css/motion | 111/119 (93.3%) | 381/421 (90.5%) | 94.9% | 421/5,061 (8.3%) |
| css/css-scroll-snap | 40/54 (74.1%) | 292/412 (70.9%) | 74.1% | 412/842 (48.9%) |
| css/css-position | 247/295 (83.7%) | 336/396 (84.8%) | 83.7% | 396/1,767 (22.4%) |
| css/css-conditional | 234/242 (96.7%) | 371/379 (97.9%) | 96.7% | 379/3,447 (11%) |
| css/css-box | 75/101 (74.3%) | 296/365 (81.1%) | 79.9% | 365/1,132 (32.2%) |
| css/css-view-transitions | 46/298 (15.4%) | 71/358 (19.8%) | 15.4% | 358/1,663 (21.5%) |
| html/semantics | 292/341 (85.6%) | 293/342 (85.7%) | 85.6% | — |
| html/rendering | 306/336 (91.1%) | 306/336 (91.1%) | 91.1% | — |
| css/WOFF2 | 293/298 (98.3%) | 293/298 (98.3%) | 98.3% | 298/298 (100%) |
| css/css-pseudo | 248/255 (97.3%) | 288/295 (97.6%) | 97.3% | 295/1,132 (26.1%) |
| css/css-page | 223/237 (94.1%) | 243/257 (94.5%) | 94.1% | 257/394 (65.2%) |
| css/css-gaps | 241/249 (96.8%) | 246/254 (96.8%) | 96.8% | 254/4,600 (5.5%) |
| css/css-counter-styles | 245/248 (98.8%) | 245/248 (98.8%) | 98.8% | 248/395 (62.8%) |
| css/css-shadow | 115/121 (95.0%) | 218/247 (88.3%) | 97.1% | 247/489 (50.5%) |
| css/css-variables | 185/188 (98.4%) | 204/210 (97.1%) | 98.6% | 210/774 (27.1%) |
| mathml/presentation-markup | 181/188 (96.3%) | 181/188 (96.3%) | 96.3% | — |
| css/css-rhythm | 9/20 (45.0%) | 72/186 (38.7%) | 45.0% | 186/201 (92.5%) |
| css/css-transitions | 19/31 (61.3%) | 59/178 (33.1%) | 61.7% | 178/3,327 (5.4%) |
| css/css-ruby | 137/143 (95.8%) | 166/174 (95.4%) | 95.8% | 174/247 (70.4%) |
| css/css-viewport | 110/114 (96.5%) | 150/155 (96.8%) | 97.2% | 155/890 (17.4%) |
| css/compositing | 64/75 (85.3%) | 140/151 (92.7%) | 85.3% | 151/233 (64.8%) |
| html/dom | 123/127 (96.8%) | 123/127 (96.8%) | 96.8% | — |
| mathml/crashtests | 125/125 (100.0%) | 125/125 (100.0%) | 100.0% | — |
| mathml/relations | 94/100 (94.0%) | 119/125 (95.2%) | 94.0% | — |
| css/css-highlight-api | 94/106 (88.7%) | 104/118 (88.1%) | 89.3% | 118/290 (40.7%) |
| css/css-easing | 3/9 (33.3%) | 93/101 (92.1%) | 91.4% | 101/158 (63.9%) |
| css/css-will-change | 49/51 (96.1%) | 96/98 (98.0%) | 96.1% | 98/221 (44.3%) |
| svg/painting | 74/88 (84.1%) | 74/88 (84.1%) | 84.1% | — |
| svg/text | 63/85 (74.1%) | 63/85 (74.1%) | 74.1% | — |
| css/css-cascade | 54/60 (90.0%) | 76/83 (91.6%) | 91.5% | 83/1,730 (4.8%) |
| css/css-content | 70/72 (97.2%) | 75/77 (97.4%) | 98.2% | 77/322 (23.9%) |
| svg/styling | 46/66 (69.7%) | 55/75 (73.3%) | 69.7% | — |
| css/css-color-adjust | 18/25 (72.0%) | 54/64 (84.4%) | 72.0% | 64/191 (33.5%) |
| compat | 27/27 (100.0%) | 63/63 (100.0%) | 100.0% | — |
| css/css-scrollbars | 13/34 (38.2%) | 30/60 (50.0%) | 41.7% | 60/115 (52.2%) |
| css/mediaqueries | 55/58 (94.8%) | 55/58 (94.8%) | 94.8% | 58/1,827 (3.2%) |
| svg/linking | 54/56 (96.4%) | 54/56 (96.4%) | 96.4% | — |
| css/css-forms | 5/6 (83.3%) | 51/55 (92.7%) | 96.7% | 55/81 (67.9%) |
| svg/struct | 45/53 (84.9%) | 45/53 (84.9%) | 84.9% | — |
| svg/pservers | 22/37 (59.5%) | 22/37 (59.5%) | 59.5% | — |
| css/printing | 30/31 (96.8%) | 30/31 (96.8%) | 96.8% | 31/31 (100%) |
| svg/shapes | 28/29 (96.5%) | 28/29 (96.5%) | 96.5% | — |
| quirks | 20/28 (71.4%) | 20/28 (71.4%) | 71.4% | — |
| css/cssom | 23/26 (88.5%) | 23/26 (88.5%) | 88.5% | 26/4,406 (0.6%) |
| svg/animations | 15/25 (60.0%) | 15/25 (60.0%) | 60.0% | — |
| svg/geometry | 24/25 (96.0%) | 24/25 (96.0%) | 96.0% | — |
| svg/embedded | 12/25 (48.0%) | 12/25 (48.0%) | 48.0% | — |
| svg/path | 17/24 (70.8%) | 17/24 (70.8%) | 70.8% | — |
| css/css-nesting | 23/23 (100.0%) | 23/23 (100.0%) | 100.0% | 23/149 (15.4%) |
| css/css-namespaces | 22/23 (95.7%) | 22/23 (95.7%) | 95.7% | 23/23 (100%) |
| svg/crashtests | 22/22 (100.0%) | 22/22 (100.0%) | 100.0% | — |
| css/cssom-view | 14/17 (82.3%) | 16/21 (76.2%) | 82.3% | 21/2,625 (0.8%) |
| svg/extensibility | 20/21 (95.2%) | 20/21 (95.2%) | 95.2% | — |
| html/syntax | 19/20 (95.0%) | 19/20 (95.0%) | 95.0% | — |
| density-size-correction | 16/20 (80.0%) | 16/20 (80.0%) | 80.0% | — |
| svg/coordinate-systems | 16/18 (88.9%) | 16/18 (88.9%) | 88.9% | — |
| css/css-image-animation | 12/16 (75.0%) | 12/16 (75.0%) | 75.0% | 16/27 (59.3%) |
| css/css-style-attr | 16/16 (100.0%) | 16/16 (100.0%) | 100.0% | 16/16 (100%) |
| css/css-scroll-anchoring | 5/11 (45.5%) | 6/14 (42.9%) | 45.5% | 14/99 (14.1%) |
| css/css-typed-om | 9/14 (64.3%) | 9/14 (64.3%) | 64.3% | 14/13,413 (0.1%) |
| css/css-properties-values-api | 13/14 (92.9%) | 13/14 (92.9%) | 92.9% | 14/1,394 (1%) |
| svg/layout | 12/12 (100.0%) | 12/12 (100.0%) | 100.0% | — |
| html/editing | 12/12 (100.0%) | 12/12 (100.0%) | 100.0% | — |
| css/css-layout-api | 11/11 (100.0%) | 11/11 (100.0%) | 100.0% | 11/159 (6.9%) |
| svg/render | 7/11 (63.6%) | 7/11 (63.6%) | 63.6% | — |
| css/css-paint-api | 0/1 (0.0%) | 0/8 (0.0%) | 0.0% | 8/144 (5.6%) |
| css/css-font-loading | 7/8 (87.5%) | 7/8 (87.5%) | 87.5% | 8/249 (3.2%) |
| html/obsolete | 5/5 (100.0%) | 5/5 (100.0%) | 100.0% | — |
| css/css-syntax | 4/4 (100.0%) | 4/4 (100.0%) | 100.0% | 4/445 (0.9%) |
| css/css-navigation | 3/3 (100.0%) | 3/3 (100.0%) | 100.0% | 3/88 (3.4%) |
| svg/as-image | 1/2 (50.0%) | 1/2 (50.0%) | 50.0% | — |
| quirks/text-decoration-doesnt-propagate-into-tables | 1/2 (50.0%) | 1/2 (50.0%) | 50.0% | — |
| html/the-xhtml-syntax | 0/2 (0.0%) | 0/2 (0.0%) | 0.0% | — |
| quirks/historical | 2/2 (100.0%) | 2/2 (100.0%) | 100.0% | — |
| svg/scripted | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | — |
| svg/fonts | 0/1 (0.0%) | 0/1 (0.0%) | 0.0% | — |
| svg/interact | 0/1 (0.0%) | 0/1 (0.0%) | 0.0% | — |
| css/fill-stroke | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | 1/410 (0.2%) |
| svg/types | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | — |
| css/css-zoom | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | 1/1 (100%) |
| svg/print | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | — |
| quirks/crashtests | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | — |
| svg/top-level-document | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | — |
| css/css-motion-path | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | 1/1 (100%) |
| svg/svg-in-svg | 1/1 (100.0%) | 1/1 (100.0%) | 100.0% | — |
Counting every file we cannot run as a failure, tests are 27,584 of 30,799 — 89.56%. wpt.fyi has no such column; it is here because the denominator is a choice and this is the other one. Coverage compares our judged units with the wpt.fyi master run for chrome 155.0.8052.0, taken 2026-09-11.
The six specifications the engine loses most often, among those with at least sixty judged tests. Each links to its failing tests and their diffs.
The web suite has almost nothing on paged media, because browsers rarely print. Running headers and footers, footnotes, leaders, named strings, cross-references. We wrote 106 reftests of our own for it, in the same format and judged the same way. They are not counted in the figures above. We wrote them ourselves, so they are a regression net; nobody should score an engine on tests its author picked.
106 of 106 passing · excluded from the headline figures
1,050 WPT files carry their expectation in the markup itself: data-expected-width, data-offset-x and the rest of what check-layout-th.js reads. A browser needs JavaScript to ask offsetWidth; we ask our own layout directly, so every attribute is one subtest. Files whose script rewrites the document before checking are not judged, exactly as script-driven reftests are not.
box geometry, not pixels · counted as subtests in the figures at the top
357 WPT files set a declaration and read it back the way getComputedStyle would, through test_computed_value in computed-testcommon.js. What is compared is the serialization CSSOM §6.7.2 requires, one subtest per call. A property whose serializer this engine does not write yet is set aside with that reason: not a pass and not a failure, and named in the dataset rather than dropped.
CSSOM §6.7.2 serialization · counted as subtests in the figures at the top
903 WPT files test the CSS parser with parsing-testcommon.js: a value the property must accept, a value it must reject, a selector that must or must not parse. Each call has two halves. The first — accepted or rejected — is put to the engine’s own declaration parser and cascade, the same path @supports answers with. The second half, the canonical serialization the browser would read back, is judged by the tier below — for the properties whose serializer is written; the rest are set aside with that reason rather than counted either way.
acceptance only, serialization not judged · counted as subtests in the figures at the top
The file itself has standards to meet as well. Those are checked separately with veraPDF, the reference validator, over every built-in template.
A validator tells you a file does not break the rules it can express, which is a smaller claim than the file being accessible. Our own structural audit exists for the gap: it is what caught a PDF/UA-2 file we shipped with a %PDF-1.7 header that veraPDF passed, because that profile checks prohibitions and not the container version. The same audit found eleven structure-namespace violations and a footnote type that changes name between the two editions. All of it is written up, with the fixes.
We could not find per-specification test results published by any other HTML-to-PDF engine. Prince, PDFreactor and Antenna House publish feature lists; the most recent public conformance marker for this class of tool is Acid2, from 2005. That is the reason this section exists in the form it does, and if one of them publishes a comparable run we will link to it from here.
It carries our render, the reference, the diff between them and both source files. Suite pages list their tests with the size of that difference.