Skip to content

fix(describe, capture, debugger): fold 11 describe, capture and debugger fixes - #1753

Open
latekvo wants to merge 164 commits into
mainfrom
fix/group-capture
Open

latekvo wants to merge 164 commits into
mainfrom
fix/group-capture

Conversation

@latekvo

@latekvo latekvo commented Nov 4, 2026 •

Copy link
Copy Markdown
Member

Folds 11 open describe / capture / debugger fix PRs into one review. Each original PR is one squashed commit titled ... (#N), so it reads commit by commit; follow-ups from folding are separate commits.

Issue From Before After
- #559 Fixture commit of 21.8 ms: hot-commit summary prints View x3 with 45 ms w/children. react-profiler-renders and by_component also show 45. View x3 shows 17 ms self (summed) and 20 ms w/children (largest instance). Rows rank by self time.
- #559 A window with 50 busier sibling nodes truncates the outer walk frame, so the walk row reads self 3 / total 3 (main the same). Every node in the window is grouped: the walk row reads self 4 / total 4.
#908 #1122 With HOME/.argent at mode 0500, new LogFileWriter() throws 'EACCES: permission denied, mkdir .../.argent/tmp', so debugger-connect fails. The writer constructs without a file, and debugger-log-registry connects with a note on fixing permissions.
- #1313 Headless Chrome page: Row four, scrolled out of a 100px overflow:auto list and over Danger, is described at full frame h=0.056. CI E2E await hidden on the clipped row fails. Row four is h=0.000 and the partly cut row is h=0.028. scripts/ci/windows-chromium-e2e.mjs passes.
#1338 #1350 Error is 'emulator console wrote no PNG to /var/... for emulator-5554', with no console reply and no token hint. Error is 'wrote no PNG for emulator-5554: KO: ...' on one line, naming ~/.emulator_console_auth_token when adb sent no auth. An empty reply reads 'empty reply'.
#1337 #1352 registry describe {udid:'amazon-0000bogus'} with no VVD running returns ok: an empty Screen root plus the relaunch hint. It throws 'No running Vega Virtual Device found. Start one with boot-device ...' (VEGA_DEVICE_NOT_FOUND).
#1230 #1355 Headless Chrome:
alpha
beta
reads 'alphabeta', a button reads 'Savedraft', and an aria-labelledby label reads 'Keepgoing'.
They read 'alpha beta', 'Save draft' and 'Keep going'.
#1005 #1360 Description: 'rendered content and stopped changing'. The minStableMs text does not mention 0. settled=false is described as 'never went still'. Description: 'held it for minStableMs'. minStableMs: '0 settles on the first non-empty read, confirming content, not stillness'. settled=false also covers an unreadable tree.
#1143 #1374 LogFileWriter.readAll() returns startgroup, startgroupcollapsed, endgroup, timeend, profileend. It returns startGroup, startGroupCollapsed, endGroup, timeEnd, profileEnd.
#826 #1378 MCP stdio callTool screenshot-diff returns [image, summary] only. The summary says to 'see diffPath', but no path is sent. It returns [image, summary, 'diffPath: ', 'contextDiffPath: '].
#805 #1403 screenshot-diff on 400x800 vs 100x200 gives resized_no_change with size_normalized (downscaled to 100x200). It gives dimension_mismatch with the remedy 'only images of identical dimensions are compared'. A compared result prints compared_at: WxH.
#838 #1403 When the full-resolution capture fails, the capture is retried (runner called 2 times). The description promises a fallback. One capture, and its error is surfaced. The description says both images need identical dimensions and live captures use scale 1.0.
#807 #1403 iPhone 16 1179x2556 vs 16 Pro 1206x2622 gives resized_no_change with size_normalized compared_at=1179x2556. It gives dimension_mismatch expected=1,179x2,556 actual=1,206x2,622, and nothing is compared.
- #1487 Headless Chrome: fill 'abcdef' into maxlength=3 gives verified:true with the field 'abcdef'. fill 'abc' into number 42 gives FILL_NOT_VERIFIED with the field wiped to ''. maxlength: 'longer than its maxlength of 3. Nothing was changed.', field ''. number: 'holds only a valid number. Nothing was changed.', field stays '42'.

Fixes from reviewing the fold:

Area Before After
component_cpu A recursion whose outer frame took no self sample reported the nested frame's inclusive time. The outer frame is the outermost member and its inclusive time is reported.
debugger crash note With an unwritable ~/.argent, the crash note named a kept log file that never existed, and fileSizeBytes counted bytes never written. The note says no log file held the logs; fileSizeBytes is 0.
describe aria-labelledby Headless Chrome: a button labelled by a visibility:hidden tooltip had no name; aria-label, alt and script text were read as textContent. Against Chrome's Accessibility names on 43 cases, including select, textarea and display:none content, all match except an embedded input's value, read since (row 'describe names and values').
describe wheel anchors Headless Chrome: an anchor over an overflow-x:hidden, overscroll-behavior:contain carousel scrolled the list 0px. The anchor falls back to a point whose wheel scrolls the list.
describe clip Headless Chrome: a row in a custom element in a 12px-bordered list lost its clipBounds and showed h=65 past the list. h=50, with clipBounds and anchors, like a plain-div row.
fill (Chromium) fill 'a@bücher.de' into an email input: verified:false (Chrome stores a@xn--bcher-kva.de). The same for 'a@ü.123'. verified:true; a page rewriting it to another domain still gives verified:false.
debugger log counts On a full disk or past a file-size limit: fileSizeBytes 4430 with 4096 on disk, and only 10 of 40 entries counted once writes threw. A crash note called the empty file kept. fileSizeBytes matches the file (4087 bytes, the torn tail cut), and all 40 are counted. The note says how many the file holds.
describe on a page with var Map = Immutable.Map Throws 'Illegal invocation' once a scroller cuts any element. Describes the page as with the builtin Map.
describe fieldset A row scrolled under the legend of an overflow fieldset had a visible frame; a tap at it hit the legend. Clipped where Chrome clips: 41 of 41 screenshot cases match.
scroll-to, pinch After one gesture returned a warning, no more increments were sent, so scroll-to failed with 'reached the end of the scroll'. Every increment is sent, and the first warning is kept.
component_cpu Location On real Hermes sessions, 7% of rows printed a line with no self time. 0%: Location is the line with the most self time.
scroll-to, stuck cut Headless Chrome: a cut target whose anchor's wheel did not move it was retried at the screen centre, which wheeled the page, and the step passed with the target still cut. One more increment at the centre of within, else of the window that cuts the target. The cut is accepted if that leaves it in place too, or if the target lies under that centre, so the page takes at most two wheels.
component_cpu speed A 140 s Hermes session: about 1 s per call, blocking the shared tool-server (main: about 30 ms). About 60 ms, with the same tables for all 2080 components of 36 sessions.
describe on pages with their own Node or HTMLSlotElement A page script defining Node (or a non-function HTMLSlotElement) made describe throw 'Uncaught' (main describes it). DOM interfaces come from elements the script makes; 60 override pages describe like the plain page.
describe names (aria-labelledby) Headless Chrome: <svg><title>, ruby, shadow-DOM and slotted labels, aria-hidden="TRUE", script boxes and empty parts named unlike Chrome. They match Chrome's Accessibility names (reviewer matrix 73 to 93 of 105, none lost).
describe clip clipBounds took a cutter's whole window, so the stuck-cut retry could wheel a sibling list; box-less rows had no clipBounds; a stuck sticky legend moved the clip edge 60px. clipBounds is what outer clips leave showing; box-less rows get clipBounds and anchors; the legend edge follows layout (108 of 108 cases within 1px).
describe on shadowless custom elements Every light child under a scroller read every ancestor's style: up to 267 ms vs 119 ms at flow limits. Clipper borders are cached per element; trees are byte-identical.
fill (Chromium) A first fill during a 4 s busy main-thread task failed after 2 s; a page's const URL = ... broke IDN email fills. A task under 10 s is waited out (4 s: verified at 3.96 s). A longer one fails at 10 s like a dialog and changes nothing (main waits up to about 55 s); a retry after the task fills it. IDN hosts are parsed with a link element.
debugger log file After a short write, no note said the file lacked entries, and the next entry was glued to the torn line and lost by readAll. The note says the file holds K of N entries; the next entry starts its own line.
profiler-commit-query by_index Sorted by self time, but the inclusive figure was headed Duration. Columns are Self, then Subtree.
describe iframes An iframe walk and anchor guard that never run in Chrome (other-realm elements). Removed; iframe content is undescribed, as on main.
describe closed roots on plain elements Headless Chrome: a closed root on a <div> (or span, section, any attachShadow host but a custom element) slotting a button into a fixed box: 0x0, scrolled out (main: framed). Framed where Chrome hit-tests it, 400,20 97.5x21. Open-shadow popups and shadow rows under a bordered scroller stay clipped as their light twins.
describe fieldset in a shadow tree A legend slotted into a shadow <fieldset> was clipped (y 22..50) and row one framed over it. Legend 20..50, row one 50..56, matching Chrome's hits.
describe wheel anchors in thin strips A 10px header above a contained carousel, or a strip beside a fixed overlay, was missed by the 3x3 grid; the anchor's wheel moved nothing. The anchor lands in the strip. Through scroll-to, a strip beside a fixed overlay scrolls the list and shows the row; a 20px header scrolls it 24 of 30px, then the carousel keeps the wheel and the step passes with the row cut 6px.
describe names (aria-labelledby) Closed <details> content, inert text, ::before/::after, a blank element's title, range values and unselected listbox options read unlike Chrome. Match Chrome (prior 279-case corpus 254 to 261, none lost).
component_cpu rounding A recursion printed Self above Total: map 2.02 / 2.01. Summed unrounded, rounded once: 2.01 / 2.01.
describe names (blank labels) An empty aria-labelledby result or a whitespace aria-label gave the field no name, skipping its placeholder, alt and title (#1564). They fall through to the next name source.
describe names (text-transform) text-transform was ignored: an uppercase label read save it (Chrome SAVE it). Cased as laid out, with lang casing and title-case capitalize (0 mismatches over about 1,200 characters in 11 scripts); a page's broken Intl.Segmenter leaves the text uncased.
describe names (long targets) A labelledby target of 20,000 rows took about 700 ms (main: 30 ms). About 45 ms, same label.
describe closed-root probe Under a full-height app shell, describe took 190-410 ms (main: about 22 ms). 52-68 ms, byte-identical trees; a 12k-deep display:contents chain describes.
scroll-to, cross-axis cut A target cut only across the scroll axis, and cut by the within box, passed with no scroll (main scrolls once). Checked against within: one scroll.
fill (Chromium), closed shadow roots Focus in a closed shadow root said to tap the field first; inside a contenteditable, the text landed in the outer editor. Refused: fill cannot reach a closed shadow root, nothing changed.
debugger log file, torn line After a short write past |, readAll returned one entry more than the note's count, with a cut message. The torn bytes are truncated: file, readAll and note agree.
describe closed <details> Headless Chrome: a closed details' answer and button were framed on screen (clickable, over the next button), so await visible passed and taps landed elsewhere (main the same). Everything but its first summary has a zero-area frame, as for content-visibility: hidden.
describe closed-root probe speed 1200 stacked slides outside a clipped carousel: 407 ms (flow limits 960 ms; main 25 / 50). 33 / 72 ms, byte-identical trees on 48 pages.
describe names (labelledby content) A hidden <br> read as a space and a hidden block glued words; aria-label beat aria-labelledby; role="foo listbox", native <progress>/<meter>, ::first-letter casing and capitalize after an aria-hidden icon, earlier text or an astral letter read unlike Chrome. Match Chrome: 70 of 71 such cases (was 19), no other corpus case lost.
fill (Chromium), closed roots on focusable hosts A closed root in a contenteditable host filled the host's text with verified:true; one in a tabindex or scrolling host said to tap the field first. Refused: fill cannot reach a closed shadow root, nothing changed.
Prose The fill script said the page can refuse the edit through beforeinput; await-screen-idle did not say an unreachable Chromium app fails; the overflow:hidden hint said the clip stays hidden. Each says what the code does.
scroll-to, within box cut Headless Chrome: a card inside the outer scroller's window but cut by the overflow:hidden within box (scrolled by its own wheel listener) passed with 0 wheels, 70 of its 150px hidden, and a tap on it failed (main reveals it). 19 wheels at the box's centre: the card ends at 220..370 inside the box's 50..550, and the tap passes.
describe closed-root probe on layered pages 2000x15 relative truncate cells: describe 2.5-4.5 s (probe off: 41 ms, same tree); await-ui-element missed a visible button at 5 s. Layout rules the probe out first: 23-50 ms on 5 such pages, same trees; the button is found at 3.3 s. A closed root's absolute box showing default-slotted content inside the host's own overflow stays clipped.
describe aria-labelledby in shadow roots A shadow-root <input aria-labelledby=sl> read "a@b.c"; a shadow button whose id also exists in the top document read "Doc label" (#1756). Ids resolve in the control's own root: "Email", "Shadow label".
describe fieldset legend ~4500 nested display:contents boxes in a fieldset threw RangeError; an SVG <legend> threw Illegal invocation (main describes both). The legend is found without recursion, and only an HTML one.
describe pruned slot A fixed or absolute child slotted into a zero-height overflow:hidden box was dropped (main framed it). Framed where Chrome hit-tests it (5 cases).
describe syntax The walker used ?. and ??=, so Chromium before 85 could not parse it (main parses on V8 7.8). The walker and fill script are ES2019, and a test parses them at ES2019.
describe names and values visibility:collapse text read as shown; lang=tr_TR cased as no lang; Qty <input value=5> items read "Qty items"; an uppercase-styled button's value read "save it" while a label it supplied read "SAVE IT". As Chrome names them: hidden, "İSTANBUL", "Qty 5 items", value "SAVE IT". Chrome-name corpus 346 to 373 of 402, none lost.
fill (Chromium), closed root in an editing host The page selecting a contenteditable host's text while focus sat in its closed root's input: verified:true, input unchanged. Refused: fill cannot reach a closed shadow root, nothing changed.
screenshot-diff remedy, debugger no-file note A grown Mac window or a foldable posture change was told to match model, orientation and scale; a full disk was diagnosed as permissions. The remedy names posture and Mac window size; the note names a full disk too.
Tests About 30 mutants of changed guards (naming, clip, wheel anchors, fill scroller checks, by_index footer) passed the suite. Each fails a test.

Not folded: #1382 (superseded: #1403 removes the aspect tolerance it capped; #807 is covered by #1403 here).

Closes #908, #1338, #1337, #1230, #1005, #1143, #826, #805, #838, #807, #1564, #1693, #1694, #1756, #1759.

Evidence per row

Each fix's test fails on origin/main and passes here.

Review feedback carried from the original PRs
Local CI

At 515887a: tsc --build, typecheck:tests, prettier --check ., eslint . and knip: exit 0. tool-server vitest: 10347 passed, 10 skipped, 0 failed. argent-mcp vitest: 215/215. npx docusaurus build: succeeds.

At 5a2f26e: tsc --build, typecheck:tests, prettier --check ., eslint . and knip: exit 0. tool-server vitest in 6 shards: 9216 passed, 1 skipped, 1 failed (flows/e2e-tool-aliases, local-only as below). argent-mcp vitest: 195/195. npx docusaurus build: succeeds. GitHub CI at 7ddca21: all green.

At 64edb2d: tsc --build, typecheck:tests, prettier --check ., eslint . and knip: exit 0. tool-server vitest in 6 shards: 9175 passed, 1 skipped, 1 failed (flows/e2e-tool-aliases, local-only as below). GitHub CI at 89f47f2: all green.

At 9055f47: prettier --check and eslint on every file changed since 6988790: pass. tsc --build, typecheck:tests and knip: exit 0. tool-server vitest in 6 shards: 8849 passed, 1 skipped, 1 failed (flows/e2e-tool-aliases, local-only as below). argent-mcp vitest: 195/195. npx docusaurus build (at a9f502a): succeeds.

At 6988790 (changed since the main merge 6c3be48: flow-actions.ts, flow-scroll.test.ts): prettier --check and eslint on both: pass. tsc --build and typecheck:tests: exit 0. tool-server test/flows vitest: 2366 passed, 1 failed (flows/e2e-tool-aliases, local-only as below).

At 9e65f4a (docs build and argent-mcp re-run at 2e88d62): prettier --check and eslint (8 GB heap) on every changed file: pass. tsc --build and typecheck:tests: exit 0. tool-server vitest in 6 shards: 8722 passed, 1 skipped, 1 failed: flows/e2e-tool-aliases (81 vs 83 ids), a known local-only failure that also fails on origin/main. argent-mcp vitest: 195/195. npx docusaurus build: succeeds. Each squash carries exactly the PR's net change vs its merge-base (numstat identical).

…laced window.Map

The clip walker keyed its slot, pruned and scroller-chain lookups on
globalThis.Map/Set, so a classic page script's `var Map = ...` aborted the
whole describe. The label memo from the <br> fix already avoided the page's
Map; the walker now falls back to a list when the global is not a usable Map.
…a commit window

The per-window fold picks a name's outermost frames, but it only saw the
50 nodes with the most self time, so a recursion's outer frame that ranked
lower was dropped and its nested frame counted as outermost.
… sample in component_cpu

queryCpuWindow only listed frames that took a self sample, so a recursion's
outer frame with none was never seen by the outermost-member fold and the
nested frame's inclusive time was reported instead. component_cpu now asks
for the callers too and keeps only rows with self time. Also pins the
cross-window sum and the self-time ranking.
… had one

Under an unwritable ~/.argent the crash breadcrumb said the log file was
kept at a path that never existed. Keep the file only when there is one,
and still report the session as a lost connection. Also pins the canonical
device id in the missing-file recovery scope.
# Conflicts:
#	packages/docs/docs/reference/tools.mdx
Conflicts resolved:
- profiler: keep main's render_counts and rerender gating with the
  group's self-time ranking and max-inclusive grouping. Take main's
  report and skills, which no longer mention the hidden
  react-profiler-renders; its comment no longer claims double counting.
- scroll-to: keep the group's anchored, limited increments and its
  every-increment-sent fix inside main's macOS no-scroller catch.
- selectorToNode takes main's frontmost-layer filter.
- snapshot: main's macOS topMask, without normalizeSizes, which the
  group removed. screenshot-diff keeps main's Mac line, trimmed to
  what the dimensions sentence does not already say.
- docs: main's tables plus the group's await-screen-idle wording,
  scroll-to link and fill error codes, now under SDK-only tools.

Tests adapted to the merged types: component_cpu fixtures carry
didRender and a null render summary, a CPU hotspot fixture gets its
nodeId, and the all-clear react-profiler-renders test is dropped with
the bullet it pinned.
…e dimension_mismatch remedy

The remedy listed device model, orientation and screenshot scale only, so a
Mac window that grew or an Android foldable in another posture got advice
whose conditions already held. visual-regression.mdx and the
argent-screenshot-diff skill had the same gap.
On a full disk the log file's open fails with ENOSPC, and the note blamed
an unwritable ~/.argent and pointed at sudo chown. The writer keeps no
errno, and a failed mkdir leaves open() with ENOENT, so the note names both
causes and offers chown only when root owns ~/.argent.
A target cut by an outer native scroller and by the overflow:hidden
`within` box was checked only against the scroller's window, which leaves
out boxes inside it. Once clear of that window it passed with no wheel
while the box still hid part of it. Such a round now wheels at the
container's centre, as for an uncut target, so the box's own wheel
listener can reveal it.
Headless Chrome: a 20px header above an overscroll-contained carousel in
a 300px list. scroll-to's anchor on the header scrolls the list 24 of the
30px the row needs; once the header is gone, every point in the list is
over the carousel, which keeps the wheel, and the step passes with the
row cut by 6px. The reference and the skill say so.
…ents

No fixture hit a <frame>, <object> or <embed>, so dropping any of them
from wheelScroller's frame rule left the suite green. In headless Chrome,
with that rule cut to IFRAME|FRAME, the anchor lands on an <object> or
<embed> whose document takes the wheel, and the list moves 0px (16px with
the rule).
… root

A page can put the selection in a contenteditable host's own text while
focus stays on an input inside the host's closed shadow root. The guard
took the host as focused itself, so fill wrote the host's text and
verified it there: verified:true with the focused input unchanged.

In a focused page, an editing host focused itself matches :focus-visible
and a host whose focus is in its shadow tree does not, so fill refuses
the latter with the closed-shadow-root error and changes nothing.
Its parentElement is null. Without the null check in the closed-host
guard the page script throws and every such fill (a Lit-style editor)
fails with "fill could not run in the page"; no test caught that.
The mock style gave both axes one overflow value and no case had a
scroller whose content fits, so five mutants of scrolls() passed the
suite: either size check always true, overflow-y matching only auto, and
each axis reading the other's overflow. The mock style is per axis and
six cases, each checked against headless Chrome, pin them.
A Chromium page busy in one task longer than the no-op's 10 s fails
with the nothing-changed error, on a fresh connect as on a connected
session. A fresh CDP session gets no signal that tells such a page from
one under a JavaScript dialog: Page.enable, Page.getFrameTree,
Runtime.evaluate and Performance.getMetrics all go unanswered in both,
no javascriptDialogOpening arrives, and Page.handleJavaScriptDialog says
no dialog is showing. So the budget stays, and the error, the budget's
comment and the tools reference state it: the page did not answer for
10 s, and a retry fills a busy page once its task ends.
…parent placed a child

Every light child of a div, span or custom element that reached past its clip in
view was hit-tested, at a cost of one pass over the page's paint layers each. On
a sheet of 2000x15 `relative truncate` cells describe took about 3.4 s (probe off:
31 ms) with the same tree, and await-ui-element timed out on a button it could see.

The walker now first asks layout. A child whose parent contains absolute boxes and
is its offsetParent cannot have been slotted out of that parent's clips, since
offsetParent skips a closed tree's boxes and only a fixed or top-layer box escapes.
Under any other parent, a child inside the parent's border box or scrollable
overflow that names no slot is skipped too. A closed root's absolute box showing
default-slotted content within that overflow is the case this gives up.
…n HTML one

The legend lookup recursed once per display:contents box, so a fieldset holding a
chain of 4500 of them aborted describe with 'Maximum call stack size exceeded'. It
also took an SVG element named legend (or fieldset) for an HTML one, and then read
an HTMLElement offset getter on it: 'Illegal invocation'. Main describes both pages.
The lookup walks an explicit stack and checks the namespace as isHtml does.
A slot inside a pruned element dropped everything assigned to it, though
Chrome paints and hit-tests a fixed child, or an absolute one whose
containing block lies outside, past a collapsed overflow:hidden box. The
slot's clips are now folded down its path from the pruned element, and only
content those clips cut to nothing is dropped.
The walker used ?., ?? and ??=, which V8 parses only from Chrome 80 and 85,
so describe failed with a SyntaxError on older Chromium and Electron
renderers. A test parses the walker at describe's and flows' limits, and the
fill script, for syntax newer than ES2019.
…w root

accessibleName looked every id up with document.getElementById, so a control
in an open shadow root never found a target beside it and could take the text
of a page element with the same id instead (Chrome: "Shadow label", describe:
"Doc label"). Ids now resolve in the control's document or shadow root, the
label cache is kept per root, and the document's getElementById comes from its
prototype, so a <form name="getElementById"> no longer makes describe throw.

Fixes #1756.
…lker

Only visibility:hidden counted as hidden. A visibility:collapse element (on
anything but a table row it is visibility:hidden, and Tailwind's `collapse`
sets it) was emitted as a visible, clickable node, and in a collapsed table
row framed over the next row's button, though Chrome hits through it and
leaves it out of the accessibility tree. In an aria-labelledby target a
collapsed part was read into the name ("Delete (old) file", Chrome: "Delete
file"), and a collapsed target was read as shown. Every visibility check in
the walker now treats any value but visible as hidden, as the option and
::before/::after checks already did.
caseText passed the whole -webkit-locale to toLocaleUpperCase, which throws on
tr_TR, so the text fell back to the root case mapping ("ISTANBUL", Chrome:
"İSTANBUL"), and canonicalizes tur to tr, which Blink does not. Blink cases
by a lang's first 2 letters when a "-", "_", "@" or the end follows them, and
caseText now does the same.
…hrome does

An embedded text field reads its value (a password as bullets), else its
aria-label, title or placeholder; a button input its value; an image
input its alt; a range input its value. The control being named reads
in its own target by its aria-label, title or placeholder instead, as
Chrome does, so a label wrapping its field keeps reading "Name".
An element's value read its text nodes as authored, so an uppercase
button read "Save draft" where Chrome and the screen show "SAVE DRAFT".
Own text now takes the element's text-transform under its lang, with
capitalize reading on from what is laid out before each text node. A
::first-letter's case is left out: it costs every text an ancestor climb
(about +25% describe time on plain pages).

A case-sensitive `matches` regex sees the shown case, so the e2e YAML
reference and skill say so.
Each assertion fails under one mutant that the suite let through: a
closed <details>' second <summary>, inert on an SVG element, a hidden
<math> parting words, an inline listbox's leading space, a ::before alt
of empty strings, a visibility:collapse pseudo, a -webkit-box pseudo, a
block-level replaced element before a first letter, a blank block
::before ending an ancestor's first letter, a first letter's combining
marks under Greek casing, and a block pseudo in an inline box.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants