Frontmatter
| id | 9503 |
| title | TimelineCanvas regression: Canvas not showing due to SharedCanvas getCanvasId() mismatch with componentId |
| state | Closed |
| labels | bugai |
| assignees | tobiu |
| createdAt | Mar 17, 2026, 7:20 PM |
| updatedAt | Mar 17, 2026, 7:21 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9503 |
| author | tobiu |
| commentsCount | 0 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 17, 2026, 7:21 PM |
When fixing issue #9479 to implement Triangular Communication for OffscreenCanvas transfers, we changed how
Canvas.mjsregisters callbacks. Previously, it relied purely on thenodeIdinNeo.main.DomAccess.transferCanvasToWorker({nodeId}). However,SharedCanvasoverridesgetCanvasId()to return the inner<canvas>tag's id, whereasme.idrefers to thedivwrapper. Because we didn't passcomponentIddown through the triangular communication (Main->Canvas Worker->App Worker),onCanvasRegistered({nodeId})inworker/App.mjswas usingnodeId(the inner canvas) to look up the component viaNeo.get(). This lookup failed forSharedCanvasinstances likeTimelineCanvas, because theircomponentIdis different from thenodeIdof the<canvas>tag. This PR fixes the issue by explicitly passingcomponentIdfromCanvas.mjstoMain, then toCanvas Worker, and back toApp Worker, ensuringNeo.get(componentId)resolves correctly.