fix(player): treat runtime timeline as cross-origin ready (#1690)

This commit is contained in:
Miguel Ángel
2026-06-24 00:39:53 -04:00
committed by GitHub
parent 546b2d770b
commit ea23e6309f
5 changed files with 89 additions and 0 deletions
@@ -1807,6 +1807,9 @@ describe("HyperframesPlayer runtime ready handshake", () => {
volume: number;
audioLocked: boolean;
playbackRate: number;
ready: boolean;
duration: number;
paused: boolean;
iframe: HTMLIFrameElement;
_onMessage: (event: MessageEvent) => void;
}
@@ -1822,6 +1825,18 @@ describe("HyperframesPlayer runtime ready handshake", () => {
});
}
function timelineMessage(durationInFrames = 120) {
return new MessageEvent("message", {
source: frameWindow,
data: {
source: "hf-preview",
type: "timeline",
durationInFrames,
scenes: [],
},
});
}
function findControlCalls(action: string) {
return postSpy.mock.calls.filter((call) => {
const data = call[0] as { type?: string; action?: string };
@@ -1951,6 +1966,29 @@ describe("HyperframesPlayer runtime ready handshake", () => {
expect(findControlCalls("set-muted")).toHaveLength(0);
});
it("treats a cross-origin runtime timeline message as player ready", () => {
const readyEvents: Array<{ duration: number }> = [];
player.addEventListener("ready", (event) => {
readyEvents.push((event as CustomEvent<{ duration: number }>).detail);
});
player._onMessage(timelineMessage(120));
expect(player.ready).toBe(true);
expect(player.duration).toBe(4);
expect(readyEvents).toEqual([{ duration: 4 }]);
});
it("honors autoplay after cross-origin runtime timeline readiness", () => {
player.setAttribute("autoplay", "");
postSpy.mockClear();
player._onMessage(timelineMessage(120));
expect(player.paused).toBe(false);
expect(findControlCalls("play")).toHaveLength(1);
});
});
describe("HyperframesPlayer audio lock — Claude desktop UA fallback", () => {