Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions packages/core/src/runtime/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1102,7 +1102,9 @@ export function initSandboxRuntimeModular(): void {
};
node.addEventListener("error", onError);
registerRuntimeCleanup(() => {
node.removeEventListener("error", onError);
if (typeof node.removeEventListener === "function") {
node.removeEventListener("error", onError);
}
});
}

Expand Down Expand Up @@ -1232,8 +1234,10 @@ export function initSandboxRuntimeModular(): void {

const unbindMediaMetadataListeners = () => {
for (const mediaEl of metadataBoundMedia) {
mediaEl.removeEventListener("loadedmetadata", scheduleMetadataDurationHydration);
mediaEl.removeEventListener("durationchange", scheduleMetadataDurationHydration);
if (typeof mediaEl.removeEventListener === "function") {
mediaEl.removeEventListener("loadedmetadata", scheduleMetadataDurationHydration);
mediaEl.removeEventListener("durationchange", scheduleMetadataDurationHydration);
}
}
metadataBoundMedia.clear();
};
Expand Down
5 changes: 3 additions & 2 deletions packages/core/src/runtime/media.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ export function syncRuntimeMedia(params: {
// seconds. The canplay listener was also racey — the event could
// fire between `load()` and `addEventListener` attachment, wedging
// the element waiting for a callback that never came.
if (typeof el.play !== "function") continue;
markPlayRequested(el);
void el.play().catch((err: unknown) => {
// If play() rejects — e.g. autoplay blocked, element removed
Expand All @@ -274,7 +275,7 @@ export function syncRuntimeMedia(params: {
if (name === "NotAllowedError") params.onAutoplayBlocked?.();
});
} else if (!params.playing && !el.paused) {
el.pause();
if (typeof el.pause === "function") el.pause();
}
continue;
}
Expand All @@ -283,6 +284,6 @@ export function syncRuntimeMedia(params: {
lastOffset.delete(el);
strictDriftSamples.delete(el);
seekLoadRetried.delete(el);
if (!el.paused) el.pause();
if (!el.paused && typeof el.pause === "function") el.pause();
}
}
12 changes: 7 additions & 5 deletions packages/player/src/parent-media.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ export class ParentMediaManager {
destroy(): void {
this.teardownObserver();
for (const m of this._entries) {
m.el.pause();
if (typeof m.el.pause === "function") m.el.pause();
m.el.src = "";
}
this._entries = [];
Expand All @@ -118,13 +118,15 @@ export class ParentMediaManager {

playAll(): void {
for (const m of this._entries) {
if (!m.el.src) continue;
if (!m.el.src || typeof m.el.play !== "function") continue;
m.el.play().catch((err: unknown) => this._reportPlaybackError(err));
}
}

pauseAll(): void {
for (const m of this._entries) m.el.pause();
for (const m of this._entries) {
if (typeof m.el.pause === "function") m.el.pause();
}
}

seekAll(timeInSeconds: number): void {
Expand Down Expand Up @@ -278,7 +280,7 @@ export class ParentMediaManager {
// up immediately — bypass the jitter-coalescing gate.
if (created && this._audioOwner === "parent") {
this.mirrorTime(this._getCurrentTime(), { force: true });
if (!this._isPaused() && created.el.src) {
if (!this._isPaused() && created.el.src && typeof created.el.play === "function") {
created.el.play().catch((err: unknown) => this._reportPlaybackError(err));
}
}
Expand All @@ -292,7 +294,7 @@ export class ParentMediaManager {
const idx = this._entries.findIndex((m) => m.el.src === src);
if (idx === -1) return;
const entry = this._entries[idx];
entry.el.pause();
if (typeof entry.el.pause === "function") entry.el.pause();
entry.el.src = "";
this._entries.splice(idx, 1);
}
Expand Down
14 changes: 9 additions & 5 deletions packages/studio/src/player/components/Player.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,15 @@ export const Player = forwardRef<HTMLIFrameElement, PlayerProps>(
iframe.addEventListener("load", handleLoad);

cleanup = () => {
iframe.removeEventListener("load", handleLoad);
player.removeEventListener("click", preventToggle, { capture: true });
player.removeEventListener("shadertransitionstate", handleShaderTransitionState);
player.removeEventListener("ready", handleReady);
player.removeEventListener("error", handleError);
if (typeof iframe.removeEventListener === "function") {
iframe.removeEventListener("load", handleLoad);
}
if (typeof player.removeEventListener === "function") {
player.removeEventListener("click", preventToggle, { capture: true });
player.removeEventListener("shadertransitionstate", handleShaderTransitionState);
player.removeEventListener("ready", handleReady);
player.removeEventListener("error", handleError);
}
if (assetPollRef.current) clearInterval(assetPollRef.current);
assetPollRef.current = null;
container.removeChild(player);
Expand Down
8 changes: 5 additions & 3 deletions packages/studio/src/player/components/PlayerControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,11 @@ export const PlayerControls = memo(function PlayerControls({
/* Already released after the first cleanup — second invocation
via the window-fallback or visibility path is a no-op throw. */
}
target.removeEventListener("pointermove", onMove);
target.removeEventListener("pointerup", onUp);
target.removeEventListener("pointercancel", onUp);
if (typeof target.removeEventListener === "function") {
target.removeEventListener("pointermove", onMove);
target.removeEventListener("pointerup", onUp);
target.removeEventListener("pointercancel", onUp);
}
window.removeEventListener("pointerup", onUp);
window.removeEventListener("pointercancel", onUp);
document.removeEventListener("visibilitychange", onVisibilityChange);
Expand Down
12 changes: 8 additions & 4 deletions packages/studio/src/player/hooks/usePlaybackKeyboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,10 +197,14 @@ export function usePlaybackKeyboard({
iframeDoc?.addEventListener("keydown", handleIframeKeyDown, true);
iframeDoc?.addEventListener("keyup", handleIframeKeyUp, true);
iframeShortcutCleanupRef.current = () => {
iframeWin?.removeEventListener("keydown", handleIframeKeyDown, true);
iframeWin?.removeEventListener("keyup", handleIframeKeyUp, true);
iframeDoc?.removeEventListener("keydown", handleIframeKeyDown, true);
iframeDoc?.removeEventListener("keyup", handleIframeKeyUp, true);
if (typeof iframeWin?.removeEventListener === "function") {
iframeWin.removeEventListener("keydown", handleIframeKeyDown, true);
iframeWin.removeEventListener("keyup", handleIframeKeyUp, true);
}
if (typeof iframeDoc?.removeEventListener === "function") {
iframeDoc.removeEventListener("keydown", handleIframeKeyDown, true);
iframeDoc.removeEventListener("keyup", handleIframeKeyUp, true);
}
};
}, [iframeRef, iframeShortcutCleanupRef]);

Expand Down
Loading