@npo/player 1.27.7 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -7
- package/lib/js/markers/updateLiveMarkers.d.ts +7 -2
- package/lib/js/markers/updateLiveMarkers.js +11 -4
- package/lib/js/markers/updateLiveMarkers.test.js +13 -3
- package/lib/js/playeractions/handlers/handleoffsets.test.js +1 -1
- package/lib/js/playeractions/handlers/mediasessionactions.d.ts +7 -2
- package/lib/js/playeractions/handlers/mediasessionactions.js +7 -7
- package/lib/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
- package/lib/js/playeractions/handlers/processplayerconfig.js +1 -1
- package/lib/js/playeractions/handlers/processplayerconfig.test.js +1 -1
- package/lib/js/playeractions/handlers/processsourceconfig.d.ts +11 -2
- package/lib/js/playeractions/handlers/processsourceconfig.js +35 -18
- package/lib/js/playeractions/handlers/removereplayclass.d.ts +1 -1
- package/lib/js/playeractions/handlers/removereplayclass.js +1 -1
- package/lib/js/playeractions/handlers/removereplayclass.test.js +1 -1
- package/lib/js/settings/localization.d.ts +1 -0
- package/lib/js/utilities/utilities.jwt.d.ts +2 -0
- package/lib/js/utilities/utilities.jwt.js +22 -0
- package/lib/js/utilities/utilities.stream.js +11 -2
- package/lib/js/utilities/utilities.url.js +2 -2
- package/lib/js/utilities/utilities.version.js +1 -1
- package/lib/js/utilities/utilities.version.test.js +1 -1
- package/lib/lang/nl.json +2 -1
- package/lib/npoplayer.d.ts +6 -5
- package/lib/npoplayer.js +81 -28
- package/lib/package.json +7 -9
- package/lib/services/a11y/setup.test.js +2 -4
- package/lib/services/advertHandlers/handlePreRolls.js +3 -4
- package/lib/services/advertHandlers/handlePrerolls.test.js +2 -3
- package/lib/services/chapterHandlers/chapterHandler.d.ts +35 -0
- package/lib/services/chapterHandlers/chapterHandler.js +230 -0
- package/lib/services/errors/errorBackground.test.js +1 -1
- package/lib/services/errors/errorHandler.d.ts +4 -2
- package/lib/services/errors/errorHandler.js +27 -14
- package/lib/services/errors/errorHandler.test.js +148 -0
- package/lib/services/errors/errorRetryHandler.d.ts +2 -0
- package/lib/services/errors/errorRetryHandler.js +14 -0
- package/lib/services/errors/errorRetryHandler.test.d.ts +1 -0
- package/lib/services/errors/errorRetryHandler.test.js +62 -0
- package/lib/services/errors/errorText.js +8 -5
- package/lib/services/errors/errorText.test.js +3 -3
- package/lib/services/infoPanel/infoPanel.d.ts +3 -0
- package/lib/services/infoPanel/infoPanel.js +35 -0
- package/lib/services/infoPanel/infoPanel.test.d.ts +1 -0
- package/lib/services/infoPanel/infoPanel.test.js +70 -0
- package/lib/services/keyboardHandlers/resolvekeypress.js +11 -1
- package/lib/services/keyboardHandlers/resolvekeypress.test.js +6 -2
- package/lib/services/nicamHandlers/nicamhandler.d.ts +1 -0
- package/lib/services/nicamHandlers/nicamhandler.js +2 -1
- package/lib/services/nicamHandlers/nicamhandler.test.js +2 -2
- package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +8 -2
- package/lib/services/npoPlayerAPI/npoPlayerAPI.js +25 -12
- package/lib/services/npoPlayerAPI/playerModules.d.ts +1 -0
- package/lib/services/npoPlayerAPI/playerModules.js +46 -0
- package/lib/services/preferences/handlePreferences.js +9 -4
- package/lib/services/preferences/handlePreferences.test.js +53 -17
- package/lib/services/segmentHandlers/addSegmentEventListeners.test.js +1 -1
- package/lib/services/segmentHandlers/isSegmentInBounds.d.ts +2 -0
- package/lib/services/segmentHandlers/isSegmentInBounds.js +5 -0
- package/lib/services/segmentHandlers/isSegmentInBounds.test.d.ts +1 -0
- package/lib/services/segmentHandlers/isSegmentInBounds.test.js +27 -0
- package/lib/services/services.d.ts +5 -2
- package/lib/services/services.js +15 -2
- package/lib/services/streamFetchHandler/fetchStream.js +5 -4
- package/lib/services/streamFetchHandler/fetchstream.test.js +25 -3
- package/lib/services/streamoptionsHandlers/streamOptionsHandler.js +11 -9
- package/lib/services/streamoptionsHandlers/streamOptionsHandler.test.js +14 -2
- package/lib/services/trackingHandlers/eventBinding.js +48 -33
- package/lib/services/trackingHandlers/eventBinding.test.js +57 -1
- package/lib/services/trackingHandlers/playerTrackerStart.js +1 -1
- package/lib/services/uiHandlers/uiVisiblityHandler.js +6 -0
- package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.js +0 -9
- package/lib/src/js/markers/updateLiveMarkers.d.ts +7 -2
- package/lib/src/js/playeractions/handlers/mediasessionactions.d.ts +7 -2
- package/lib/src/js/playeractions/handlers/processplayerconfig.d.ts +1 -1
- package/lib/src/js/playeractions/handlers/processsourceconfig.d.ts +11 -2
- package/lib/src/js/playeractions/handlers/removereplayclass.d.ts +1 -1
- package/lib/src/js/settings/localization.d.ts +1 -0
- package/lib/src/js/utilities/utilities.jwt.d.ts +2 -0
- package/lib/src/npoplayer.d.ts +6 -5
- package/lib/src/services/chapterHandlers/chapterHandler.d.ts +35 -0
- package/lib/src/services/errors/errorHandler.d.ts +4 -2
- package/lib/src/services/errors/errorRetryHandler.d.ts +2 -0
- package/lib/src/services/errors/errorRetryHandler.test.d.ts +1 -0
- package/lib/src/services/infoPanel/infoPanel.d.ts +3 -0
- package/lib/src/services/infoPanel/infoPanel.test.d.ts +1 -0
- package/lib/src/services/nicamHandlers/nicamhandler.d.ts +1 -0
- package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +8 -2
- package/lib/src/services/npoPlayerAPI/playerModules.d.ts +1 -0
- package/lib/src/services/segmentHandlers/isSegmentInBounds.d.ts +2 -0
- package/lib/src/services/segmentHandlers/isSegmentInBounds.test.d.ts +1 -0
- package/lib/src/services/services.d.ts +5 -2
- package/lib/src/types/events.d.ts +1 -1
- package/lib/src/types/interfaces.d.ts +39 -43
- package/lib/src/ui/components/adbutton.d.ts +3 -6
- package/lib/src/ui/components/adlabel.d.ts +3 -6
- package/lib/src/ui/components/audio/controlbar.d.ts +2 -2
- package/lib/src/ui/components/buttons.d.ts +18 -11
- package/lib/src/ui/components/ctabar.d.ts +4 -10
- package/lib/src/ui/components/infopanel/infopanel.d.ts +3 -0
- package/lib/src/ui/components/infopanel/togglebutton.d.ts +3 -0
- package/lib/src/ui/components/playnext.d.ts +3 -9
- package/lib/src/ui/components/seekbar.d.ts +2 -3
- package/lib/src/ui/components/settingspanel.d.ts +2 -3
- package/lib/src/ui/components/titlebar.d.ts +2 -2
- package/lib/src/ui/handlers/domhandlers.d.ts +2 -2
- package/lib/src/ui/handlers/listboxhandlers.d.ts +18 -4
- package/lib/src/ui/handlers/playnextscreen.d.ts +6 -2
- package/lib/src/ui/uicontainer.d.ts +1 -2
- package/lib/tests/jest.setup-files-after-env.d.ts +0 -0
- package/lib/tests/jest.setup-files-after-env.js +6 -0
- package/lib/tests/jest.setup-tests.d.ts +1 -0
- package/lib/tests/jest.setup-tests.js +2 -0
- package/lib/tests/mocks/mockNpoplayer.js +27 -44
- package/lib/tests/mocks/mockPlayerAPI.d.ts +1 -1
- package/lib/tests/mocks/mockPlayerAPI.js +15 -1
- package/lib/tests/mocks/mockPlayerUi.d.ts +64 -0
- package/lib/tests/mocks/mockPlayerUi.js +251 -0
- package/lib/tests/mocks/playerContextMock.d.ts +3 -66
- package/lib/tests/mocks/playerContextMock.js +34 -7
- package/lib/types/events.d.ts +1 -1
- package/lib/types/events.js +1 -1
- package/lib/types/interfaces.d.ts +39 -43
- package/lib/types/interfaces.js +0 -27
- package/lib/ui/components/adbutton.d.ts +3 -6
- package/lib/ui/components/adbutton.js +2 -1
- package/lib/ui/components/adlabel.d.ts +3 -6
- package/lib/ui/components/adlabel.js +2 -1
- package/lib/ui/components/audio/controlbar.d.ts +2 -2
- package/lib/ui/components/audio/controlbar.js +6 -6
- package/lib/ui/components/buttons.d.ts +18 -11
- package/lib/ui/components/buttons.js +44 -26
- package/lib/ui/components/controlbar.js +13 -9
- package/lib/ui/components/ctabar.d.ts +4 -10
- package/lib/ui/components/ctabar.js +8 -7
- package/lib/ui/components/infopanel/infopanel.d.ts +3 -0
- package/lib/ui/components/infopanel/infopanel.js +40 -0
- package/lib/ui/components/infopanel/togglebutton.d.ts +3 -0
- package/lib/ui/components/infopanel/togglebutton.js +18 -0
- package/lib/ui/components/playnext.d.ts +3 -9
- package/lib/ui/components/playnext.js +3 -3
- package/lib/ui/components/seekbar.d.ts +2 -3
- package/lib/ui/components/seekbar.js +7 -3
- package/lib/ui/components/settingspanel.d.ts +2 -3
- package/lib/ui/components/settingspanel.js +79 -53
- package/lib/ui/components/titlebar.d.ts +2 -2
- package/lib/ui/components/titlebar.js +2 -1
- package/lib/ui/components/topbar.js +8 -5
- package/lib/ui/components/verticalvideo/controlbar.js +5 -2
- package/lib/ui/components/verticalvideo/settingspanel.js +9 -5
- package/lib/ui/handlers/accessibilityhandler.js +11 -22
- package/lib/ui/handlers/accessibilityhandler.test.js +25 -34
- package/lib/ui/handlers/domhandlers.d.ts +2 -2
- package/lib/ui/handlers/listboxhandlers.d.ts +18 -4
- package/lib/ui/handlers/listboxhandlers.js +5 -3
- package/lib/ui/handlers/playnextscreen.d.ts +6 -2
- package/lib/ui/handlers/playnextscreen.js +4 -4
- package/lib/ui/handlers/playnextscreen.test.js +15 -3
- package/lib/ui/uicontainer.d.ts +1 -2
- package/lib/ui/uicontainer.js +24 -8
- package/lib/ui/uicontainer.test.js +6 -5
- package/package.json +7 -9
- package/src/style/components/_advert.scss +0 -4
- package/src/style/components/_buffering.scss +18 -22
- package/src/style/components/_controlbars.scss +0 -4
- package/src/style/components/_icons.scss +18 -4
- package/src/style/components/_infopanel.scss +99 -0
- package/src/style/components/_nicam.scss +6 -2
- package/src/style/components/_seekbarthumbnail.scss +5 -0
- package/src/style/components/_settingspanel.scss +1 -1
- package/src/style/components/_subtitles.scss +0 -1
- package/src/style/components/_textbuttons.scss +30 -1
- package/src/style/components/_volumeslider.scss +0 -1
- package/src/style/components/audio/_bottombar.scss +6 -0
- package/src/style/components/audio/_metadata.scss +25 -9
- package/src/style/components/audio/_topbar.scss +6 -1
- package/src/style/npoplayer.css +166 -83
- package/src/style/npoplayer.scss +10 -2
- package/src/style/variants/_player-audio-only.scss +32 -0
- package/src/style/variants/_player-base.scss +5 -1
- package/src/style/variants/_player-large.scss +3 -3
- package/src/style/variants/_player-medium.scss +5 -1
- package/src/style/variants/_player-small.scss +6 -1
- package/src/style/vars/_colors.scss +1 -1
- package/src/style/vars/_icons.scss +5 -4
- package/src/style/vars/_z-index.scss +1 -1
- package/lib/npoplayer-bridge.test.js +0 -24
- package/lib/src/ui/components/nativemobile/buttons.d.ts +0 -30
- package/lib/src/ui/components/nativemobile/controlbar.d.ts +0 -3
- package/lib/src/ui/components/nativemobile/ctabar.d.ts +0 -11
- package/lib/src/ui/components/nativemobile/titlebar.d.ts +0 -2
- package/lib/src/ui/components/nativemobile/topbar.d.ts +0 -3
- package/lib/src/ui/nativemobileuicontainer.d.ts +0 -5
- package/lib/src/ui/nativemobileuifactory.d.ts +0 -3
- package/lib/src/ui/nativemobileuifactory.test.d.ts +0 -1
- package/lib/ui/components/nativemobile/buttons.d.ts +0 -30
- package/lib/ui/components/nativemobile/buttons.js +0 -233
- package/lib/ui/components/nativemobile/controlbar.d.ts +0 -3
- package/lib/ui/components/nativemobile/controlbar.js +0 -43
- package/lib/ui/components/nativemobile/ctabar.d.ts +0 -11
- package/lib/ui/components/nativemobile/ctabar.js +0 -10
- package/lib/ui/components/nativemobile/titlebar.d.ts +0 -2
- package/lib/ui/components/nativemobile/titlebar.js +0 -7
- package/lib/ui/components/nativemobile/topbar.d.ts +0 -3
- package/lib/ui/components/nativemobile/topbar.js +0 -23
- package/lib/ui/nativemobileuicontainer.d.ts +0 -5
- package/lib/ui/nativemobileuicontainer.js +0 -42
- package/lib/ui/nativemobileuifactory.d.ts +0 -3
- package/lib/ui/nativemobileuifactory.js +0 -112
- package/lib/ui/nativemobileuifactory.test.d.ts +0 -1
- package/lib/ui/nativemobileuifactory.test.js +0 -64
- package/src/style/variants/_player-native-mobile.scss +0 -13
- /package/lib/{npoplayer-bridge.test.d.ts → services/errors/errorHandler.test.d.ts} +0 -0
- /package/lib/src/{npoplayer-bridge.test.d.ts → services/errors/errorHandler.test.d.ts} +0 -0
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { Container } from 'bitmovin-player-ui';
|
|
2
|
-
import { createGoBackLiveButton, createWatchFromStartButton } from './buttons';
|
|
2
|
+
import { createGoBackLiveButton, createWatchFromStartButton, createSkipChapterButton } from './buttons';
|
|
3
3
|
import { createAdButton } from './adbutton';
|
|
4
4
|
import { createAdLabel } from './adlabel';
|
|
5
5
|
import { NpoPlayerUIVariants } from '../../types/interfaces';
|
|
6
|
-
export function createCTABar(
|
|
6
|
+
export function createCTABar(playerContext, variant) {
|
|
7
7
|
const barComponents = [];
|
|
8
8
|
if (variant === NpoPlayerUIVariants.DEFAULT) {
|
|
9
|
-
const goBackLiveButton = createGoBackLiveButton(
|
|
10
|
-
const watchFromStartButton = createWatchFromStartButton(
|
|
11
|
-
|
|
9
|
+
const goBackLiveButton = createGoBackLiveButton(playerContext);
|
|
10
|
+
const watchFromStartButton = createWatchFromStartButton(playerContext);
|
|
11
|
+
const skipChapterButton = createSkipChapterButton(playerContext);
|
|
12
|
+
barComponents.push(watchFromStartButton, goBackLiveButton, skipChapterButton);
|
|
12
13
|
}
|
|
13
14
|
if (variant === NpoPlayerUIVariants.AD) {
|
|
14
|
-
const adLabel = createAdLabel(
|
|
15
|
-
const adButton = createAdButton(
|
|
15
|
+
const adLabel = createAdLabel(playerContext);
|
|
16
|
+
const adButton = createAdButton(playerContext);
|
|
16
17
|
barComponents.push(adLabel, adButton);
|
|
17
18
|
adLabel.hide();
|
|
18
19
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Container, Button } from 'bitmovin-player-ui';
|
|
2
|
+
export function createInfoPanel(playerContext) {
|
|
3
|
+
const { npoPlayer } = playerContext;
|
|
4
|
+
const infoPanel = new Container({
|
|
5
|
+
hidden: true,
|
|
6
|
+
cssClass: 'info-panel'
|
|
7
|
+
});
|
|
8
|
+
const infoToggleButtons = npoPlayer.uiComponents.infoPanelToggleButtons ?? [];
|
|
9
|
+
const settingsPanels = npoPlayer.uiComponents.settingsPanels ?? [];
|
|
10
|
+
infoPanel.onHide.subscribe(() => {
|
|
11
|
+
for (const button of infoToggleButtons) {
|
|
12
|
+
button.off();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
infoPanel.onShow.subscribe(() => {
|
|
16
|
+
for (const panel of settingsPanels) {
|
|
17
|
+
panel.hide();
|
|
18
|
+
}
|
|
19
|
+
for (const button of infoToggleButtons) {
|
|
20
|
+
button.on();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
const closeButton = new Button({
|
|
24
|
+
cssClass: 'info-panel-close-button'
|
|
25
|
+
});
|
|
26
|
+
closeButton.onClick.subscribe(() => {
|
|
27
|
+
infoPanel.hide();
|
|
28
|
+
});
|
|
29
|
+
infoPanel.addComponent(closeButton);
|
|
30
|
+
const contentContainer = new Container({
|
|
31
|
+
cssClass: 'info-panel-content'
|
|
32
|
+
});
|
|
33
|
+
infoPanel.addComponent(contentContainer);
|
|
34
|
+
const uiComponents = npoPlayer.uiComponents;
|
|
35
|
+
uiComponents.infoPanel = infoPanel;
|
|
36
|
+
infoPanel.setHtmlContent = (html) => {
|
|
37
|
+
contentContainer.getDomElement().html(html);
|
|
38
|
+
};
|
|
39
|
+
return infoPanel;
|
|
40
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ToggleButton } from 'bitmovin-player-ui';
|
|
2
|
+
export function createInfoPanelToggleButton(playerContext) {
|
|
3
|
+
const { npoPlayer } = playerContext;
|
|
4
|
+
const uiComponents = npoPlayer.uiComponents;
|
|
5
|
+
const toggleButton = new ToggleButton({
|
|
6
|
+
cssClass: 'info-panel-toggle-button',
|
|
7
|
+
hidden: true
|
|
8
|
+
});
|
|
9
|
+
toggleButton.onClick.subscribe(() => {
|
|
10
|
+
const infoPanel = uiComponents.infoPanel;
|
|
11
|
+
infoPanel?.toggleHidden();
|
|
12
|
+
});
|
|
13
|
+
toggleButton.getDomElement().attr('aria-haspopup', 'true');
|
|
14
|
+
uiComponents.infoPanelToggleButtons = uiComponents.infoPanelToggleButtons
|
|
15
|
+
? [...uiComponents.infoPanelToggleButtons, toggleButton]
|
|
16
|
+
: [toggleButton];
|
|
17
|
+
return toggleButton;
|
|
18
|
+
}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import { Container } from 'bitmovin-player-ui';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
export declare function createPlayNextScreen(
|
|
5
|
-
components: import("bitmovin-player-ui").Button<{
|
|
6
|
-
cssClass: string;
|
|
7
|
-
ariaLabel: string;
|
|
8
|
-
}>[];
|
|
9
|
-
cssClasses: string[];
|
|
10
|
-
}>;
|
|
2
|
+
import { ContainerConfig } from 'bitmovin-player-ui/dist/js/framework/components/container';
|
|
3
|
+
import { PlayerContext } from '../../types/interfaces';
|
|
4
|
+
export declare function createPlayNextScreen(playerContext: PlayerContext): Container<ContainerConfig>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Container } from 'bitmovin-player-ui';
|
|
2
2
|
import { createPlayNextButton, createCancelPlayNextButton } from './buttons';
|
|
3
|
-
export function createPlayNextScreen(
|
|
4
|
-
const playNextButton = createPlayNextButton(
|
|
5
|
-
const cancelButton = createCancelPlayNextButton(
|
|
3
|
+
export function createPlayNextScreen(playerContext) {
|
|
4
|
+
const playNextButton = createPlayNextButton(playerContext);
|
|
5
|
+
const cancelButton = createCancelPlayNextButton(playerContext);
|
|
6
6
|
return new Container({
|
|
7
7
|
components: [cancelButton, playNextButton],
|
|
8
8
|
cssClasses: ['overlay-playnext']
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Container, PlaybackTimeLabel, SeekBar } from 'bitmovin-player-ui';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
export declare function createSeekBar(npoPlayer: NpoPlayer, variant: NpoPlayerUIVariants): Container<{
|
|
2
|
+
import { NpoPlayerUIVariants, PlayerContext } from '../../types/interfaces';
|
|
3
|
+
export declare function createSeekBar(playerContext: PlayerContext, variant: NpoPlayerUIVariants): Container<{
|
|
5
4
|
components: (SeekBar | PlaybackTimeLabel)[];
|
|
6
5
|
cssClasses: string[];
|
|
7
6
|
}>;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { Container, PlaybackTimeLabel, PlaybackTimeLabelMode, SeekBar, SeekBarLabel } from 'bitmovin-player-ui';
|
|
2
|
-
import { NpoPlayerUIVariants } from '../../
|
|
3
|
-
export function createSeekBar(
|
|
4
|
-
const
|
|
2
|
+
import { NpoPlayerUIVariants } from '../../types/interfaces';
|
|
3
|
+
export function createSeekBar(playerContext, variant) {
|
|
4
|
+
const { npoPlayer } = playerContext;
|
|
5
|
+
const seekBar = new SeekBar({
|
|
6
|
+
label: new SeekBarLabel(),
|
|
7
|
+
addCurrentTimeToAriaLabel: true
|
|
8
|
+
});
|
|
5
9
|
npoPlayer.uiComponents.seekBar = seekBar;
|
|
6
10
|
const isAdUi = variant === NpoPlayerUIVariants.AD;
|
|
7
11
|
return new Container({
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import { SettingsPanel } from 'bitmovin-player-ui';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
export declare function createSettingsPanel(npoPlayer: NpoPlayer | PlayerAPI): SettingsPanel;
|
|
2
|
+
import { PlayerContext } from '../../types/interfaces';
|
|
3
|
+
export declare function createSettingsPanel(playerContext: PlayerContext): SettingsPanel;
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { SubtitleListBox, ListBox, SettingsPanel, SettingsPanelPage, SettingsPanelPageOpenButton, SettingsPanelPageBackButton, SettingsToggleButton, Button, Label, SettingsPanelItem, AudioQualitySelectBox, AudioTrackSelectBox } from 'bitmovin-player-ui';
|
|
2
2
|
import { localizeKey } from '../../js/utilities/utilities.locale';
|
|
3
3
|
import { handleSubtitleListBoxItemSelected, handleSpeedListBoxItemSelected, handleQualityListBoxItemSelected } from '../handlers/listboxhandlers';
|
|
4
|
-
import {
|
|
4
|
+
import { NpoPlayerEvent } from '../../types/events';
|
|
5
5
|
const createListBox = (items) => new ListBox({ items });
|
|
6
|
-
const createPanelPage = (components, cssClasses) => new SettingsPanelPage({ components, cssClasses });
|
|
7
|
-
const createSettingsPanelPageBackButton = (targetPage, container, text, cssClasses) => new SettingsPanelPageBackButton({
|
|
6
|
+
const createPanelPage = (components, cssClasses) => new SettingsPanelPage({ components, cssClasses, role: 'group' });
|
|
7
|
+
const createSettingsPanelPageBackButton = ({ targetPage, container, text, cssClasses }) => new SettingsPanelPageBackButton({
|
|
8
8
|
targetPage,
|
|
9
9
|
container,
|
|
10
10
|
text,
|
|
11
11
|
cssClasses
|
|
12
12
|
});
|
|
13
|
-
const createSettingsOpenButton = (targetPage, container, text, cssClasses) => new SettingsPanelPageOpenButton({
|
|
13
|
+
const createSettingsOpenButton = ({ targetPage, container, text, cssClasses }) => new SettingsPanelPageOpenButton({
|
|
14
14
|
targetPage,
|
|
15
15
|
container,
|
|
16
16
|
text,
|
|
17
17
|
cssClasses
|
|
18
18
|
});
|
|
19
|
-
export function createSettingsPanel(
|
|
20
|
-
const
|
|
19
|
+
export function createSettingsPanel(playerContext) {
|
|
20
|
+
const { npoPlayer, player } = playerContext;
|
|
21
21
|
const subtitleListBox = new SubtitleListBox();
|
|
22
22
|
const speedListBox = createListBox([
|
|
23
23
|
{ key: '0.25', label: '0.25x' },
|
|
@@ -39,15 +39,19 @@ export function createSettingsPanel(npoPlayer) {
|
|
|
39
39
|
const settingsBackButtonClass = 'settings-back-button';
|
|
40
40
|
const listboxPanelClass = 'listbox-panel';
|
|
41
41
|
const listboxPagerButtonClass = 'listbox-pager-button';
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
42
|
+
const settingsPanelItemConfig = { role: 'group' };
|
|
43
|
+
const subtitlePanelPage = createPanelPage([
|
|
44
|
+
new Button({ cssClass: settingTriggerClass }),
|
|
45
|
+
new SettingsPanelItem('', subtitleListBox, settingsPanelItemConfig)
|
|
46
|
+
], [listboxPanelClass]);
|
|
47
|
+
const speedPanelPage = createPanelPage([new Button({ cssClass: settingTriggerClass }), new SettingsPanelItem('', speedListBox, settingsPanelItemConfig)], [listboxPanelClass]);
|
|
48
|
+
const qualityPanelPage = createPanelPage([new Button({ cssClass: settingTriggerClass }), new SettingsPanelItem('', qualityListBox, settingsPanelItemConfig)], [listboxPanelClass]);
|
|
45
49
|
const settingsTriggerButton = new Button({ cssClass: settingTriggerClass });
|
|
46
50
|
const mainSettingsPage = createPanelPage([
|
|
47
51
|
settingsTriggerButton,
|
|
48
52
|
new Label({ text: settingsLabel, cssClass: 'setting-header' }),
|
|
49
|
-
new SettingsPanelItem(audioqualityLabel, new AudioQualitySelectBox()),
|
|
50
|
-
new SettingsPanelItem(audiotrackLabel, new AudioTrackSelectBox())
|
|
53
|
+
new SettingsPanelItem(audioqualityLabel, new AudioQualitySelectBox(), settingsPanelItemConfig),
|
|
54
|
+
new SettingsPanelItem(audiotrackLabel, new AudioTrackSelectBox(), settingsPanelItemConfig)
|
|
51
55
|
], ['main-panel']);
|
|
52
56
|
const settingsPanel = new SettingsPanel({
|
|
53
57
|
components: [mainSettingsPage, subtitlePanelPage, speedPanelPage, qualityPanelPage],
|
|
@@ -55,79 +59,101 @@ export function createSettingsPanel(npoPlayer) {
|
|
|
55
59
|
pageTransitionAnimation: false,
|
|
56
60
|
hideDelay: -1
|
|
57
61
|
});
|
|
58
|
-
const subtitleSettingsOpenButton = createSettingsOpenButton(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
listboxPagerButtonClass
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
const subtitleSettingsOpenButton = createSettingsOpenButton({
|
|
63
|
+
targetPage: subtitlePanelPage,
|
|
64
|
+
container: settingsPanel,
|
|
65
|
+
text: offLabel,
|
|
66
|
+
cssClasses: [listboxPagerButtonClass]
|
|
67
|
+
});
|
|
68
|
+
const speedSettingsOpenButton = createSettingsOpenButton({
|
|
69
|
+
targetPage: speedPanelPage,
|
|
70
|
+
container: settingsPanel,
|
|
71
|
+
text: '1x',
|
|
72
|
+
cssClasses: [listboxPagerButtonClass]
|
|
73
|
+
});
|
|
74
|
+
const qualitySettingsOpenButton = createSettingsOpenButton({
|
|
75
|
+
targetPage: qualityPanelPage,
|
|
76
|
+
container: settingsPanel,
|
|
77
|
+
text: autoLabel,
|
|
78
|
+
cssClasses: [listboxPagerButtonClass]
|
|
79
|
+
});
|
|
80
|
+
const subtitlesPanelItem = new SettingsPanelItem(subtitlesLabel, subtitleSettingsOpenButton, {
|
|
81
|
+
...settingsPanelItemConfig,
|
|
82
|
+
hidden: false
|
|
83
|
+
});
|
|
84
|
+
const speedPanelItem = new SettingsPanelItem(speedLabel, speedSettingsOpenButton, {
|
|
85
|
+
...settingsPanelItemConfig,
|
|
86
|
+
hidden: false
|
|
87
|
+
});
|
|
88
|
+
const qualityPanelItem = new SettingsPanelItem(videoqualityLabel, qualitySettingsOpenButton, {
|
|
89
|
+
...settingsPanelItemConfig,
|
|
90
|
+
hidden: false
|
|
91
|
+
});
|
|
92
|
+
const settingsToggleButton = new SettingsToggleButton({ settingsPanel, role: 'button' });
|
|
93
|
+
settingsToggleButton.getDomElement().attr('aria-haspopup', 'true');
|
|
94
|
+
for (const item of [subtitlesPanelItem, speedPanelItem, qualityPanelItem, settingsToggleButton])
|
|
76
95
|
mainSettingsPage.addComponent(item);
|
|
77
96
|
for (const [index, panelPage] of [subtitlePanelPage, speedPanelPage, qualityPanelPage].entries()) {
|
|
78
97
|
const labels = [subtitlesLabel, speedLabel, videoqualityLabel];
|
|
79
|
-
panelPage.addComponent(createSettingsPanelPageBackButton(
|
|
80
|
-
|
|
81
|
-
|
|
98
|
+
panelPage.addComponent(createSettingsPanelPageBackButton({
|
|
99
|
+
targetPage: mainSettingsPage,
|
|
100
|
+
container: settingsPanel,
|
|
101
|
+
text: labels[index],
|
|
102
|
+
cssClasses: [settingsBackButtonClass]
|
|
103
|
+
}));
|
|
82
104
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
subtitleListBox.onItemSelected.subscribe(handleSubtitleListBoxItemSelected(subtitleSettingsOpenButton, settingsPanel, mainSettingsPage));
|
|
105
|
+
npoPlayer.uiComponents.subtitlesButton = subtitlesPanelItem;
|
|
106
|
+
npoPlayer.uiComponents.qualityButton = qualityPanelItem;
|
|
107
|
+
subtitleListBox.onItemSelected.subscribe(handleSubtitleListBoxItemSelected({ subtitleSettingsOpenButton, settingsPanel, mainSettingsPage }));
|
|
88
108
|
if (player) {
|
|
89
109
|
speedListBox.selectItem('1');
|
|
90
|
-
speedListBox.onItemSelected.subscribe(handleSpeedListBoxItemSelected(
|
|
110
|
+
speedListBox.onItemSelected.subscribe(handleSpeedListBoxItemSelected({ playerContext, speedSettingsOpenButton, settingsPanel, mainSettingsPage }));
|
|
91
111
|
qualityListBox.selectItem('auto');
|
|
92
|
-
qualityListBox.onItemSelected.subscribe(handleQualityListBoxItemSelected(
|
|
93
|
-
}
|
|
94
|
-
if (npoPlayer.uiComponents) {
|
|
95
|
-
const uiComponents = npoPlayer.uiComponents;
|
|
96
|
-
uiComponents.settingsPanels = uiComponents.settingsPanels
|
|
97
|
-
? [...uiComponents.settingsPanels, settingsPanel]
|
|
98
|
-
: [settingsPanel];
|
|
112
|
+
qualityListBox.onItemSelected.subscribe(handleQualityListBoxItemSelected({ playerContext, qualitySettingsOpenButton, settingsPanel, mainSettingsPage }));
|
|
99
113
|
}
|
|
114
|
+
const uiComponents = npoPlayer.uiComponents;
|
|
115
|
+
uiComponents.settingsPanels = uiComponents.settingsPanels
|
|
116
|
+
? [...uiComponents.settingsPanels, settingsPanel]
|
|
117
|
+
: [settingsPanel];
|
|
100
118
|
const checkSubtitles = () => {
|
|
101
|
-
const subtitles = player
|
|
119
|
+
const subtitles = player.listSubtitles();
|
|
102
120
|
subtitlesPanelItem.hide();
|
|
103
121
|
if (subtitles?.length) {
|
|
104
122
|
subtitlesPanelItem.show();
|
|
105
123
|
}
|
|
106
124
|
};
|
|
107
125
|
const checkQualities = () => {
|
|
108
|
-
const availableVideoQualities = player
|
|
126
|
+
const availableVideoQualities = player.getAvailableVideoQualities() || [];
|
|
109
127
|
qualityListBox.clearItems();
|
|
110
128
|
qualityPanelItem.hide();
|
|
111
129
|
if (availableVideoQualities?.length) {
|
|
112
|
-
for (const quality of availableVideoQualities)
|
|
113
|
-
|
|
130
|
+
for (const quality of availableVideoQualities) {
|
|
131
|
+
const label = quality.label === 'unknown' ? `${quality.height}p` : quality.label;
|
|
132
|
+
qualityListBox.addItem(quality.id, label ?? 'unknown');
|
|
133
|
+
}
|
|
114
134
|
qualityListBox.addItem('auto', autoLabel);
|
|
115
135
|
qualityListBox.selectItem('auto');
|
|
116
136
|
qualityPanelItem.show();
|
|
117
137
|
}
|
|
118
138
|
};
|
|
119
139
|
settingsPanel.onHide.subscribe(() => {
|
|
120
|
-
player
|
|
140
|
+
player.removeClassFromNpoPlayerElement('bmpui-settings-panel-shown');
|
|
121
141
|
});
|
|
122
142
|
settingsPanel.onShow.subscribe(() => {
|
|
123
|
-
player
|
|
143
|
+
player.addClassToNpoPlayerElement('bmpui-settings-panel-shown');
|
|
144
|
+
const infoPanel = npoPlayer.uiComponents.infoPanel;
|
|
145
|
+
const infoToggleButtons = npoPlayer.uiComponents.infoPanelToggleButtons ?? [];
|
|
146
|
+
infoPanel?.hide();
|
|
147
|
+
for (const button of infoToggleButtons) {
|
|
148
|
+
button.off();
|
|
149
|
+
}
|
|
124
150
|
});
|
|
125
151
|
const checkQualitiesAndSubtitles = () => {
|
|
126
152
|
checkQualities();
|
|
127
153
|
checkSubtitles();
|
|
128
154
|
};
|
|
129
|
-
player?.off(
|
|
130
|
-
player?.on(
|
|
155
|
+
player?.off(NpoPlayerEvent.SourceLoaded, checkQualitiesAndSubtitles);
|
|
156
|
+
player?.on(NpoPlayerEvent.SourceLoaded, checkQualitiesAndSubtitles);
|
|
131
157
|
checkQualitiesAndSubtitles();
|
|
132
158
|
return settingsPanel;
|
|
133
159
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { TitleBar } from 'bitmovin-player-ui';
|
|
2
|
-
import
|
|
3
|
-
export declare function createTitleBar(
|
|
2
|
+
import { PlayerContext } from '../../types/interfaces';
|
|
3
|
+
export declare function createTitleBar(playerContext: PlayerContext): TitleBar;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Label, TitleBar } from 'bitmovin-player-ui';
|
|
2
|
-
export function createTitleBar(
|
|
2
|
+
export function createTitleBar(playerContext) {
|
|
3
|
+
const { npoPlayer } = playerContext;
|
|
3
4
|
const nicam = new Label({ text: '', cssClass: 'nicam' });
|
|
4
5
|
const titleBar = new TitleBar({ cssClasses: ['metadata'] });
|
|
5
6
|
titleBar.addComponent(nicam);
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Container, TitleBar, PictureInPictureToggleButton, AirPlayToggleButton, SettingsToggleButton, FullscreenToggleButton, VolumeControlButton } from 'bitmovin-player-ui';
|
|
2
2
|
import { createSettingsPanel } from './settingspanel';
|
|
3
3
|
import { createChromecastButton } from './buttons';
|
|
4
|
+
import { createInfoPanelToggleButton } from './infopanel/togglebutton';
|
|
4
5
|
export function createTopBar(playerContext) {
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const settingsPanel = createSettingsPanel(playerContext);
|
|
7
|
+
const chromeCastButton = createChromecastButton(playerContext);
|
|
8
|
+
const settingsToggleButton = new SettingsToggleButton({ settingsPanel, role: 'button' });
|
|
9
|
+
settingsToggleButton.getDomElement().attr('aria-haspopup', 'true');
|
|
8
10
|
return new TitleBar({
|
|
9
11
|
components: [
|
|
10
12
|
new Container({
|
|
@@ -12,12 +14,13 @@ export function createTopBar(playerContext) {
|
|
|
12
14
|
new PictureInPictureToggleButton(),
|
|
13
15
|
new AirPlayToggleButton(),
|
|
14
16
|
chromeCastButton,
|
|
15
|
-
|
|
17
|
+
settingsToggleButton,
|
|
16
18
|
settingsPanel,
|
|
17
19
|
new VolumeControlButton({
|
|
18
20
|
vertical: true
|
|
19
21
|
}),
|
|
20
|
-
new FullscreenToggleButton()
|
|
22
|
+
new FullscreenToggleButton(),
|
|
23
|
+
createInfoPanelToggleButton(playerContext)
|
|
21
24
|
],
|
|
22
25
|
cssClasses: ['controlbar-top', 'controlbar-small']
|
|
23
26
|
})
|
|
@@ -6,7 +6,10 @@ export function createVerticalVideoControlBar(playerContext, settingsPanel) {
|
|
|
6
6
|
const { npoPlayer } = playerContext;
|
|
7
7
|
const rewindButton = createRewindButton(playerContext);
|
|
8
8
|
const forwardButton = createForwardButton(playerContext);
|
|
9
|
-
const seekBar = new SeekBar({
|
|
9
|
+
const seekBar = new SeekBar({
|
|
10
|
+
label: new SeekBarLabel(),
|
|
11
|
+
addCurrentTimeToAriaLabel: true
|
|
12
|
+
});
|
|
10
13
|
npoPlayer.uiComponents.seekBar = seekBar;
|
|
11
14
|
const settingsToggleButton = new SettingsToggleButton({
|
|
12
15
|
settingsPanel: settingsPanel,
|
|
@@ -26,7 +29,7 @@ export function createVerticalVideoControlBar(playerContext, settingsPanel) {
|
|
|
26
29
|
const controlBar = new ControlBar({
|
|
27
30
|
components: [
|
|
28
31
|
settingsToggleButton,
|
|
29
|
-
createSeekBar(
|
|
32
|
+
createSeekBar(playerContext, NpoPlayerUIVariants.VERTICAL),
|
|
30
33
|
controlBarButtonsContainer
|
|
31
34
|
],
|
|
32
35
|
cssClasses: ['ui-controlbar-bottom']
|
|
@@ -5,7 +5,8 @@ export function createVerticalVideoSettingsPanel() {
|
|
|
5
5
|
});
|
|
6
6
|
const mainSettingsPage = new SettingsPanelPage({
|
|
7
7
|
components: [subtitleListBox],
|
|
8
|
-
cssClasses: ['main-panel']
|
|
8
|
+
cssClasses: ['main-panel'],
|
|
9
|
+
role: 'group'
|
|
9
10
|
});
|
|
10
11
|
const settingsPanel = new SettingsPanel({
|
|
11
12
|
components: [mainSettingsPage],
|
|
@@ -13,9 +14,12 @@ export function createVerticalVideoSettingsPanel() {
|
|
|
13
14
|
pageTransitionAnimation: false,
|
|
14
15
|
hideDelay: -1
|
|
15
16
|
});
|
|
16
|
-
|
|
17
|
-
settingsPanel
|
|
18
|
-
autoHideWhenNoActiveSettings: false
|
|
19
|
-
|
|
17
|
+
const settingsToggleButton = new SettingsToggleButton({
|
|
18
|
+
settingsPanel,
|
|
19
|
+
autoHideWhenNoActiveSettings: false,
|
|
20
|
+
role: 'button'
|
|
21
|
+
});
|
|
22
|
+
settingsToggleButton.getDomElement().attr('aria-haspopup', 'true');
|
|
23
|
+
mainSettingsPage.addComponent(settingsToggleButton);
|
|
20
24
|
return settingsPanel;
|
|
21
25
|
}
|
|
@@ -1,33 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const ariaLabel = 'aria-label';
|
|
2
|
+
function setVideoAriaLabels(container, title) {
|
|
3
3
|
const videoEl = container.querySelector('video');
|
|
4
4
|
const hugePlayBackToggleButton = container.querySelector('.bmpui-ui-hugeplaybacktogglebutton');
|
|
5
|
-
videoEl?.setAttribute(
|
|
6
|
-
hugePlayBackToggleButton?.setAttribute(
|
|
5
|
+
videoEl?.setAttribute(ariaLabel, title);
|
|
6
|
+
hugePlayBackToggleButton?.setAttribute(ariaLabel, title);
|
|
7
7
|
const description = container.querySelector('.bmpui-label-metadata-description');
|
|
8
8
|
if (description) {
|
|
9
9
|
videoEl?.setAttribute('aria-describedby', description.id);
|
|
10
10
|
hugePlayBackToggleButton?.setAttribute('aria-describedby', description.id);
|
|
11
11
|
}
|
|
12
|
+
}
|
|
13
|
+
function setImageAriaLabels(container, title) {
|
|
12
14
|
const imgRoles = container.querySelectorAll('[role="img"]');
|
|
13
15
|
for (const imgRole of imgRoles) {
|
|
14
|
-
imgRole.setAttribute(
|
|
15
|
-
}
|
|
16
|
-
const popupButtons = container.querySelectorAll('[role="pop-up button"]');
|
|
17
|
-
for (const popupButton of popupButtons) {
|
|
18
|
-
popupButton.setAttribute('role', 'button');
|
|
19
|
-
popupButton.setAttribute('aria-haspopup', 'menu');
|
|
20
|
-
}
|
|
21
|
-
const menuItems = container.querySelectorAll('[role="menuitem"][aria-pressed]');
|
|
22
|
-
for (const menuitem of menuItems) {
|
|
23
|
-
menuitem.removeAttribute('aria-pressed');
|
|
24
|
-
}
|
|
25
|
-
const panelItems = container.querySelectorAll('.bmpui-ui-settings-panel-item[role="menuitem"]');
|
|
26
|
-
for (const panelItem of panelItems) {
|
|
27
|
-
panelItem.setAttribute('role', 'group');
|
|
28
|
-
}
|
|
29
|
-
const panelPages = container.querySelectorAll('.bmpui-ui-settings-panel-page.bmpui-listbox-panel[role="menu"]');
|
|
30
|
-
for (const panelPage of panelPages) {
|
|
31
|
-
panelPage.setAttribute('role', 'group');
|
|
16
|
+
imgRole.setAttribute(ariaLabel, title);
|
|
32
17
|
}
|
|
33
18
|
}
|
|
19
|
+
export function addAccessibilityAttributes(container, metadata) {
|
|
20
|
+
setVideoAriaLabels(container, metadata.title);
|
|
21
|
+
setImageAriaLabels(container, metadata.title);
|
|
22
|
+
}
|
|
@@ -3,7 +3,6 @@ import { JSDOM } from 'jsdom';
|
|
|
3
3
|
describe('addAccessibilityAttributes', () => {
|
|
4
4
|
let container;
|
|
5
5
|
const mockMetadata = { title: 'Mocked Video Title', description: 'Mocked Description' };
|
|
6
|
-
const label = 'aria-label';
|
|
7
6
|
beforeEach(() => {
|
|
8
7
|
const { window } = new JSDOM(`
|
|
9
8
|
<div>
|
|
@@ -11,53 +10,45 @@ describe('addAccessibilityAttributes', () => {
|
|
|
11
10
|
<div class="bmpui-ui-hugeplaybacktogglebutton"></div>
|
|
12
11
|
<div class="bmpui-label-metadata-description" id="desc">Description</div>
|
|
13
12
|
<div role="img"></div>
|
|
14
|
-
<div role="pop-up button"></div>
|
|
15
|
-
<div role="menuitem" aria-pressed="true"></div>
|
|
16
|
-
<div class="bmpui-ui-settings-panel-item" role="menuitem"></div>
|
|
17
|
-
<div class="bmpui-ui-settings-panel-page bmpui-listbox-panel" role="menu"></div>
|
|
18
13
|
</div>
|
|
19
14
|
`);
|
|
20
15
|
container = window.document.body.firstChild;
|
|
21
16
|
});
|
|
22
|
-
function
|
|
17
|
+
function expectAttributes({ selector, attributes }) {
|
|
23
18
|
const element = container?.querySelector(selector);
|
|
24
|
-
|
|
19
|
+
for (const [attribute, expectedValue] of Object.entries(attributes)) {
|
|
20
|
+
expect(element?.getAttribute(attribute)).toBe(expectedValue);
|
|
21
|
+
}
|
|
25
22
|
}
|
|
26
23
|
it('adds correct aria-labels', () => {
|
|
27
24
|
if (!container)
|
|
28
25
|
return;
|
|
29
26
|
addAccessibilityAttributes(container, mockMetadata);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
expectAttributes({
|
|
28
|
+
selector: 'video',
|
|
29
|
+
attributes: { 'aria-label': mockMetadata.title }
|
|
30
|
+
});
|
|
31
|
+
expectAttributes({
|
|
32
|
+
selector: '.bmpui-ui-hugeplaybacktogglebutton',
|
|
33
|
+
attributes: { 'aria-label': mockMetadata.title }
|
|
34
|
+
});
|
|
35
|
+
expectAttributes({
|
|
36
|
+
selector: '[role="img"]',
|
|
37
|
+
attributes: { 'aria-label': mockMetadata.title }
|
|
38
|
+
});
|
|
33
39
|
});
|
|
34
40
|
it('handles aria-describedby correctly', () => {
|
|
35
41
|
if (!container)
|
|
36
42
|
return;
|
|
37
43
|
addAccessibilityAttributes(container, mockMetadata);
|
|
38
|
-
const descriptionId = container.querySelector('.bmpui-label-metadata-description')?.id;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
expect(popupButton).toBeTruthy();
|
|
48
|
-
expect(popupButton?.getAttribute('aria-haspopup')).toBe('menu');
|
|
49
|
-
});
|
|
50
|
-
it('removes aria-pressed from menuitems', () => {
|
|
51
|
-
if (!container)
|
|
52
|
-
return;
|
|
53
|
-
addAccessibilityAttributes(container, mockMetadata);
|
|
54
|
-
expect(container.querySelector('[role="menuitem"][aria-pressed]')).toBeFalsy();
|
|
55
|
-
});
|
|
56
|
-
it('changes the role of menuitems and menus correctly', () => {
|
|
57
|
-
if (!container)
|
|
58
|
-
return;
|
|
59
|
-
addAccessibilityAttributes(container, mockMetadata);
|
|
60
|
-
expectAttribute('.bmpui-ui-settings-panel-item', 'role', 'group');
|
|
61
|
-
expectAttribute('.bmpui-ui-settings-panel-page', 'role', 'group');
|
|
44
|
+
const descriptionId = container.querySelector('.bmpui-label-metadata-description')?.id || '';
|
|
45
|
+
expectAttributes({
|
|
46
|
+
selector: 'video',
|
|
47
|
+
attributes: { 'aria-describedby': descriptionId ?? '' }
|
|
48
|
+
});
|
|
49
|
+
expectAttributes({
|
|
50
|
+
selector: '.bmpui-ui-hugeplaybacktogglebutton',
|
|
51
|
+
attributes: { 'aria-describedby': descriptionId ?? '' }
|
|
52
|
+
});
|
|
62
53
|
});
|
|
63
54
|
});
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { StreamObject } from 'types/interfaces';
|
|
2
|
-
import { PlayerAPI } from 'bitmovin-player';
|
|
1
|
+
import { StreamObject } from '../../types/interfaces';
|
|
2
|
+
import { PlayerAPI } from 'bitmovin-player/modules/bitmovinplayer-core';
|
|
3
3
|
export declare function handleLiveStreamNoDvr(player: PlayerAPI, streamObject: StreamObject): void;
|
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
import { type PlayerAPI } from 'bitmovin-player';
|
|
2
1
|
import { type SettingsPanel, type SettingsPanelPage, type SettingsPanelPageOpenButton } from 'bitmovin-player-ui';
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
2
|
+
import { PlayerContext } from 'types/interfaces';
|
|
3
|
+
export declare function handleSubtitleListBoxItemSelected({ subtitleSettingsOpenButton, settingsPanel, mainSettingsPage }: {
|
|
4
|
+
subtitleSettingsOpenButton: SettingsPanelPageOpenButton;
|
|
5
|
+
settingsPanel: SettingsPanel;
|
|
6
|
+
mainSettingsPage: SettingsPanelPage;
|
|
7
|
+
}): (e: any) => void;
|
|
8
|
+
export declare function handleSpeedListBoxItemSelected({ playerContext, speedSettingsOpenButton, settingsPanel, mainSettingsPage }: {
|
|
9
|
+
playerContext: PlayerContext;
|
|
10
|
+
speedSettingsOpenButton: SettingsPanelPageOpenButton;
|
|
11
|
+
settingsPanel: SettingsPanel;
|
|
12
|
+
mainSettingsPage: SettingsPanelPage;
|
|
13
|
+
}): (source: any, args: any) => void;
|
|
14
|
+
export declare function handleQualityListBoxItemSelected({ playerContext, qualitySettingsOpenButton, settingsPanel, mainSettingsPage }: {
|
|
15
|
+
playerContext: PlayerContext;
|
|
16
|
+
qualitySettingsOpenButton: SettingsPanelPageOpenButton;
|
|
17
|
+
settingsPanel: SettingsPanel;
|
|
18
|
+
mainSettingsPage: SettingsPanelPage;
|
|
19
|
+
}): (source: any, args: any) => void;
|