@gcorevideo/player 2.22.4 → 2.22.7

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.
Files changed (60) hide show
  1. package/assets/level-selector/button.ejs +1 -1
  2. package/assets/level-selector/list.ejs +10 -4
  3. package/assets/level-selector/style.scss +8 -3
  4. package/assets/media-control/media-control.ejs +1 -2
  5. package/dist/core.js +2 -2
  6. package/dist/index.css +916 -912
  7. package/dist/index.js +452 -413
  8. package/dist/plugins/index.css +668 -664
  9. package/dist/plugins/index.js +514 -474
  10. package/lib/index.plugins.d.ts +2 -1
  11. package/lib/index.plugins.d.ts.map +1 -1
  12. package/lib/index.plugins.js +2 -1
  13. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  14. package/lib/playback/dash-playback/DashPlayback.js +1 -1
  15. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  16. package/lib/plugins/bottom-gear/BottomGear.js +2 -2
  17. package/lib/plugins/level-selector/LevelSelector.d.ts +6 -5
  18. package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
  19. package/lib/plugins/level-selector/LevelSelector.js +11 -8
  20. package/lib/plugins/level-selector/QualityLevels.d.ts +112 -0
  21. package/lib/plugins/level-selector/QualityLevels.d.ts.map +1 -0
  22. package/lib/plugins/level-selector/QualityLevels.js +280 -0
  23. package/lib/plugins/media-control/MediaControl.d.ts +37 -6
  24. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  25. package/lib/plugins/media-control/MediaControl.js +54 -36
  26. package/lib/plugins/playback-rate/PlaybackRate.d.ts +5 -4
  27. package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
  28. package/lib/plugins/playback-rate/PlaybackRate.js +46 -24
  29. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  30. package/lib/plugins/utils/fullscreen.d.ts +4 -0
  31. package/lib/plugins/utils/fullscreen.d.ts.map +1 -0
  32. package/lib/plugins/utils/fullscreen.js +30 -0
  33. package/lib/plugins/utils.d.ts +0 -1
  34. package/lib/plugins/utils.d.ts.map +1 -1
  35. package/lib/plugins/utils.js +0 -28
  36. package/lib/plugins/vast-ads/VastAds.d.ts +1 -0
  37. package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -1
  38. package/lib/plugins/vast-ads/VastAds.js +6 -3
  39. package/lib/utils/fullscreen.d.ts +3 -0
  40. package/lib/utils/fullscreen.d.ts.map +1 -0
  41. package/lib/utils/fullscreen.js +2 -0
  42. package/package.json +1 -1
  43. package/src/index.plugins.ts +2 -1
  44. package/src/playback/dash-playback/DashPlayback.ts +1 -4
  45. package/src/plugins/bottom-gear/BottomGear.ts +2 -2
  46. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +15 -3
  47. package/src/plugins/level-selector/{LevelSelector.ts → QualityLevels.ts} +19 -13
  48. package/src/plugins/level-selector/__tests__/{LevelSelector.test.ts → QualityLevels.test.ts} +20 -6
  49. package/src/plugins/level-selector/__tests__/__snapshots__/{LevelSelector.test.ts.snap → QualityLevels.test.ts.snap} +58 -25
  50. package/src/plugins/media-control/MediaControl.ts +111 -62
  51. package/src/plugins/media-control/__tests__/MediaControl.test.ts +118 -8
  52. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +149 -5
  53. package/src/plugins/playback-rate/PlaybackRate.ts +48 -26
  54. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +125 -55
  55. package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +1 -1
  56. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  57. package/src/plugins/utils/fullscreen.ts +34 -0
  58. package/src/plugins/utils.ts +0 -31
  59. package/src/plugins/vast-ads/VastAds.ts +8 -4
  60. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"VastAds.d.ts","sourceRoot":"","sources":["../../../src/plugins/vast-ads/VastAds.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,EAIJ,QAAQ,EAER,YAAY,EAEb,MAAM,cAAc,CAAA;AAarB,OAAO,qCAAqC,CAAA;AAQ5C,qBAAa,OAAQ,SAAQ,YAAY;IACvC,OAAO,CAAC,mBAAmB,CAAiC;IAE5D,OAAO,CAAC,qBAAqB,CAAwC;IAErE,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,eAAe,CAAI;IAE3B,OAAO,CAAC,mBAAmB,CAAI;IAE/B,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,SAAS,CAAyB;IAE1C,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,IAAI,CAA2B;IAEvC,OAAO,CAAC,OAAO,CAAK;IAEpB,OAAO,CAAC,uBAAuB,CAAI;IAEnC,OAAO,CAAC,0BAA0B,CAAI;IAEtC,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,UAAU,CAA2B;IAE7C,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,YAAY,CAA2B;IAE/C,IAAI,IAAI,WAEP;IAED,IAAI,gBAAgB;;MAEnB;IAED,MAAM,KAAK,OAAO,WAEjB;IAED,IAAI,YAAY,QAEf;IAED,IAAa,UAAU;;;MAKtB;gBAEW,IAAI,EAAE,IAAI;IAqEb,UAAU;IA8FnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,oBAAoB;IAkE5B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,qBAAqB;IAwD7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,mBAAmB;IAiD3B,YAAY;IASZ,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IA6BpB,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAG3B;IAED,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAE9B;IAED,OAAO,CAAC,kBAAkB;IAU1B,gBAAgB,CAAC,CAAC,EAAE,MAAM;IAQ1B,cAAc;IAsBd,eAAe;IAkBf,WAAW;IAiBX,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,iBAAiB;IAiHhB,MAAM;IAqBf,OAAO,CAAC,QAAQ;CAGjB"}
1
+ {"version":3,"file":"VastAds.d.ts","sourceRoot":"","sources":["../../../src/plugins/vast-ads/VastAds.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,EAIJ,QAAQ,EAER,YAAY,EAEb,MAAM,cAAc,CAAA;AAarB,OAAO,qCAAqC,CAAA;AAQ5C,qBAAa,OAAQ,SAAQ,YAAY;IACvC,OAAO,CAAC,mBAAmB,CAAiC;IAE5D,OAAO,CAAC,qBAAqB,CAAwC;IAErE,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,eAAe,CAAI;IAE3B,OAAO,CAAC,mBAAmB,CAAI;IAE/B,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,SAAS,CAAyB;IAE1C,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,aAAa,CAAiC;IAEtD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,IAAI,CAA2B;IAEvC,OAAO,CAAC,OAAO,CAAK;IAEpB,OAAO,CAAC,uBAAuB,CAAI;IAEnC,OAAO,CAAC,0BAA0B,CAAI;IAEtC,OAAO,CAAC,YAAY,CAAoB;IAExC,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,UAAU,CAA2B;IAE7C,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,YAAY,CAA2B;IAE/C,IAAI,IAAI,WAEP;IAED,IAAI,gBAAgB;;MAEnB;IAED,MAAM,KAAK,OAAO,WAEjB;IAED,IAAI,YAAY,QAEf;IAED,IAAa,UAAU;;;MAKtB;gBAEW,IAAI,EAAE,IAAI;IAqEb,UAAU;IA8FnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,oBAAoB;IAkE5B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,qBAAqB;IAwD7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,CAAC,mBAAmB;IAiD3B,YAAY;IASZ,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IA6BpB,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAG3B;IAED,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAE9B;IAED,OAAO,CAAC,kBAAkB;IAU1B,gBAAgB,CAAC,CAAC,EAAE,MAAM;IAQ1B,cAAc;IAsBd,eAAe;IAkBf,WAAW;IAiBX,OAAO,CAAC,UAAU;IA+ClB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,iBAAiB;IAiHhB,MAAM;IAqBf,OAAO,CAAC,QAAQ;CAGjB"}
@@ -345,8 +345,11 @@ export class VastAds extends UICorePlugin {
345
345
  // @ts-ignore
346
346
  this.stopListening(this.playback, Events.PLAYBACK_PAUSE);
347
347
  }
348
+ get pluginOptions() {
349
+ return this.options.vastAds;
350
+ }
348
351
  _pauserollListeners() {
349
- if (!this._validateData(this._options.VastAds.pauseroll)) {
352
+ if (!this._validateData(this.pluginOptions.pauseroll)) {
350
353
  return;
351
354
  }
352
355
  this._stopPauserollListeners();
@@ -571,11 +574,11 @@ export class VastAds extends UICorePlugin {
571
574
  // const currentRoll = type;
572
575
  this.destroyRoll();
573
576
  if (currentRoll === 'preroll') {
574
- this.options.vastAds[currentRoll] = [];
577
+ this.pluginOptions[currentRoll] = [];
575
578
  }
576
579
  this.currentState = '';
577
580
  this.$el.hide();
578
- if (!this.options.disableClickOnPause) {
581
+ if (!this.options.disableClickOnPause) { // TODO sort out
579
582
  this._clickToPausePlugin?.enable();
580
583
  }
581
584
  try {
@@ -0,0 +1,3 @@
1
+ import { Utils } from '@clappr/core';
2
+ export declare const fullscreenEnabled: typeof Utils.Fullscreen.fullscreenEnabled;
3
+ //# sourceMappingURL=fullscreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullscreen.d.ts","sourceRoot":"","sources":["../../src/utils/fullscreen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,eAAO,MAAM,iBAAiB,2CAAqC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Utils } from '@clappr/core';
2
+ export const fullscreenEnabled = Utils.Fullscreen.fullscreenEnabled;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.22.4",
3
+ "version": "2.22.7",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -14,13 +14,14 @@ export * from "./plugins/error-screen/ErrorScreen.js";
14
14
  export * from "./plugins/favicon/Favicon.js";
15
15
  // _ ga-events
16
16
  export * from "./plugins/google-analytics/GoogleAnalytics.js";
17
- export * from "./plugins/level-selector/LevelSelector.js";
18
17
  export * from "./plugins/logo/Logo.js";
19
18
  export * from "./plugins/media-control/MediaControl.js";
20
19
  export * from "./plugins/multi-camera/MultiCamera.js";
21
20
  export * from "./plugins/picture-in-picture/PictureInPicture.js";
22
21
  export * from "./plugins/playback-rate/PlaybackRate.js";
23
22
  export * from "./plugins/poster/Poster.js";
23
+ export * from "./plugins/level-selector/QualityLevels.js";
24
+ export { QualityLevels as LevelSelector } from "./plugins/level-selector/QualityLevels.js";
24
25
  export * from "./plugins/seek-time/SeekTime.js";
25
26
  export * from "./plugins/share/Share.js";
26
27
  export * from "./plugins/skip-time/SkipTime.js";
@@ -604,11 +604,8 @@ export default class DashPlayback extends BasePlayback {
604
604
  }
605
605
 
606
606
  _updatePlaybackType() {
607
- assert.ok(
608
- this._dash,
609
- 'An instance of dashjs MediaPlayer is required to update the playback type',
610
- )
611
607
  const prevPlaybackType = this._playbackType
608
+ // @ts-ignore
612
609
  this._playbackType = this._dash.isDynamic() ? Playback.LIVE : Playback.VOD
613
610
  if (prevPlaybackType !== this._playbackType) {
614
611
  this._updateSettings()
@@ -235,7 +235,6 @@ export class BottomGear extends UICorePlugin {
235
235
  .hide()
236
236
 
237
237
  // TODO make non-clickable when there are no items
238
- mediaControl.putElement('gear', this.$el)
239
238
 
240
239
  setTimeout(() => {
241
240
  this.trigger(GearEvents.RENDERED)
@@ -276,6 +275,7 @@ export class BottomGear extends UICorePlugin {
276
275
 
277
276
  private onMediaControlRendered() {
278
277
  trace(`${T} onMediaControlRendered`)
279
- this.render()
278
+ const mediaControl = this.core.getPlugin('media_control')
279
+ mediaControl.putElement('gear', this.$el)
280
280
  }
281
281
  }
@@ -2,6 +2,7 @@ import { MockedFunction, beforeEach, describe, expect, it, vi } from 'vitest'
2
2
 
3
3
  import { BottomGear, GearEvents } from '../BottomGear'
4
4
  import { createMockCore, createMockMediaControl } from '../../../testUtils'
5
+ import { Events } from '@clappr/core'
5
6
 
6
7
  describe('BottomGear', () => {
7
8
  let mediaControl: any
@@ -20,13 +21,11 @@ describe('BottomGear', () => {
20
21
  onGearRendered = vi.fn()
21
22
  bottomGear.on(GearEvents.RENDERED, onGearRendered, null)
22
23
  bottomGear.render()
24
+ core.emit(Events.CORE_READY)
23
25
  })
24
26
  it('should render', () => {
25
27
  expect(bottomGear.el.innerHTML).toMatchSnapshot()
26
28
  })
27
- it('should attach to media control', () => {
28
- expect(mediaControl.putElement).toHaveBeenCalledWith('gear', bottomGear.$el)
29
- })
30
29
  it('should emit event in the next cycle', async () => {
31
30
  expect(onGearRendered).not.toHaveBeenCalled()
32
31
  await new Promise((resolve) => setTimeout(resolve, 0))
@@ -37,6 +36,19 @@ describe('BottomGear', () => {
37
36
  'none',
38
37
  )
39
38
  })
39
+ describe('until media control is rendered', () => {
40
+ it('should not attach to media control', () => {
41
+ expect(mediaControl.putElement).not.toHaveBeenCalledWith('gear', expect.anything())
42
+ })
43
+ })
44
+ describe('when media control is rendered', () => {
45
+ beforeEach(() => {
46
+ mediaControl.trigger(Events.MEDIACONTROL_RENDERED)
47
+ })
48
+ it('should attach to media control', () => {
49
+ expect(mediaControl.putElement).toHaveBeenCalledWith('gear', bottomGear.$el)
50
+ })
51
+ })
40
52
  describe('when clicked', () => {
41
53
  beforeEach(() => {
42
54
  bottomGear.$el.find('#gear-button').click()
@@ -1,5 +1,5 @@
1
1
  import { Events, template, UICorePlugin } from '@clappr/core'
2
- import { reportError, trace } from '@gcorevideo/utils'
2
+ import { trace } from '@gcorevideo/utils'
3
3
  import assert from 'assert'
4
4
 
5
5
  import { type QualityLevel } from '../../playback.types.js'
@@ -17,14 +17,14 @@ import checkIcon from '../../../assets/icons/new/check.svg'
17
17
  import '../../../assets/level-selector/style.scss'
18
18
  import { MediaControl } from '../media-control/MediaControl.js'
19
19
 
20
- const T = 'plugins.level_selector'
21
- const VERSION = '2.19.4'
20
+ const T = 'plugins.quality_levels'
21
+ const VERSION = 'v2.22.5'
22
22
 
23
23
  /**
24
- * Configuration options for the {@link LevelSelector | level selector} plugin.
24
+ * Configuration options for the {@link QualityLevels} plugin.
25
25
  * @beta
26
26
  */
27
- export interface LevelSelectorPluginSettings {
27
+ export interface QualityLevelsPluginSettings {
28
28
  /**
29
29
  * The maximum resolution to allow in the level selector.
30
30
  */
@@ -52,19 +52,19 @@ export interface LevelSelectorPluginSettings {
52
52
  *
53
53
  * The plugin is rendered as an item in the gear menu, which, when clicked, shows a list of quality levels to choose from.
54
54
  *
55
- * Configuration options - {@link LevelSelectorPluginSettings}
55
+ * Configuration options - {@link QualityLevelsPluginSettings}
56
56
  *
57
57
  * @example
58
58
  * ```ts
59
59
  * new Player({
60
- * levelSelector: {
60
+ * qualityLevels: {
61
61
  * restrictResolution: 360,
62
62
  * labels: { 360: 'SD', 720: 'HD' },
63
63
  * },
64
64
  * })
65
65
  * ```
66
66
  */
67
- export class LevelSelector extends UICorePlugin {
67
+ export class QualityLevels extends UICorePlugin {
68
68
  private levels: QualityLevel[] = []
69
69
 
70
70
  private levelLabels: string[] = []
@@ -230,7 +230,7 @@ export class LevelSelector extends UICorePlugin {
230
230
 
231
231
  private renderDropdown() {
232
232
  this.$el.html(
233
- LevelSelector.listTemplate({
233
+ QualityLevels.listTemplate({
234
234
  arrowLeftIcon,
235
235
  checkIcon,
236
236
  current: this.selectedLevelId,
@@ -247,7 +247,7 @@ export class LevelSelector extends UICorePlugin {
247
247
  ;(this.core.getPlugin('bottom_gear') as BottomGear)
248
248
  ?.addItem('quality', this.$el)
249
249
  .html(
250
- LevelSelector.buttonTemplate({
250
+ QualityLevels.buttonTemplate({
251
251
  arrowRightIcon,
252
252
  currentText: this.currentText,
253
253
  isHd: this.isHd,
@@ -257,8 +257,14 @@ export class LevelSelector extends UICorePlugin {
257
257
  )
258
258
  }
259
259
 
260
+ private get pluginOptions(): QualityLevelsPluginSettings {
261
+ return (
262
+ this.core.options.qualityLevels || this.core.options.levelSelector || {}
263
+ )
264
+ }
265
+
260
266
  private get maxLevel() {
261
- const maxRes = this.core.options.levelSelector?.restrictResolution
267
+ const maxRes = this.pluginOptions.restrictResolution
262
268
  return maxRes
263
269
  ? this.levels.find(
264
270
  (level) =>
@@ -269,7 +275,7 @@ export class LevelSelector extends UICorePlugin {
269
275
  }
270
276
 
271
277
  private onLevelsAvailable(levels: QualityLevel[]) {
272
- const maxResolution = this.core.options.levelSelector?.restrictResolution
278
+ const maxResolution = this.pluginOptions.restrictResolution
273
279
  this.levels = levels
274
280
  this.makeLevelsLabels()
275
281
  if (maxResolution) {
@@ -287,7 +293,7 @@ export class LevelSelector extends UICorePlugin {
287
293
  }
288
294
 
289
295
  private makeLevelsLabels() {
290
- const labels = this.core.options.levelSelector?.labels ?? {}
296
+ const labels = this.pluginOptions.labels ?? {}
291
297
  this.levelLabels = []
292
298
 
293
299
  for (const level of this.levels) {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
2
2
  import { Events } from '@clappr/core'
3
- import { LevelSelector } from '../LevelSelector.js'
3
+ import { QualityLevels } from '../QualityLevels.js'
4
4
  import {
5
5
  createMockBottomGear,
6
6
  createMockCore,
@@ -33,9 +33,9 @@ const LEVELS = [
33
33
  },
34
34
  ]
35
35
 
36
- describe('LevelSelector', () => {
36
+ describe('QualityLevels', () => {
37
37
  let core: any
38
- let levelSelector: LevelSelector
38
+ let levelSelector: QualityLevels
39
39
  let mediaControl: any
40
40
  let bottomGear: any
41
41
  describe('basically', () => {
@@ -57,7 +57,7 @@ describe('LevelSelector', () => {
57
57
  })
58
58
  mediaControl = createMockMediaControl(core)
59
59
  bottomGear = createMockBottomGear(core)
60
- levelSelector = new LevelSelector(core)
60
+ levelSelector = new QualityLevels(core)
61
61
  })
62
62
  describe('initially', () => {
63
63
  beforeEach(() => {
@@ -123,13 +123,13 @@ describe('LevelSelector', () => {
123
123
  })
124
124
  mediaControl = createMockMediaControl(core)
125
125
  bottomGear = createMockBottomGear(core)
126
- levelSelector = new LevelSelector(core)
126
+ levelSelector = new QualityLevels(core)
127
127
  core.emit(Events.CORE_READY)
128
128
  core.emit(Events.CORE_ACTIVE_CONTAINER_CHANGED, core.activeContainer)
129
129
  bottomGear.trigger(GearEvents.RENDERED)
130
130
  })
131
131
  describe('initially', () => {
132
- beforeEach(async () => {
132
+ beforeEach(() => {
133
133
  core.activePlayback.emit(Events.PLAYBACK_LEVELS_AVAILABLE, LEVELS)
134
134
  })
135
135
  it('should render the restricted quality level label', () => {
@@ -143,6 +143,20 @@ describe('LevelSelector', () => {
143
143
  // @ts-ignore
144
144
  ).toMatchQualityLevelOption('360p')
145
145
  })
146
+ describe('when opened', () => {
147
+ beforeEach(() => {
148
+ bottomGear.$el.find('[data-quality]').click()
149
+ })
150
+ it('should render the restricted level items disabled', () => {
151
+ expect(levelSelector.el.innerHTML).toMatchSnapshot()
152
+ const allItems = levelSelector.$el.find('#level-selector-menu li')
153
+ expect(allItems.length).toBe(3)
154
+ const unrestrictedItems = allItems.filter(':not(.disabled)')
155
+ expect(unrestrictedItems.length).toBe(1)
156
+ // @ts-ignore
157
+ expect(unrestrictedItems.text()).toMatchQualityLevelOption('360p')
158
+ })
159
+ })
146
160
  })
147
161
  describe('given vertical video format levels', () => {
148
162
  beforeEach(() => {
@@ -1,11 +1,11 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`LevelSelector > basically > auto > should render the selected level 1`] = `
3
+ exports[`QualityLevels > basically > auto > should render the selected level 1`] = `
4
4
  "<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
5
5
  <span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
6
6
  quality
7
7
  </button>
8
- <ul class="gear-sub-menu" id="level-selector-menu">
8
+ <ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
9
9
 
10
10
  <li class="current">
11
11
  <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="-1" id="level_selector_auto">
@@ -16,21 +16,21 @@ exports[`LevelSelector > basically > auto > should render the selected level 1`]
16
16
 
17
17
 
18
18
  <li class="">
19
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
19
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_1080">
20
20
  <span class="check-icon">/assets/icons/new/check.svg</span>
21
21
  Full HD
22
22
  </a>
23
23
  </li>
24
24
 
25
25
  <li class="">
26
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" id="level_selector_720">
26
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_720">
27
27
  <span class="check-icon">/assets/icons/new/check.svg</span>
28
28
  HD
29
29
  </a>
30
30
  </li>
31
31
 
32
32
  <li class="">
33
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" id="level_selector_360">
33
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_360">
34
34
  <span class="check-icon">/assets/icons/new/check.svg</span>
35
35
  360p
36
36
  </a>
@@ -40,12 +40,12 @@ exports[`LevelSelector > basically > auto > should render the selected level 1`]
40
40
  "
41
41
  `;
42
42
 
43
- exports[`LevelSelector > basically > custom label > should render the selected level 1`] = `
43
+ exports[`QualityLevels > basically > custom label > should render the selected level 1`] = `
44
44
  "<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
45
45
  <span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
46
46
  quality
47
47
  </button>
48
- <ul class="gear-sub-menu" id="level-selector-menu">
48
+ <ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
49
49
 
50
50
  <li class="">
51
51
  <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="-1" id="level_selector_auto">
@@ -56,21 +56,21 @@ exports[`LevelSelector > basically > custom label > should render the selected l
56
56
 
57
57
 
58
58
  <li class="">
59
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
59
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_1080">
60
60
  <span class="check-icon">/assets/icons/new/check.svg</span>
61
61
  Full HD
62
62
  </a>
63
63
  </li>
64
64
 
65
65
  <li class="current">
66
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="1" id="level_selector_720">
66
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="1" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_720">
67
67
  <span class="check-icon">/assets/icons/new/check.svg</span>
68
68
  HD
69
69
  </a>
70
70
  </li>
71
71
 
72
72
  <li class="">
73
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" id="level_selector_360">
73
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="0" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_360">
74
74
  <span class="check-icon">/assets/icons/new/check.svg</span>
75
75
  360p
76
76
  </a>
@@ -80,12 +80,12 @@ exports[`LevelSelector > basically > custom label > should render the selected l
80
80
  "
81
81
  `;
82
82
 
83
- exports[`LevelSelector > basically > standard label > should render the selected level 1`] = `
83
+ exports[`QualityLevels > basically > standard label > should render the selected level 1`] = `
84
84
  "<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
85
85
  <span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
86
86
  quality
87
87
  </button>
88
- <ul class="gear-sub-menu" id="level-selector-menu">
88
+ <ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
89
89
 
90
90
  <li class="">
91
91
  <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="-1" id="level_selector_auto">
@@ -96,21 +96,21 @@ exports[`LevelSelector > basically > standard label > should render the selected
96
96
 
97
97
 
98
98
  <li class="">
99
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
99
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_1080">
100
100
  <span class="check-icon">/assets/icons/new/check.svg</span>
101
101
  Full HD
102
102
  </a>
103
103
  </li>
104
104
 
105
105
  <li class="">
106
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" id="level_selector_720">
106
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_720">
107
107
  <span class="check-icon">/assets/icons/new/check.svg</span>
108
108
  HD
109
109
  </a>
110
110
  </li>
111
111
 
112
112
  <li class="current">
113
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" id="level_selector_360">
113
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" data-disabled="false" data-checked="false" role="menuitemradio" id="level_selector_360">
114
114
  <span class="check-icon">/assets/icons/new/check.svg</span>
115
115
  360p
116
116
  </a>
@@ -120,30 +120,30 @@ exports[`LevelSelector > basically > standard label > should render the selected
120
120
  "
121
121
  `;
122
122
 
123
- exports[`LevelSelector > options.restrictResolution > given vertical video format levels > should recognize vertical orientation 1`] = `
123
+ exports[`QualityLevels > options.restrictResolution > given vertical video format levels > should recognize vertical orientation 1`] = `
124
124
  "<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
125
125
  <span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
126
126
  quality
127
127
  </button>
128
- <ul class="gear-sub-menu" id="level-selector-menu">
128
+ <ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
129
129
 
130
130
 
131
- <li class="disabled ">
132
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" id="level_selector_1080">
131
+ <li class=" disabled">
132
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_1080">
133
133
  <span class="check-icon">/assets/icons/new/check.svg</span>
134
134
  1080p
135
135
  </a>
136
136
  </li>
137
137
 
138
- <li class="disabled ">
139
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" id="level_selector_720">
138
+ <li class=" disabled">
139
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_720">
140
140
  <span class="check-icon">/assets/icons/new/check.svg</span>
141
141
  720p
142
142
  </a>
143
143
  </li>
144
144
 
145
- <li class="current ">
146
- <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" id="level_selector_360">
145
+ <li class=" current">
146
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" data-disabled="false" data-checked="true" role="menuitemradio" id="level_selector_360">
147
147
  <span class="check-icon">/assets/icons/new/check.svg</span>
148
148
  360p
149
149
  </a>
@@ -153,8 +153,8 @@ exports[`LevelSelector > options.restrictResolution > given vertical video forma
153
153
  "
154
154
  `;
155
155
 
156
- exports[`LevelSelector > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
157
- "<button class="gplayer-lite-btn gcore-skin-text-color gear-option">
156
+ exports[`QualityLevels > options.restrictResolution > initially > should render the restricted quality level label 1`] = `
157
+ "<button class="gplayer-lite-btn gcore-skin-text-color gear-option" aria-haspopup="menu">
158
158
  <span class="gear-option_hd-icon hidden">/assets/icons/new/hd.svg</span>
159
159
  <span>quality</span>
160
160
  <span class="gear-option_arrow-right-icon">/assets/icons/new/arrow-right.svg</span>
@@ -162,3 +162,36 @@ exports[`LevelSelector > options.restrictResolution > initially > should render
162
162
  </button>
163
163
  "
164
164
  `;
165
+
166
+ exports[`QualityLevels > options.restrictResolution > initially > when opened > should render the restricted level items disabled 1`] = `
167
+ "<button class="gplayer-lite-btn go-back gcore-skin-text-color" id="level-selector-back-button">
168
+ <span class="arrow-left-icon">/assets/icons/new/arrow-left.svg</span>
169
+ quality
170
+ </button>
171
+ <ul class="gear-sub-menu quality-levels" id="level-selector-menu" role="menu">
172
+
173
+
174
+ <li class=" disabled">
175
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="2" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_1080">
176
+ <span class="check-icon">/assets/icons/new/check.svg</span>
177
+ 1080p
178
+ </a>
179
+ </li>
180
+
181
+ <li class=" disabled">
182
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color" data-id="1" data-disabled="true" data-checked="false" role="menuitemradio" id="level_selector_720">
183
+ <span class="check-icon">/assets/icons/new/check.svg</span>
184
+ 720p
185
+ </a>
186
+ </li>
187
+
188
+ <li class=" current">
189
+ <a href="#" class="gear-sub-menu_btn gcore-skin-text-color gcore-skin-active" data-id="0" data-disabled="false" data-checked="true" role="menuitemradio" id="level_selector_360">
190
+ <span class="check-icon">/assets/icons/new/check.svg</span>
191
+ 360p
192
+ </a>
193
+ </li>
194
+
195
+ </ul>
196
+ "
197
+ `;