Skip to content

Commit 3921b7f

Browse files
authoredJul 6, 2021
fix: properly return promise from requestFullscreen and exitFullscreen (#7299)
Mapping the promise returned from the helpers to the executor's resolve, and reject methods. We also need to catch the error in the promise chain that's created inside exitFullscreenHelper_. Fixes #7298.
1 parent fab6e87 commit 3921b7f

File tree

6 files changed

+139
-62
lines changed

6 files changed

+139
-62
lines changed
 

‎package-lock.json

+47-55
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@
139139
"remark-validate-links": "^8.0.2",
140140
"replace": "^1.2.1",
141141
"rollup": "^2.2.0",
142-
"rollup-plugin-istanbul": "^3.0.0",
143142
"rollup-plugin-alias": "^1.5.2",
144143
"rollup-plugin-babel": "^4.4.0",
145144
"rollup-plugin-commonjs": "^9.3.4",
146145
"rollup-plugin-ignore": "^1.0.5",
146+
"rollup-plugin-istanbul": "^3.0.0",
147147
"rollup-plugin-json": "^3.1.0",
148148
"rollup-plugin-multi-entry": "^2.0.2",
149149
"rollup-plugin-node-resolve": "^4.2.4",
@@ -153,7 +153,7 @@
153153
"semver": "^5.7.0",
154154
"shelljs": "^0.8.3",
155155
"shx": "^0.3.2",
156-
"sinon": "^7.3.2",
156+
"sinon": "^11.1.1",
157157
"tui-jsdoc-template": "^1.2.2",
158158
"uglify-js": "^3.6.0",
159159
"unified": "^7.0.2",

‎src/js/player.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -2850,7 +2850,7 @@ class Player extends Component {
28502850

28512851
if (promise) {
28522852
promise.then(offHandler, offHandler);
2853-
return promise;
2853+
promise.then(resolve, reject);
28542854
}
28552855
});
28562856
}
@@ -2928,7 +2928,8 @@ class Player extends Component {
29282928

29292929
if (promise) {
29302930
promise.then(offHandler, offHandler);
2931-
return promise;
2931+
// map the promise to our resolve/reject methods
2932+
promise.then(resolve, reject);
29322933
}
29332934
});
29342935
}
@@ -2941,7 +2942,9 @@ class Player extends Component {
29412942
const promise = document[this.fsApi_.exitFullscreen]();
29422943

29432944
if (promise) {
2944-
promise.then(() => this.isFullscreen(false));
2945+
// we're splitting the promise here, so, we want to catch the
2946+
// potential error so that this chain doesn't have unhandled errors
2947+
silencePromise(promise.then(() => this.isFullscreen(false)));
29452948
}
29462949

29472950
return promise;

‎test/karma.conf.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ module.exports = function(config) {
3939
config.files = [
4040
'node_modules/es5-shim/es5-shim.js',
4141
'node_modules/es6-shim/es6-shim.js',
42-
'node_modules/sinon/pkg/sinon.js',
42+
// make sinon be available via karma's server but don't include it directly
43+
{ pattern: 'node_modules/sinon/pkg/sinon.js', included: false, served: true },
44+
'test/sinon.js',
4345
'dist/video-js.css',
4446
'test/dist/bundle.js',
4547
'test/dist/browserify.js',

‎test/sinon.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* eslint-disable no-undef */
2+
3+
const s = document.createElement('script');
4+
5+
// on IE11 and Safari 9, load the last supported sinon version
6+
if (/(?:MSIE|Trident\/7.0|Version\/9.*Safari)/.test(navigator.userAgent)) {
7+
s.src = 'https://unpkg.com/sinon@9.2.4/pkg/sinon-no-sourcemaps.js';
8+
} else {
9+
s.src = '/test/base/node_modules/sinon/pkg/sinon.js';
10+
}
11+
12+
document.write(s.outerHTML);

‎test/unit/player-fullscreen.test.js

+69-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Player from '../../src/js/player.js';
33
import TestHelpers from './test-helpers.js';
44
import sinon from 'sinon';
55
import window from 'global/window';
6+
import document from 'global/document';
67

78
const FullscreenTestHelpers = {
89
makePlayer(prefixed, playerOptions, videoTag) {
@@ -229,7 +230,7 @@ QUnit.test('full window can be preferred to fullscreen tech', function(assert) {
229230
});
230231

231232
QUnit.test('fullwindow mode should exit when ESC event triggered', function(assert) {
232-
const player = FullscreenTestHelpers.makePlayer(true);
233+
const player = TestHelpers.makePlayer();
233234

234235
player.enterFullWindow();
235236
assert.ok(player.isFullWindow, 'enterFullWindow should be called');
@@ -280,3 +281,70 @@ QUnit.test('fullscreenerror event from Html5 should pass through player', functi
280281

281282
player.dispose();
282283
});
284+
285+
// only run where we have sinon.promise
286+
const skipOrTest = sinon.promise ? 'test' : 'skip';
287+
288+
QUnit[skipOrTest]('requestFullscreen returns a rejected promise if unable to go fullscreen', function(assert) {
289+
const player = TestHelpers.makePlayer();
290+
const playerEl = player.el();
291+
const stub = sinon.stub(playerEl, player.fsApi_.requestFullscreen);
292+
const promise = sinon.promise();
293+
294+
stub.returns(promise);
295+
promise.reject(new Error('Cannot go fullscreen'));
296+
297+
assert.rejects(
298+
player.requestFullscreen(),
299+
new Error('Cannot go fullscreen'),
300+
'our promise was rejected'
301+
);
302+
303+
stub.restore();
304+
});
305+
306+
QUnit[skipOrTest]('requestFullscreen returns a resolved promise if we were fullscreen', function(assert) {
307+
const player = TestHelpers.makePlayer();
308+
const playerEl = player.el();
309+
const stub = sinon.stub(playerEl, player.fsApi_.requestFullscreen);
310+
const promise = sinon.promise();
311+
312+
stub.returns(promise);
313+
// pretend we successfully went fullscreen.
314+
promise.resolve();
315+
316+
player.requestFullscreen().then(() => assert.ok(true, 'our promise resolved'));
317+
318+
stub.restore();
319+
});
320+
321+
QUnit[skipOrTest]('exitFullscreen returns a rejected promise if document is not active', function(assert) {
322+
const player = TestHelpers.makePlayer();
323+
const stub = sinon.stub(document, player.fsApi_.exitFullscreen);
324+
const promise = sinon.promise();
325+
326+
stub.returns(promise);
327+
promise.reject(new Error('Document not active'));
328+
329+
assert.rejects(
330+
player.exitFullscreen(),
331+
new Error('Document not active'),
332+
'our promise was rejected'
333+
);
334+
335+
stub.restore();
336+
});
337+
338+
QUnit[skipOrTest]('exitFullscreen returns a resolved promise if we were fullscreen', function(assert) {
339+
const player = TestHelpers.makePlayer();
340+
const stub = sinon.stub(document, player.fsApi_.exitFullscreen);
341+
const promise = sinon.promise();
342+
343+
stub.returns(promise);
344+
// pretend we successfully exited.
345+
promise.resolve();
346+
347+
player.exitFullscreen().then(() => assert.ok(true, 'our promise resolved'));
348+
349+
stub.restore();
350+
});

0 commit comments

Comments
 (0)
Please sign in to comment.