Frontmatter
| id | 9390 |
| title | E2E: Fix GridRowScrollPinning Registration and DOM Lookup Flaws |
| state | Closed |
| labels | enhancementaiarchitecturegrid |
| assignees | tobiu |
| createdAt | Mar 8, 2026, 2:03 PM |
| updatedAt | Mar 8, 2026, 2:04 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9390 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9380 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 8, 2026, 2:04 PM |
E2E: Fix GridRowScrollPinning Registration and DOM Lookup Flaws
tobiu added parent issue #9380 on Mar 8, 2026, 2:03 PM

tobiu
Mar 8, 2026, 2:03 PM
Input from Gemini 3.1 Pro:
✦ I have committed and pushed the fixes summarizing our last few debugging turns.
The
GridRowScrollPinningaddon now correctly registers, finds the__wrapperDOM node to calculate accuratescrollTopvalues, parses negative/floattranslate3dvalues via a constant regex, and accounts fordelta.actionbeing implicitly undefined in VDOM attribute updates.Closing this ticket so we can move on to analyzing the remaining visual flaws in the pinning logic.
tobiu assigned to @tobiu on Mar 8, 2026, 2:04 PM
tobiu closed this issue on Mar 8, 2026, 2:04 PM
This ticket documents and summarizes the critical bug fixes and architectural cleanups applied to the
GridRowScrollPinningMain Thread addon and its integration with theScrollManagerto resolve initial integration failures.Completed Fixes & Cleanups:
ScrollManager): The initial implementation guarded the registration insideafterSetRowScrollPinningwithif (oldValue !== undefined). Because the config defaults totrue, this prevented the addon from ever registering. The guard was removed.GridRowScrollPinning):Neo.vdom.Helper.compareAttributesdoes not explicitly setaction: 'updateNode'on deltas, relying on the main thread to default to it. The addon's strict checkdelta.action === 'updateNode'caused it to ignore all incoming row updates. The check was updated to(!delta.action || delta.action === 'updateNode').Ytransforms (e.g.,translate3d(0px, -50px, 0px)). The initial regex\d+only matched positive integers, causing negative transform strings to be ignored, resulting in massive row overlapping. The regex was updated to/-?\d+(?:\.\d+)?/and parsing was switched toparseFloat.grid-bodynode forscrollTop, which was always0. The addon was updated to explicitly append the__wrappersuffix to target the internal scrollable container node (DomAccess.getElement(registration.bodyId + '__wrapper')).translateRegexwas extracted to a module-level constant to prevent expensive recompilation on every row iteration.ScrollManagerthat passed the__wrappersuffix in the registry ID, restoring the cleanbodyIdregistry pattern.