From 711ac22fd8048b28f057b3a447d58e33d16fc0d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Sun, 10 May 2026 18:27:58 +0000 Subject: [PATCH] fix(runtime): add setter to delegated __player properties The property delegation on window.__player used Object.defineProperty with only a getter, causing "Cannot set property renderSeek which has only a getter" when Studio's motion-wrapping code tried to reassign __player.renderSeek with a wrapped version. This cascaded into an infinite error loop making the timeline unusable. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/core/src/runtime/init.test.ts | 29 ++++++++++++++++++++++++++ packages/core/src/runtime/init.ts | 3 +++ 2 files changed, 32 insertions(+) diff --git a/packages/core/src/runtime/init.test.ts b/packages/core/src/runtime/init.test.ts index 24c11cb9c..d45fb9552 100644 --- a/packages/core/src/runtime/init.test.ts +++ b/packages/core/src/runtime/init.test.ts @@ -282,4 +282,33 @@ describe("initSandboxRuntimeModular", () => { expect(video.paused).toBe(true); expect(video.currentTime).toBe(0); }); + + it("allows external code to reassign delegated __player methods", () => { + const root = document.createElement("div"); + root.setAttribute("data-composition-id", "main"); + root.setAttribute("data-root", "true"); + root.setAttribute("data-start", "0"); + root.setAttribute("data-width", "1920"); + root.setAttribute("data-height", "1080"); + document.body.appendChild(root); + + (window as Window & { __timelines?: Record }).__timelines = { + main: createMockTimeline(10), + }; + + initSandboxRuntimeModular(); + + const player = ( + window as Window & { + __player?: { renderSeek: (timeSeconds: number) => void }; + } + ).__player; + expect(player).toBeDefined(); + if (!player) return; + + const original = player.renderSeek; + expect(() => { + player.renderSeek = (t: number) => original(t); + }).not.toThrow(); + }); }); diff --git a/packages/core/src/runtime/init.ts b/packages/core/src/runtime/init.ts index b395198cd..1493b3d8c 100644 --- a/packages/core/src/runtime/init.ts +++ b/packages/core/src/runtime/init.ts @@ -1955,6 +1955,9 @@ export function initSandboxRuntimeModular(): void { for (const key of delegated) { Object.defineProperty(playerApi, key, { get: () => player[key], + set: (v: unknown) => { + (player as Record)[key] = v; + }, configurable: true, }); }