Source: ui/skip_next_button.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.ui.SkipNextButton');
  7. goog.require('shaka.ui.Controls');
  8. goog.require('shaka.ui.Element');
  9. goog.require('shaka.ui.Enums');
  10. goog.require('shaka.ui.Locales');
  11. goog.require('shaka.ui.Localization');
  12. goog.require('shaka.ui.MaterialSVGIcon');
  13. goog.require('shaka.ui.Utils');
  14. goog.require('shaka.util.Dom');
  15. /**
  16. * @extends {shaka.ui.Element}
  17. * @final
  18. * @export
  19. */
  20. shaka.ui.SkipNextButton = class extends shaka.ui.Element {
  21. /**
  22. * @param {!HTMLElement} parent
  23. * @param {!shaka.ui.Controls} controls
  24. */
  25. constructor(parent, controls) {
  26. super(parent, controls);
  27. this.queueManager_ = this.player.getQueueManager();
  28. if (!this.queueManager_) {
  29. return;
  30. }
  31. /** @private {!HTMLButtonElement} */
  32. this.button_ = shaka.util.Dom.createButton();
  33. this.button_.classList.add('shaka-skip-next-button');
  34. this.button_.classList.add('shaka-tooltip');
  35. new shaka.ui.MaterialSVGIcon(this.button_).use(
  36. shaka.ui.Enums.MaterialDesignSVGIcons.SKIP_NEXT);
  37. this.parent.appendChild(this.button_);
  38. this.updateAriaLabel_();
  39. this.checkAvailability_();
  40. this.eventManager.listen(
  41. this.localization, shaka.ui.Localization.LOCALE_UPDATED, () => {
  42. this.updateAriaLabel_();
  43. });
  44. this.eventManager.listen(
  45. this.localization, shaka.ui.Localization.LOCALE_CHANGED, () => {
  46. this.updateAriaLabel_();
  47. });
  48. this.eventManager.listen(this.button_, 'click', () => {
  49. if (!this.controls.isOpaque()) {
  50. return;
  51. }
  52. this.queueManager_.playItem(this.queueManager_.getCurrentItemIndex() + 1);
  53. });
  54. this.eventManager.listen(this.queueManager_, 'currentitemchanged', () => {
  55. this.checkAvailability_();
  56. });
  57. this.eventManager.listen(this.queueManager_, 'itemsinserted', () => {
  58. this.checkAvailability_();
  59. });
  60. this.eventManager.listen(this.queueManager_, 'itemsremoved', () => {
  61. this.checkAvailability_();
  62. });
  63. this.eventManager.listen(this.player, 'loading', () => {
  64. this.checkAvailability_();
  65. });
  66. }
  67. /**
  68. * @private
  69. */
  70. updateAriaLabel_() {
  71. this.button_.ariaLabel =
  72. this.localization.resolve(shaka.ui.Locales.Ids.SKIP_NEXT);
  73. }
  74. /** @private */
  75. checkAvailability_() {
  76. const itemsLength = this.queueManager_.getItems().length;
  77. const available = itemsLength > 1 &&
  78. (this.queueManager_.getCurrentItemIndex() + 1) < itemsLength;
  79. shaka.ui.Utils.setDisplay(this.button_, available);
  80. }
  81. };
  82. /**
  83. * @implements {shaka.extern.IUIElement.Factory}
  84. * @final
  85. */
  86. shaka.ui.SkipNextButton.Factory = class {
  87. /** @override */
  88. create(rootElement, controls) {
  89. return new shaka.ui.SkipNextButton(rootElement, controls);
  90. }
  91. };
  92. shaka.ui.Controls.registerElement(
  93. 'skip_next', new shaka.ui.SkipNextButton.Factory());