1
0
mirror of https://github.com/videojs/video.js.git synced 2025-01-02 06:32:07 +02:00

fix(player): adapt player height to control bar height in audioOnly mode (#8579)

Adapts the `player.height` to the `controlBar.currentHeight` when the
`audioOnlyMode` is `enabled`. This ensures that the player height and control
bar height are always in sync when the player is resized.

- add `updatePlayerHeightOnAudioOnlyMode_` function that will update the player
height according to the control bar height when the player is resized
- modify `enableAudioOnlyUI_`
  - add a `controlBarHeight` to `audioOnlyCache_` to keep track of the control
  bar height changes when the player is resized
  - add a `playerresize` listener
- modify `disableAudioOnlyUI_` to remove the `playerresize` listener
This commit is contained in:
André M 2024-05-03 14:15:01 +02:00 committed by GitHub
parent 31b037891b
commit 8050466bcc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 0 deletions

View File

@ -360,6 +360,8 @@ class Player extends Component {
this.boundHandleTechTouchEnd_ = (e) => this.handleTechTouchEnd_(e);
this.boundHandleTechTap_ = (e) => this.handleTechTap_(e);
this.boundUpdatePlayerHeightOnAudioOnlyMode_ = (e) => this.updatePlayerHeightOnAudioOnlyMode_(e);
// default isFullscreen_ to false
this.isFullscreen_ = false;
@ -396,6 +398,7 @@ class Player extends Component {
// Init state audioOnlyCache_
this.audioOnlyCache_ = {
controlBarHeight: null,
playerHeight: null,
hiddenChildren: []
};
@ -4504,6 +4507,17 @@ class Player extends Component {
return !!this.isAudio_;
}
updatePlayerHeightOnAudioOnlyMode_() {
const controlBar = this.getChild('ControlBar');
if (!controlBar || this.audioOnlyCache_.controlBarHeight === controlBar.currentHeight()) {
return;
}
this.audioOnlyCache_.controlBarHeight = controlBar.currentHeight();
this.height(this.audioOnlyCache_.controlBarHeight);
}
enableAudioOnlyUI_() {
// Update styling immediately to show the control bar so we can get its height
this.addClass('vjs-audio-only-mode');
@ -4527,6 +4541,9 @@ class Player extends Component {
});
this.audioOnlyCache_.playerHeight = this.currentHeight();
this.audioOnlyCache_.controlBarHeight = controlBarHeight;
this.on('playerresize', this.boundUpdatePlayerHeightOnAudioOnlyMode_);
// Set the player height the same as the control bar
this.height(controlBarHeight);
@ -4535,6 +4552,7 @@ class Player extends Component {
disableAudioOnlyUI_() {
this.removeClass('vjs-audio-only-mode');
this.off('playerresize', this.boundUpdatePlayerHeightOnAudioOnlyMode_);
// Show player components that were previously hidden
this.audioOnlyCache_.hiddenChildren.forEach(child => child.show());

View File

@ -3401,6 +3401,33 @@ QUnit.test('turning on audioPosterMode when audioOnlyMode is already on will tur
});
});
QUnit.test('player height should match control bar height when audioOnlyMode is enabled', function(assert) {
const player = TestHelpers.makePlayer({ responsive: true, width: 320, height: 240 });
player.trigger('ready');
player.audioOnlyMode(true).then(() => {
const initialPlayerHeight = player.currentHeight();
player.width(768);
player.el().style.fontSize = '20px';
player.trigger('playerresize');
assert.ok(initialPlayerHeight !== player.currentHeight(), 'player height is updated');
})
.then(() => player.audioOnlyMode(false))
.then(() => {
const initialPlayerHeight = player.currentHeight();
player.width(768);
player.el().style.fontSize = '20px';
player.trigger('playerresize');
assert.equal(player.currentHeight(), initialPlayerHeight, 'player height remains unchanged');
assert.ok(initialPlayerHeight !== player.controlBar.currentHeight(), 'player height is different from control bar height');
});
});
QUnit.test('player#load resets the media element to its initial state', function(assert) {
const player = TestHelpers.makePlayer({});