diff --git a/CHANGELOG.md b/CHANGELOG.md index db2eee89..ca1aa20e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added -- +- Add target element id to `ex.Screen.goFullScreen('some-element-id')` to influence the fullscreen element in the fullscreen browser API. ### Fixed diff --git a/sandbox/src/game.ts b/sandbox/src/game.ts index 34f9ecaf..5bc5551b 100644 --- a/sandbox/src/game.ts +++ b/sandbox/src/game.ts @@ -94,7 +94,7 @@ fullscreenButton.addEventListener('click', () => { if (game.screen.isFullScreen) { game.screen.exitFullScreen(); } else { - game.screen.goFullScreen(); + game.screen.goFullScreen('container'); } }); game.showDebug(true); diff --git a/src/engine/Screen.ts b/src/engine/Screen.ts index 02f11b89..fa19a0b4 100644 --- a/src/engine/Screen.ts +++ b/src/engine/Screen.ts @@ -439,8 +439,17 @@ export class Screen { /** * Requests to go fullscreen using the browser fullscreen api, requires user interaction to be successful. * For example, wire this to a user click handler. - */ - public goFullScreen(): Promise { + * + * Optionally specify a target element id to go fullscreen, by default the game canvas is used + * @param elementId + */ + public goFullScreen(elementId?: string): Promise { + if (elementId) { + const maybeElement = document.getElementById(elementId); + if (maybeElement) { + return maybeElement.requestFullscreen(); + } + } return this._canvas.requestFullscreen(); } diff --git a/src/spec/ScreenSpec.ts b/src/spec/ScreenSpec.ts index c03e2b2a..784e1f19 100644 --- a/src/spec/ScreenSpec.ts +++ b/src/spec/ScreenSpec.ts @@ -418,6 +418,45 @@ describe('A Screen', () => { expect(screen).toBeVector(ex.vec(800, 600)); }); + it('will go fullscreen with the canvas element by default', () => { + const mockCanvas = jasmine.createSpyObj('canvas', ['addEventListener', 'removeEventListener', 'requestFullscreen']); + mockCanvas.style = {}; + const sut = new ex.Screen({ + canvas: mockCanvas, + context, + browser, + displayMode: ex.DisplayMode.Fixed, + viewport: { width: 800, height: 600 } + }); + + sut.goFullScreen(); + + expect(mockCanvas.requestFullscreen).toHaveBeenCalled(); + }); + + it('will go fullscreen given an element id', () => { + const container = document.createElement('div'); + container.id = 'some-id'; + container.appendChild(canvas); + document.body.appendChild(container); + + const sut = new ex.Screen({ + canvas, + context, + browser, + displayMode: ex.DisplayMode.Fixed, + viewport: { width: 800, height: 600 } + }); + + const fakeElement = jasmine.createSpyObj('element', ['requestFullscreen']); + spyOn(document, 'getElementById').and.returnValue(fakeElement); + + sut.goFullScreen('some-id'); + + expect(document.getElementById).toHaveBeenCalledWith('some-id'); + expect(fakeElement.requestFullscreen).toHaveBeenCalled(); + }); + it('can round trip convert coordinates', () => { Object.defineProperty(window, 'innerWidth', { writable: true, configurable: true, value: 1300 }); Object.defineProperty(window, 'innerHeight', { writable: true, configurable: true, value: 800 });