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) <noreply@anthropic.com>
This commit is contained in:
Miguel Ángel
2026-05-10 18:27:58 +00:00
co-authored by Claude Opus 4.6
parent bd7bbae42d
commit 711ac22fd8
2 changed files with 32 additions and 0 deletions
+29
View File
@@ -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<string, RuntimeTimelineLike> }).__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();
});
});
+3
View File
@@ -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<string, unknown>)[key] = v;
},
configurable: true,
});
}