Skip to content

Generate anonymous table cells for non-table-internal children of tables - #781

Open
nicoburns wants to merge 1 commit into
mainfrom
devin/1787604682-table-anonymous-cells
Open

Generate anonymous table cells for non-table-internal children of tables#781
nicoburns wants to merge 1 commit into
mainfrom
devin/1787604682-table-anonymous-cells

Conversation

@nicoburns

@nicoburns nicoburns commented Aug 24, 2026

Copy link
Copy Markdown
Member

Summary

Fixes the gov.uk homepage search box being unclickable.

Root cause: gov.uk's search component wraps the <input> in plain block <div>s that are direct children of a display: table element. In collect_table_cells, children with DisplayInside::Flow/FlowRoot/Flex/Grid were silently ignored ("probably a table caption"), so they were never added as layout children of the table grid. The input's wrapper (and the input) therefore got no layout at all — final_layout() stayed 0x0 — and Node::hit_inner rejects zero-sized nodes, making the search box impossible to click.

Fix: per CSS 2.2 §17.2.1, non-table-internal children of a table generate an anonymous table cell around them. collect_table_cells now treats such children like table cells (as their own anonymous single-span cell in the current row, bumping *row from 0 to 1 when they occur before any row), while skipping cell-only handling (colspan/rowspan attributes, border-collapse border zeroing, margin zeroing, first-cell-border capture) for non-cell children.

Verified against https://www.gov.uk: the search input now lays out at its rendered size and hit-testing at its center returns the input node; the rendered screenshot is unchanged/correct.

Regression tests added in tests/blitz-tests/tests/table_anonymous_cell.rs (layout + hit-test, and click-to-focus for an input inside a table's block child).

Link to Devin session: https://dioxus.staging.devinenterprise.com/sessions/e0b69caedcd34e829ff73fb7ff216a75
Open in Devin Desktop: https://dioxus.staging.devinenterprise.com/desktop/session/e0b69caedcd34e829ff73fb7ff216a75?variant=devin-insiders
Requested by: @nicoburns

WPT results

71 newly passing, 19 newly failing (net +52).

Full diff (90 changed tests)
+ Fail => Pass css/CSS2/backgrounds/background-applies-to-015.xht
+ Fail => Pass css/CSS2/backgrounds/background-attachment-applies-to-015.xht
+ Fail => Pass css/CSS2/backgrounds/background-color-applies-to-015.xht
+ Fail => Pass css/CSS2/backgrounds/background-image-applies-to-015.xht
+ Fail => Pass css/CSS2/backgrounds/background-repeat-applies-to-015.xht
- Pass => Fail css/CSS2/bidi-text/bidi-008a.xht
- Pass => Fail css/CSS2/bidi-text/bidi-008b.xht
+ Fail => Pass css/CSS2/borders/border-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-bottom-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-bottom-color-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-bottom-width-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-color-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-left-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-left-color-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-left-width-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-right-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-right-color-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-right-width-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-top-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-top-color-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-top-width-applies-to-015.xht
+ Fail => Pass css/CSS2/borders/border-width-applies-to-015.xht
+ Fail => Pass css/CSS2/colors/color-applies-to-015.xht
- Pass => Fail css/CSS2/css21-errata/s-11-1-1b-001.html
- Pass => Fail css/CSS2/css21-errata/s-11-1-1b-008.html
- Pass => Fail css/CSS2/css21-errata/s-11-1-1b-009.html
+ Fail => Pass css/CSS2/fonts/font-applies-to-015.xht
+ Fail => Pass css/CSS2/fonts/font-variant-applies-to-015.xht
+ Fail => Pass css/CSS2/fonts/font-weight-applies-to-015.xht
+ Fail => Pass css/CSS2/linebox/vertical-align-applies-to-015.xht
+ Fail => Pass css/CSS2/lists/list-style-applies-to-015.xht
+ Fail => Pass css/CSS2/lists/list-style-image-applies-to-015.xht
+ Fail => Pass css/CSS2/lists/list-style-type-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/margin-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/margin-left-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/margin-right-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/margin-top-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/padding-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/padding-bottom-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/padding-left-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/padding-right-applies-to-015.xht
+ Fail => Pass css/CSS2/margin-padding-clear/padding-top-applies-to-015.xht
+ Fail => Pass css/CSS2/normal-flow/height-applies-to-015.xht
- Pass => Fail css/CSS2/normal-flow/inline-table-002a.xht
- Pass => Fail css/CSS2/normal-flow/inline-table-width-002b.xht
+ Fail => Pass css/CSS2/normal-flow/inline-table-zorder-002.xht
+ Fail => Pass css/CSS2/normal-flow/max-height-applies-to-015.xht
+ Fail => Pass css/CSS2/normal-flow/max-width-applies-to-015.xht
+ Fail => Pass css/CSS2/normal-flow/min-height-applies-to-015.xht
+ Fail => Pass css/CSS2/normal-flow/min-width-applies-to-015.xht
+ Fail => Pass css/CSS2/normal-flow/width-applies-to-015.xht
+ Fail => Pass css/CSS2/tables/anonymous-table-box-width-001.xht
+ Fail => Pass css/CSS2/text/letter-spacing-applies-to-015.xht
+ Fail => Pass css/CSS2/text/text-decoration-applies-to-015.xht
+ Fail => Pass css/CSS2/text/text-indent-applies-to-015.xht
+ Fail => Pass css/CSS2/text/white-space-applies-to-015.xht
+ Fail => Pass css/CSS2/text/word-spacing-applies-to-015.xht
- Pass => Fail css/CSS2/ui/outline-applies-to-016.xht
- Pass => Fail css/CSS2/ui/outline-applies-to-017.xht
- Pass => Fail css/css-break/table/break-before-second-row.html
- Pass => Fail css/css-break/table/caption-margin-002.html
- Pass => Fail css/css-break/table/caption-margin-005.html
+ Fail => Pass css/css-break/table/inside-flex-001.html
+ Fail => Pass css/css-break/table/monolithic-overflow-002.tentative.html
+ Fail => Pass css/css-break/table/monolithic-overflow-004.tentative.html
+ Fail => Pass css/css-break/table/repeated-section/image.tentative.html
+ Fail => Pass css/css-contain/contain-inline-size-table.html
- Pass => Fail css/css-contain/contain-size-056.html
- Pass => Fail css/css-contain/contain-size-table-caption-001.html
- Pass => Fail css/css-contain/content-visibility/content-visibility-094.html
- Pass => Fail css/css-contain/content-visibility/content-visibility-095.html
+ Fail => Pass css/css-flexbox/flexbox_flex-formatting-interop.html
+ Fail => Pass css/css-flexbox/flexbox_stf-table-singleline-2.html
+ Fail => Pass css/css-flexbox/flexbox_stf-table-singleline.html
- Pass => Fail css/css-flexbox/table-as-item-flex-cross-size.html
+ Fail => Pass css/css-flexbox/table-as-item-narrow-content.html
- Pass => Fail css/css-flexbox/table-as-item-stretch-cross-size-2.html
- Pass => Fail css/css-flexbox/table-as-item-stretch-cross-size.html
+ Fail => Pass css/css-flexbox/table-with-float-paint.html
+ Fail => Pass css/css-grid/grid-items/explicitly-sized-grid-item-as-table.html
+ Fail => Pass css/css-page/monolithic-overflow-009-print.html
+ Fail => Pass css/css-page/monolithic-overflow-010-print.html
+ Fail => Pass css/css-page/monolithic-overflow-011-print.html
+ Fail => Pass css/css-page/monolithic-overflow-017-print.html
+ Fail => Pass css/css-sizing/calc-margins-table-caption.html
+ Fail => Pass css/css-sizing/table-child-percentage-height-with-border-box.html
+ Fail => Pass css/css-sizing/table-percentage-max-width-beside-float.html
+ Fail => Pass css/css-tables/html-display-table.html
+ Fail => Pass css/css-tables/percent-height-overflow-auto-in-restricted-block-size-cell.html
+ Fail => Pass css/css-tables/percent-height-overflow-auto-in-unrestricted-block-size-cell.tentative.html

Generated by the WPT workflow.

@staging-devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant