Skip to content

webkit: the Scale showcase grid renders zero cells #338

Description

@blove

apps/website/e2e/smoke.spec.ts:508 — "showcase: scale grid virtualizes; column layout resizes + resets" — fails on webkit at the assertion that the grid rendered any cells at all:

expect(await page.locator("#scale [data-pretable-cell]").count()).toBeGreaterThan(0)
Received: 0

Chromium passes. The section mounts itself lazily via an SSR-safe useInView IntersectionObserver, so a webkit-specific observer/mount timing difference is the first place to look; the test does scrollIntoViewIfNeeded() and waits for both the grid role and data-pretable-hydrated before counting, and the counter's model total (1,250,000) asserts fine just above — so the section is present and hydrated while its body is empty.

Pre-existing, not from #336: reproduced on that branch's base with both of its changed files reverted, against a fresh production build.

Why nobody noticed: the Smoke test → Vercel preview job only runs after the deploy jobs, which are skipped whenever the test job fails — and test has been red on main since #321 (fixed in #336). The whole website e2e lane has not run on main for several commits.

Reproduce:

pnpm build && pnpm --filter @pretable/app-website exec next start -p 3111
BASE_URL=http://localhost:3111 pnpm --filter @pretable/app-website exec playwright test e2e/smoke.spec.ts --project=webkit -g "scale grid virtualizes"

Activity

  1. blove commented on Aug 12, 2026

    @blove
    ContributorAuthor

    Two corrections to the "why nobody noticed" section above — the gap is wider than a skipped job.

    It is not just that the lane was skipped: the PR lane cannot see this failure at all. The preview smoke runs 50 tests; the production smoke runs 100. The preview job runs chromium only, so a webkit-only break passes every PR gate and then fails after the merge, on production.

    Evidence, same commit range:

    It also is not the only webkit failure. That same production run fails smoke.spec.ts:225 cockpit: filter, edit (guardrail + success), and select+copy under streaming on webkit, three attempts, with locator.click: Test timeout of 30000ms exceeded. Worth checking whether both have one cause before fixing either.

    So there are arguably two issues here: the webkit breakage itself, and a preview gate that structurally cannot catch webkit regressions before they reach production.

  2. blove commented on Aug 12, 2026

    @blove
    ContributorAuthor

    Cross-linking: #335 tracks the second webkit failure in the same production smoke run — cockpit: filter, edit (guardrail + success), and select+copy under streaming (smoke.spec.ts:225). Both fail together, 2 failed / 96 passed, every main run since #321.

    Data point for the 'why nobody noticed' section, since it changes the picture slightly: on main the deploy lane was mostly not skipped. test failed on exactly one of the six runs I checked (8461c8d0); the other five failed on Deploy → Vercel (production) itself, which means the production smoke ran and reported these two failures each time. So they've been continuously visible on main rather than hidden by a skipped lane.

    The preview-vs-production project split you recorded is still the reason they escaped PR review — that part holds, and it's the more useful half of the finding.

  3. blove commented on Aug 12, 2026

    @blove
    ContributorAuthor

    Production smoke is green on main at 76095113 — 100 passed (3.3m), webkit included, after #340. The showcase: scale grid failure tracked here no longer reproduces on prod.

    Leaving the close to you in case the zero-cells diagnosis here points at something you still want to fix on the product side rather than the test side — the green only proves the smoke passes now, not which of the two it was. Closed #335 (the cockpit half) against the same evidence.

  4. blove commented on Aug 13, 2026

    @blove
    ContributorAuthor

    Fixed in #343 (merged), and it was a real product regression rather than the environment difference this issue assumed.

    Cause: renderer-dom's row-layout controller builds in slices, scheduling each continuation from inside the previous one, and its fallback used setTimeout(task, 0) — nested zero-delay timers, which browsers clamp to ~4ms. Safari ships no scheduler.postTask, so it always took that path.

    Mount to first painted cell, 2,500 × 500:

    first cell timer hops
    Chromium 13 ms 0
    WebKit 263 ms 25
    Chromium with postTask deleted 176–190 ms —
    WebKit at dcc8c3e7 (pre-#321) 8–12 ms —

    The third row is what rules out "WebKit is just slower": same engine, same build, stalled only by which primitive it yields through. The fourth dates it to #321.

    The fallback now prefers an unclamped MessageChannel, the same ladder the row model's cooperative transition already used. WebKit paints in ~15 ms.

    The gate gap is closed too. The preview smoke ran chromium only (50 tests vs production's 100); it now runs the same smoke script as production. Confirmed on #343: Running 100 tests, all passing against a live preview deployment.

    main is green end to end, production smoke included — the first time since #321.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions