Skip to content

Commit 205f3c8

Browse files
authored
feat: add fullscreen API on player element (#1107)
this is needed for iOS. fix #643
1 parent 9f27791 commit 205f3c8

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

examples/vanilla-ts-esm/public/mux-player.html

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,28 @@ <h2>On-demand</h2>
5656
});
5757
</script>
5858

59+
<button id="request-fullscreen">
60+
Request Fullscreen
61+
</button>
62+
<script>
63+
document.getElementById('request-fullscreen').addEventListener('click', async () => {
64+
const player = document.querySelector('mux-player');
65+
await player.requestFullscreen();
66+
console.log('Entered fullscreen');
67+
});
68+
</script>
69+
70+
<button id="exit-fullscreen">
71+
Exit Fullscreen
72+
</button>
73+
<script>
74+
document.getElementById('exit-fullscreen').addEventListener('click', async () => {
75+
const player = document.querySelector('mux-player');
76+
await player.exitFullscreen();
77+
console.log('Exited fullscreen');
78+
});
79+
</script>
80+
5981
<h2>Live</h2>
6082

6183
<mux-player

packages/mux-player/src/index.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { globalThis, document } from './polyfills';
22
import { MediaController, MediaErrorDialog } from 'media-chrome';
33
import { Attributes as MediaControllerAttributes } from 'media-chrome/dist/media-container.js';
4-
import { MediaUIAttributes } from 'media-chrome/dist/constants.js';
4+
import { MediaStateChangeEvents, MediaUIAttributes, MediaUIEvents } from 'media-chrome/dist/constants.js';
55
import 'media-chrome/dist/experimental/index.js';
66
import { MediaThemeElement } from 'media-chrome/dist/media-theme-element.js';
77
import MuxVideoElement, { MediaError, Attributes as MuxVideoAttributes } from '@mux/mux-video';
@@ -809,6 +809,40 @@ class MuxPlayerElement extends VideoApiElement implements MuxPlayerElement {
809809
this.#render({ [toPropName(attrName)]: newValue });
810810
}
811811

812+
async requestFullscreen(_options?: FullscreenOptions) {
813+
if (!this.mediaController || this.mediaController.hasAttribute(MediaUIAttributes.MEDIA_IS_FULLSCREEN)) {
814+
return;
815+
}
816+
this.mediaController?.dispatchEvent(
817+
new globalThis.CustomEvent(MediaUIEvents.MEDIA_ENTER_FULLSCREEN_REQUEST, {
818+
composed: true,
819+
bubbles: true,
820+
})
821+
);
822+
return new Promise<void>((resolve, _reject) => {
823+
this.mediaController?.addEventListener(MediaStateChangeEvents.MEDIA_IS_FULLSCREEN, () => resolve(), {
824+
once: true,
825+
});
826+
});
827+
}
828+
829+
async exitFullscreen() {
830+
if (!this.mediaController || !this.mediaController.hasAttribute(MediaUIAttributes.MEDIA_IS_FULLSCREEN)) {
831+
return;
832+
}
833+
this.mediaController?.dispatchEvent(
834+
new globalThis.CustomEvent(MediaUIEvents.MEDIA_EXIT_FULLSCREEN_REQUEST, {
835+
composed: true,
836+
bubbles: true,
837+
})
838+
);
839+
return new Promise<void>((resolve, _reject) => {
840+
this.mediaController?.addEventListener(MediaStateChangeEvents.MEDIA_IS_FULLSCREEN, () => resolve(), {
841+
once: true,
842+
});
843+
});
844+
}
845+
812846
get preferCmcd() {
813847
return (this.getAttribute(MuxVideoAttributes.PREFER_CMCD) as ValueOf<CmcdTypes>) ?? undefined;
814848
}

0 commit comments

Comments
 (0)