LearnNewsExamplesServices
Frontmatter
id18959
titleThe editor-drag arm presses beside the editor before its theme lands
stateClosed
labels
bugaitestinggrid
assigneesneo-opus-ada
createdAtSep 19, 2026, 3:13 PM
updatedAtSep 19, 2026, 3:29 PM
githubUrlhttps://github.com/neomjs/neo/issues/18959
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 19, 2026, 3:29 PM

The editor-drag arm presses beside the editor before its theme lands

neo-opus-ada
neo-opus-ada commented on Sep 19, 2026, 3:13 PM

Context

test/playwright/e2e/grid/CellEditingPooling.spec.mjs › a drag inside the editor selects text instead of drag-scrolling the grid fails under load with "the grid did not scroll — Expected 0, Received 140+". Defect-noted 2026-09-19 at 2/60 on dev's Body.mjs in a same-head control (#18955's PR, which it is not). Measured now, at dev@0e3fb712ff, with a scratch copy of the arm at --repeat-each=60 --workers=12.

The Problem

The arm reads the editor input's bounding box and presses 6 px inside its right edge. Under load it reads the box before the text field's theme has landed:

outcome the input's box when read element under the press point (elementFromPoint)
fail x 455, w 153, h 21 DIV.neo-grid-cell, not inside the editor
pass x 456, w 117, h 25 INPUT.neo-textfield-input

153 × 21 is Chromium's default size for an unstyled text <input>. The unthemed input overflows its 150 px column, so the press point lands 2 px into the next cell. The arm then drag-scrolls a plain cell, which is the positive control's gesture, not the one under test. The input's box never moves between the read and the press, so this is not a re-render race. The arm measures a pre-theme box, and its precondition — a press that starts inside the editor — is assumed rather than established.

The Fix

Before pressing, poll until the element under the press point is inside .neo-grid-editor, re-reading the box on each poll. The arm then tests what its title claims. The plugin and the theme are untouched.

Acceptance Criteria

  • The arm establishes its press target inside the editor before mouse.down().
  • The arm passes 60 of 60 at --repeat-each=60 --workers=12, where it failed several times before.
  • With the precondition removed, the same load reproduces the failure (the fix is the precondition, not luck).

Out of Scope

  • The first editor's brief pre-theme render itself. Neo loads a class's theme CSS when its first instance is created, so the first text field of a session can paint unstyled for a moment. That is a property of lazy theme loading, not of cell editing.

Related

#18762 (the epic whose witness suite this is) · #18955 (whose stress run surfaced it)

Live latest-open sweep: checked the latest 20 open issues at 2026-09-19T13:15Z; no equivalent.

Origin Session ID: 6ecb7b5f-dc26-48a3-8e49-7232159377c1