@amazon/vinyl 1.2.0 → 1.2.2
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/dist/index.cjs +24 -6
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +33 -13
- package/dist/index.js.map +3 -3
- package/dist/test/integ.es5.js +62 -62
- package/dist/test/integ.js +119 -6
- package/dist/test/integ.js.map +2 -2
- package/dist/types/current/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/current/ad/AdBreakInfo.d.ts.map +1 -0
- package/dist/types/current/ad/AdBreakInfo.js +5 -0
- package/dist/types/current/ad/AdController.d.ts +229 -0
- package/dist/types/current/ad/AdController.d.ts.map +1 -0
- package/dist/types/current/ad/AdController.js +19 -0
- package/dist/types/current/ad/AdControllerImpl.d.ts +162 -0
- package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -0
- package/dist/types/current/ad/AdControllerImpl.js +741 -0
- package/dist/types/current/ad/AdError.d.ts +6 -0
- package/dist/types/current/ad/AdError.d.ts.map +1 -0
- package/dist/types/current/ad/AdError.js +14 -0
- package/dist/types/current/ad/AdsProvider.d.ts +28 -0
- package/dist/types/current/ad/AdsProvider.d.ts.map +1 -0
- package/dist/types/current/ad/AdsProvider.js +5 -0
- package/dist/types/current/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/current/ad/defaultAdLoadOptionsResolver.d.ts.map +1 -0
- package/dist/types/current/ad/defaultAdLoadOptionsResolver.js +26 -0
- package/dist/types/current/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/current/ad/discoverHlsInterstitials.d.ts.map +1 -0
- package/dist/types/current/ad/discoverHlsInterstitials.js +248 -0
- package/dist/types/current/drm/DrmControllerImpl.d.ts +6 -0
- package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.js +23 -1
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/current/playback/createStallDetector.d.ts +43 -0
- package/dist/types/current/playback/createStallDetector.d.ts.map +1 -0
- package/dist/types/current/playback/createStallDetector.js +101 -0
- package/dist/types/current/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/current/playback/createStallMonitor.d.ts.map +1 -0
- package/dist/types/current/playback/createStallMonitor.js +99 -0
- package/dist/types/current/streaming/AudioOptions.d.ts +66 -0
- package/dist/types/current/streaming/AudioOptions.d.ts.map +1 -0
- package/dist/types/current/streaming/AudioOptions.js +19 -0
- package/dist/types/current/streaming/LoadMetric.d.ts +72 -0
- package/dist/types/current/streaming/LoadMetric.d.ts.map +1 -0
- package/dist/types/current/streaming/LoadMetric.js +5 -0
- package/dist/types/current/streaming/ManifestControllerImpl.d.ts +43 -0
- package/dist/types/current/streaming/ManifestControllerImpl.d.ts.map +1 -0
- package/dist/types/current/streaming/ManifestControllerImpl.js +104 -0
- package/dist/types/current/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/current/streaming/buffering/codecDenylist.d.ts.map +1 -0
- package/dist/types/current/streaming/buffering/codecDenylist.js +62 -0
- package/dist/types/current/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/current/streaming/createAllowedContentTypesValue.d.ts.map +1 -0
- package/dist/types/current/streaming/createAllowedContentTypesValue.js +43 -0
- package/dist/types/current/streaming/createTimelineContentTypesValue.d.ts +21 -0
- package/dist/types/current/streaming/createTimelineContentTypesValue.d.ts.map +1 -0
- package/dist/types/current/streaming/createTimelineContentTypesValue.js +25 -0
- package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.d.ts.map +1 -0
- package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.js +75 -0
- package/dist/types/current/text/HtmlTextTrackRenderer.d.ts +60 -0
- package/dist/types/current/text/HtmlTextTrackRenderer.d.ts.map +1 -0
- package/dist/types/current/text/HtmlTextTrackRenderer.js +231 -0
- package/dist/types/current/text/SidecarTextTrackController.d.ts +103 -0
- package/dist/types/current/text/SidecarTextTrackController.d.ts.map +1 -0
- package/dist/types/current/text/SidecarTextTrackController.js +250 -0
- package/dist/types/current/text/SidecarTextTrackLoader.d.ts +65 -0
- package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -0
- package/dist/types/current/text/SidecarTextTrackLoader.js +150 -0
- package/dist/types/current/text/TextTrack.d.ts +179 -0
- package/dist/types/current/text/TextTrack.d.ts.map +1 -0
- package/dist/types/current/text/TextTrack.js +29 -0
- package/dist/types/current/text/TextTrackRenderer.d.ts +24 -0
- package/dist/types/current/text/TextTrackRenderer.d.ts.map +1 -0
- package/dist/types/current/text/TextTrackRenderer.js +5 -0
- package/dist/types/current/text/VttCueStyle.d.ts +41 -0
- package/dist/types/current/text/VttCueStyle.d.ts.map +1 -0
- package/dist/types/current/text/VttCueStyle.js +45 -0
- package/dist/types/current/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/current/text/discoverDashTextTracks.d.ts.map +1 -0
- package/dist/types/current/text/discoverDashTextTracks.js +110 -0
- package/dist/types/current/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/current/text/discoverHlsTextTracks.d.ts.map +1 -0
- package/dist/types/current/text/discoverHlsTextTracks.js +49 -0
- package/dist/types/current/text/mediaTextTrackProvider.d.ts +34 -0
- package/dist/types/current/text/mediaTextTrackProvider.d.ts.map +1 -0
- package/dist/types/current/text/mediaTextTrackProvider.js +42 -0
- package/dist/types/current/text/parseWebVtt.d.ts +60 -0
- package/dist/types/current/text/parseWebVtt.d.ts.map +1 -0
- package/dist/types/current/text/parseWebVtt.js +249 -0
- package/dist/types/current/text/pickPreferredTextTrack.d.ts +15 -0
- package/dist/types/current/text/pickPreferredTextTrack.d.ts.map +1 -0
- package/dist/types/current/text/pickPreferredTextTrack.js +71 -0
- package/dist/types/current/track/SeekRange.d.ts +9 -0
- package/dist/types/current/track/SeekRange.d.ts.map +1 -0
- package/dist/types/current/track/SeekRange.js +5 -0
- package/dist/types/current/track/hls/HlsManifestData.d.ts +19 -0
- package/dist/types/current/track/hls/HlsManifestData.d.ts.map +1 -0
- package/dist/types/current/track/hls/HlsManifestData.js +5 -0
- package/dist/types/current/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/current/track/hls/createHlsManifestProvider.d.ts.map +1 -0
- package/dist/types/current/track/hls/createHlsManifestProvider.js +9 -0
- package/dist/types/current/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/current/track/inferLoadOptionsFromUri.d.ts.map +1 -0
- package/dist/types/current/track/inferLoadOptionsFromUri.js +55 -0
- package/dist/types/current/track/mse/MseTrack.d.ts +0 -1
- package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
- package/dist/types/current/track/mse/MseTrack.js +4 -5
- package/dist/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/types/current/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/current/util/media/codecOverrides.d.ts.map +1 -0
- package/dist/types/current/util/media/codecOverrides.js +37 -0
- package/dist/types/current/util/media/codecSupport.d.ts +6 -0
- package/dist/types/current/util/media/codecSupport.d.ts.map +1 -0
- package/dist/types/current/util/media/codecSupport.js +17 -0
- package/dist/types/current/util/media/mimeType.d.ts +8 -0
- package/dist/types/current/util/media/mimeType.d.ts.map +1 -0
- package/dist/types/current/util/media/mimeType.js +13 -0
- package/dist/types/ts3.7/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/ts3.7/ad/AdController.d.ts +243 -0
- package/dist/types/ts3.7/ad/AdControllerImpl.d.ts +162 -0
- package/dist/types/ts3.7/ad/AdError.d.ts +6 -0
- package/dist/types/ts3.7/ad/AdsProvider.d.ts +28 -0
- package/dist/types/ts3.7/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/ts3.7/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +6 -0
- package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/ts3.7/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts3.7/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts3.7/streaming/AudioOptions.d.ts +66 -0
- package/dist/types/ts3.7/streaming/LoadMetric.d.ts +72 -0
- package/dist/types/ts3.7/streaming/ManifestControllerImpl.d.ts +40 -0
- package/dist/types/ts3.7/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/ts3.7/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/ts3.7/streaming/createTimelineContentTypesValue.d.ts +21 -0
- package/dist/types/ts3.7/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/ts3.7/text/HtmlTextTrackRenderer.d.ts +60 -0
- package/dist/types/ts3.7/text/SidecarTextTrackController.d.ts +103 -0
- package/dist/types/ts3.7/text/SidecarTextTrackLoader.d.ts +65 -0
- package/dist/types/ts3.7/text/TextTrack.d.ts +183 -0
- package/dist/types/ts3.7/text/TextTrackRenderer.d.ts +24 -0
- package/dist/types/ts3.7/text/VttCueStyle.d.ts +41 -0
- package/dist/types/ts3.7/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/ts3.7/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/ts3.7/text/mediaTextTrackProvider.d.ts +34 -0
- package/dist/types/ts3.7/text/parseWebVtt.d.ts +60 -0
- package/dist/types/ts3.7/text/pickPreferredTextTrack.d.ts +15 -0
- package/dist/types/ts3.7/track/SeekRange.d.ts +9 -0
- package/dist/types/ts3.7/track/hls/HlsManifestData.d.ts +19 -0
- package/dist/types/ts3.7/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/ts3.7/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/ts3.7/track/mse/MseTrack.d.ts +0 -1
- package/dist/types/ts3.7/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/ts3.7/util/media/codecSupport.d.ts +6 -0
- package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.1/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/ts4.1/ad/AdController.d.ts +243 -0
- package/dist/types/ts4.1/ad/AdControllerImpl.d.ts +162 -0
- package/dist/types/ts4.1/ad/AdError.d.ts +6 -0
- package/dist/types/ts4.1/ad/AdsProvider.d.ts +28 -0
- package/dist/types/ts4.1/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/ts4.1/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +6 -0
- package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/ts4.1/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts4.1/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts4.1/streaming/AudioOptions.d.ts +66 -0
- package/dist/types/ts4.1/streaming/LoadMetric.d.ts +72 -0
- package/dist/types/ts4.1/streaming/ManifestControllerImpl.d.ts +40 -0
- package/dist/types/ts4.1/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/ts4.1/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/ts4.1/streaming/createTimelineContentTypesValue.d.ts +21 -0
- package/dist/types/ts4.1/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/ts4.1/text/HtmlTextTrackRenderer.d.ts +60 -0
- package/dist/types/ts4.1/text/SidecarTextTrackController.d.ts +104 -0
- package/dist/types/ts4.1/text/SidecarTextTrackLoader.d.ts +65 -0
- package/dist/types/ts4.1/text/TextTrack.d.ts +183 -0
- package/dist/types/ts4.1/text/TextTrackRenderer.d.ts +24 -0
- package/dist/types/ts4.1/text/VttCueStyle.d.ts +41 -0
- package/dist/types/ts4.1/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/ts4.1/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/ts4.1/text/mediaTextTrackProvider.d.ts +34 -0
- package/dist/types/ts4.1/text/parseWebVtt.d.ts +60 -0
- package/dist/types/ts4.1/text/pickPreferredTextTrack.d.ts +15 -0
- package/dist/types/ts4.1/track/SeekRange.d.ts +9 -0
- package/dist/types/ts4.1/track/hls/HlsManifestData.d.ts +19 -0
- package/dist/types/ts4.1/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/ts4.1/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/ts4.1/track/mse/MseTrack.d.ts +0 -1
- package/dist/types/ts4.1/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/ts4.1/util/media/codecSupport.d.ts +6 -0
- package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.7/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/ts4.7/ad/AdController.d.ts +243 -0
- package/dist/types/ts4.7/ad/AdControllerImpl.d.ts +162 -0
- package/dist/types/ts4.7/ad/AdError.d.ts +6 -0
- package/dist/types/ts4.7/ad/AdsProvider.d.ts +28 -0
- package/dist/types/ts4.7/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/ts4.7/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +6 -0
- package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -1
- package/dist/types/ts4.7/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts4.7/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts4.7/streaming/AudioOptions.d.ts +66 -0
- package/dist/types/ts4.7/streaming/LoadMetric.d.ts +72 -0
- package/dist/types/ts4.7/streaming/ManifestControllerImpl.d.ts +43 -0
- package/dist/types/ts4.7/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/ts4.7/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/ts4.7/streaming/createTimelineContentTypesValue.d.ts +21 -0
- package/dist/types/ts4.7/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/ts4.7/text/HtmlTextTrackRenderer.d.ts +60 -0
- package/dist/types/ts4.7/text/SidecarTextTrackController.d.ts +103 -0
- package/dist/types/ts4.7/text/SidecarTextTrackLoader.d.ts +65 -0
- package/dist/types/ts4.7/text/TextTrack.d.ts +183 -0
- package/dist/types/ts4.7/text/TextTrackRenderer.d.ts +24 -0
- package/dist/types/ts4.7/text/VttCueStyle.d.ts +41 -0
- package/dist/types/ts4.7/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/ts4.7/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/ts4.7/text/mediaTextTrackProvider.d.ts +34 -0
- package/dist/types/ts4.7/text/parseWebVtt.d.ts +60 -0
- package/dist/types/ts4.7/text/pickPreferredTextTrack.d.ts +15 -0
- package/dist/types/ts4.7/track/SeekRange.d.ts +9 -0
- package/dist/types/ts4.7/track/hls/HlsManifestData.d.ts +19 -0
- package/dist/types/ts4.7/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/ts4.7/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/ts4.7/track/mse/MseTrack.d.ts +0 -1
- package/dist/types/ts4.7/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/ts4.7/util/media/codecSupport.d.ts +6 -0
- package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -0
- package/dist/unit/types/current/ad/AdController.test.d.ts +2 -0
- package/dist/unit/types/current/ad/AdController.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/AdController.test.js +10 -0
- package/dist/unit/types/current/ad/AdControllerImpl.test.d.ts +2 -0
- package/dist/unit/types/current/ad/AdControllerImpl.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/AdControllerImpl.test.js +1654 -0
- package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.d.ts +2 -0
- package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.js +56 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.d.ts +2 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.js +757 -0
- package/dist/unit/types/current/drm/DrmControllerImpl.test.js +96 -2
- package/dist/unit/types/current/playback/createStallDetector.test.d.ts +2 -0
- package/dist/unit/types/current/playback/createStallDetector.test.d.ts.map +1 -0
- package/dist/unit/types/current/playback/createStallDetector.test.js +163 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.d.ts +2 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.d.ts.map +1 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.js +163 -0
- package/dist/unit/types/current/streaming/ManifestControllerImpl.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/ManifestControllerImpl.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/ManifestControllerImpl.test.js +197 -0
- package/dist/unit/types/current/streaming/MseTrack.test.js +15 -0
- package/dist/unit/types/current/streaming/buffering/codecDenylist.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/buffering/codecDenylist.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/buffering/codecDenylist.test.js +56 -0
- package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.js +77 -0
- package/dist/unit/types/current/streaming/createTimelineContentTypesValue.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/createTimelineContentTypesValue.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/createTimelineContentTypesValue.test.js +57 -0
- package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.js +99 -0
- package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.d.ts +2 -0
- package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.js +231 -0
- package/dist/unit/types/current/text/SidecarTextTrackController.test.d.ts +2 -0
- package/dist/unit/types/current/text/SidecarTextTrackController.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/SidecarTextTrackController.test.js +686 -0
- package/dist/unit/types/current/text/SidecarTextTrackLoader.test.d.ts +2 -0
- package/dist/unit/types/current/text/SidecarTextTrackLoader.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/SidecarTextTrackLoader.test.js +365 -0
- package/dist/unit/types/current/text/TextTrack.test.d.ts +2 -0
- package/dist/unit/types/current/text/TextTrack.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/TextTrack.test.js +12 -0
- package/dist/unit/types/current/text/VttCueStyle.test.d.ts +2 -0
- package/dist/unit/types/current/text/VttCueStyle.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/VttCueStyle.test.js +76 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.d.ts +2 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.js +216 -0
- package/dist/unit/types/current/text/discoverHlsTextTracks.test.d.ts +2 -0
- package/dist/unit/types/current/text/discoverHlsTextTracks.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/discoverHlsTextTracks.test.js +177 -0
- package/dist/unit/types/current/text/mediaTextTrackProvider.test.d.ts +2 -0
- package/dist/unit/types/current/text/mediaTextTrackProvider.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/mediaTextTrackProvider.test.js +86 -0
- package/dist/unit/types/current/text/parseWebVtt.test.d.ts +2 -0
- package/dist/unit/types/current/text/parseWebVtt.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/parseWebVtt.test.js +419 -0
- package/dist/unit/types/current/text/pickPreferredTextTrack.test.d.ts +2 -0
- package/dist/unit/types/current/text/pickPreferredTextTrack.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/pickPreferredTextTrack.test.js +78 -0
- package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.d.ts +2 -0
- package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.d.ts.map +1 -0
- package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.js +165 -0
- package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/unit/types/current/util/media/codecOverrides.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/codecOverrides.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/codecOverrides.test.js +42 -0
- package/dist/unit/types/current/util/media/codecSupport.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/codecSupport.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/codecSupport.test.js +26 -0
- package/dist/unit/types/current/util/media/mimeType.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/mimeType.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/mimeType.test.js +22 -0
- package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.d.ts +2 -0
- package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.d.ts.map +1 -0
- package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.js +142 -0
- package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.d.ts +2 -0
- package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.d.ts.map +1 -0
- package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.js +188 -0
- package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.d.ts.map +1 -0
- package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.js +26 -0
- package/dist/vinylTestUtil/types/current/mock/dash/mockDashManifest.d.ts +84 -84
- package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts.map +1 -0
- package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.js +14 -0
- package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/dash/mockDashManifest.d.ts +84 -84
- package/dist/vinylTestUtil/types/ts3.7/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/dash/mockDashManifest.d.ts +84 -84
- package/dist/vinylTestUtil/types/ts4.1/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/dash/mockDashManifest.d.ts +84 -84
- package/dist/vinylTestUtil/types/ts4.7/mock/text/MockTextTrackController.d.ts +10 -0
- package/package.json +10 -11
|
@@ -207,6 +207,21 @@ describe('MseTrack', () => {
|
|
|
207
207
|
expect(deps.playbackSource.load).toHaveBeenCalledOnceWith();
|
|
208
208
|
expect(deps.playbackController.pause).toHaveBeenCalledOnceWith();
|
|
209
209
|
});
|
|
210
|
+
it('aborts the drm session abort so key sessions close', async () => {
|
|
211
|
+
// Regression: MSE key sessions must be tied to the per-activation
|
|
212
|
+
// drmSessionAbort (fired by closeDrmSessions on deactivate), not a
|
|
213
|
+
// separate abort that never fires — otherwise sessions leak.
|
|
214
|
+
track = createTrack();
|
|
215
|
+
await awaitContentTypes();
|
|
216
|
+
getAudioStream().streamingQuality =
|
|
217
|
+
createEmptyMediaQualityMetadata();
|
|
218
|
+
track.activate({});
|
|
219
|
+
const abort = deps.drmController.initializeForPlayback.calls.mostRecent()
|
|
220
|
+
.args[1];
|
|
221
|
+
expect(abort.aborted()).toBeFalse();
|
|
222
|
+
track.deactivate();
|
|
223
|
+
expect(abort.aborted()).toBeTrue();
|
|
224
|
+
});
|
|
210
225
|
});
|
|
211
226
|
describe('error', () => {
|
|
212
227
|
it('returns the first emitted error', async () => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codecDenylist.test.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/streaming/buffering/codecDenylist.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { clearCodecDenylist, denylistCodecsFromMimeType, getDenylistedCodecs, isMimeTypeDenylisted, } from '@amazon/vinyl';
|
|
6
|
+
describe('codecDenylist', () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
clearCodecDenylist();
|
|
9
|
+
});
|
|
10
|
+
describe('denylistCodecsFromMimeType', () => {
|
|
11
|
+
it('adds codecs and returns true on first denylist', () => {
|
|
12
|
+
expect(denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"')).toBeTrue();
|
|
13
|
+
expect(getDenylistedCodecs()).toContain('hvc1.1');
|
|
14
|
+
});
|
|
15
|
+
it('returns false when all codecs are already denylisted', () => {
|
|
16
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
17
|
+
expect(denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"')).toBeFalse();
|
|
18
|
+
});
|
|
19
|
+
it('returns true when at least one codec is newly added', () => {
|
|
20
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
21
|
+
expect(denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1,ec-3"')).toBeTrue();
|
|
22
|
+
});
|
|
23
|
+
it('returns false for a mimeType with no codecs', () => {
|
|
24
|
+
expect(denylistCodecsFromMimeType('video/mp4')).toBeFalse();
|
|
25
|
+
});
|
|
26
|
+
it('stores codecs lowercased', () => {
|
|
27
|
+
denylistCodecsFromMimeType('video/mp4; codecs="HVC1.1"');
|
|
28
|
+
expect(getDenylistedCodecs()).toContain('hvc1.1');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('isMimeTypeDenylisted', () => {
|
|
32
|
+
it('returns true when a codec is denylisted', () => {
|
|
33
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
34
|
+
expect(isMimeTypeDenylisted('video/mp4; codecs="hvc1.1"')).toBeTrue();
|
|
35
|
+
});
|
|
36
|
+
it('is case-insensitive', () => {
|
|
37
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
38
|
+
expect(isMimeTypeDenylisted('video/mp4; codecs="HVC1.1"')).toBeTrue();
|
|
39
|
+
});
|
|
40
|
+
it('returns false when no codec is denylisted', () => {
|
|
41
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
42
|
+
expect(isMimeTypeDenylisted('video/mp4; codecs="avc1.64001f"')).toBeFalse();
|
|
43
|
+
});
|
|
44
|
+
it('returns false for a mimeType with no codecs', () => {
|
|
45
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
46
|
+
expect(isMimeTypeDenylisted('video/mp4')).toBeFalse();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('clearCodecDenylist', () => {
|
|
50
|
+
it('empties the denylist', () => {
|
|
51
|
+
denylistCodecsFromMimeType('video/mp4; codecs="hvc1.1"');
|
|
52
|
+
clearCodecDenylist();
|
|
53
|
+
expect(getDenylistedCodecs()).toEqual([]);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAllowedContentTypesValue.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/streaming/createAllowedContentTypesValue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { createAllowedContentTypesValue, } from '@amazon/vinyl';
|
|
6
|
+
import { data } from '@amazon/vinyl-observable';
|
|
7
|
+
describe('createAllowedContentTypesValue', () => {
|
|
8
|
+
let baseContentTypesValue;
|
|
9
|
+
let options;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
baseContentTypesValue = data(Promise.resolve(new Set(['audio', 'video', 'text'])));
|
|
12
|
+
options = data({ allowedContentTypes: null });
|
|
13
|
+
});
|
|
14
|
+
it('passes all content types through when the allow list is null', async () => {
|
|
15
|
+
const result = await createAllowedContentTypesValue({
|
|
16
|
+
baseContentTypesValue,
|
|
17
|
+
options,
|
|
18
|
+
}).value;
|
|
19
|
+
expect(result).toEqual(new Set(['audio', 'video', 'text']));
|
|
20
|
+
});
|
|
21
|
+
it('keeps only the allowed media content types', async () => {
|
|
22
|
+
options.value = { allowedContentTypes: ['audio'] };
|
|
23
|
+
const result = await createAllowedContentTypesValue({
|
|
24
|
+
baseContentTypesValue,
|
|
25
|
+
options,
|
|
26
|
+
}).value;
|
|
27
|
+
// Text always passes through; video is dropped.
|
|
28
|
+
expect(result).toEqual(new Set(['audio', 'text']));
|
|
29
|
+
});
|
|
30
|
+
it('always keeps text even when only video is allowed', async () => {
|
|
31
|
+
options.value = { allowedContentTypes: ['video'] };
|
|
32
|
+
const result = await createAllowedContentTypesValue({
|
|
33
|
+
baseContentTypesValue,
|
|
34
|
+
options,
|
|
35
|
+
}).value;
|
|
36
|
+
expect(result).toEqual(new Set(['video', 'text']));
|
|
37
|
+
});
|
|
38
|
+
it('keeps text even when the allow list is empty', async () => {
|
|
39
|
+
options.value = { allowedContentTypes: [] };
|
|
40
|
+
const result = await createAllowedContentTypesValue({
|
|
41
|
+
baseContentTypesValue,
|
|
42
|
+
options,
|
|
43
|
+
}).value;
|
|
44
|
+
expect(result).toEqual(new Set(['text']));
|
|
45
|
+
});
|
|
46
|
+
it('ignores allowed types not present in the manifest', async () => {
|
|
47
|
+
baseContentTypesValue.value = Promise.resolve(new Set(['audio']));
|
|
48
|
+
options.value = { allowedContentTypes: ['audio', 'video'] };
|
|
49
|
+
const result = await createAllowedContentTypesValue({
|
|
50
|
+
baseContentTypesValue,
|
|
51
|
+
options,
|
|
52
|
+
}).value;
|
|
53
|
+
expect(result).toEqual(new Set(['audio']));
|
|
54
|
+
});
|
|
55
|
+
it('re-emits a newly filtered set when the allow list changes', async () => {
|
|
56
|
+
const value = createAllowedContentTypesValue({
|
|
57
|
+
baseContentTypesValue,
|
|
58
|
+
options,
|
|
59
|
+
});
|
|
60
|
+
const emissions = [];
|
|
61
|
+
const unsub = value.onData((promise) => {
|
|
62
|
+
void promise.then((set) => emissions.push(set));
|
|
63
|
+
});
|
|
64
|
+
// Changing the allow list should produce a new, filtered emission,
|
|
65
|
+
// which is what drives the track to reload with only these types.
|
|
66
|
+
options.value = { allowedContentTypes: ['audio'] };
|
|
67
|
+
expect(await value.value).toEqual(new Set(['audio', 'text']));
|
|
68
|
+
unsub();
|
|
69
|
+
// Wait for all pending promise callbacks to resolve.
|
|
70
|
+
await Promise.resolve();
|
|
71
|
+
await Promise.resolve();
|
|
72
|
+
expect(emissions).toEqual([
|
|
73
|
+
new Set(['audio', 'video', 'text']),
|
|
74
|
+
new Set(['audio', 'text']),
|
|
75
|
+
]);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTimelineContentTypesValue.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/streaming/createTimelineContentTypesValue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { createEmptyMediaQualityMetadata, createTimelineContentTypesValue, } from '@amazon/vinyl';
|
|
6
|
+
import { data } from '@amazon/vinyl-observable';
|
|
7
|
+
function createQuality(contentType) {
|
|
8
|
+
return {
|
|
9
|
+
metadata: {
|
|
10
|
+
...createEmptyMediaQualityMetadata(),
|
|
11
|
+
contentType,
|
|
12
|
+
},
|
|
13
|
+
getSegment: () => Promise.resolve(null),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function timelineOf(...contentTypes) {
|
|
17
|
+
return {
|
|
18
|
+
periods: contentTypes.map((types, index) => ({
|
|
19
|
+
startTime: index * 10,
|
|
20
|
+
endTime: index * 10 + 10,
|
|
21
|
+
qualities: types.map(createQuality),
|
|
22
|
+
})),
|
|
23
|
+
minBufferTime: 2,
|
|
24
|
+
getAdBreaks: () => Promise.resolve([]),
|
|
25
|
+
getDuration: () => Promise.resolve(Infinity),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
describe('createTimelineContentTypesValue', () => {
|
|
29
|
+
function contentTypesOf(timeline) {
|
|
30
|
+
return createTimelineContentTypesValue({
|
|
31
|
+
mediaTimelineTransformed: data(Promise.resolve(timeline)),
|
|
32
|
+
}).value;
|
|
33
|
+
}
|
|
34
|
+
it('reports every media content type present in the filtered timeline', async () => {
|
|
35
|
+
const result = await contentTypesOf(timelineOf(['audio', 'audio', 'video']));
|
|
36
|
+
expect(result).toEqual(new Set(['audio', 'video']));
|
|
37
|
+
});
|
|
38
|
+
it('omits a content type whose renditions were all filtered out', async () => {
|
|
39
|
+
// Every audio rendition dropped (e.g. by the sample-rate filter): video
|
|
40
|
+
// must still be reported so the load is not stranded waiting for an
|
|
41
|
+
// audio source buffer that will never be created.
|
|
42
|
+
const result = await contentTypesOf(timelineOf(['video']));
|
|
43
|
+
expect(result).toEqual(new Set(['video']));
|
|
44
|
+
});
|
|
45
|
+
it('reports only audio when every video rendition was filtered out', async () => {
|
|
46
|
+
const result = await contentTypesOf(timelineOf(['audio']));
|
|
47
|
+
expect(result).toEqual(new Set(['audio']));
|
|
48
|
+
});
|
|
49
|
+
it('excludes text — captions are a sidecar pipeline, not an MSE source buffer', async () => {
|
|
50
|
+
const result = await contentTypesOf(timelineOf(['audio', 'video', 'text']));
|
|
51
|
+
expect(result).toEqual(new Set(['audio', 'video']));
|
|
52
|
+
});
|
|
53
|
+
it('unions content types across periods', async () => {
|
|
54
|
+
const result = await contentTypesOf(timelineOf(['video'], ['audio', 'video']));
|
|
55
|
+
expect(result).toEqual(new Set(['audio', 'video']));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaTimelineAccessibilityFilter.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/streaming/mediaTimelineAccessibilityFilter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { createAudioDescriptionFilter, createEmptyMediaQualityMetadata, filterTimelineQualities, isAudioDescription, throwNoPlayableAudio, } from '@amazon/vinyl';
|
|
6
|
+
function audioQuality(id, characteristics) {
|
|
7
|
+
return {
|
|
8
|
+
metadata: {
|
|
9
|
+
...createEmptyMediaQualityMetadata(),
|
|
10
|
+
qualityId: id,
|
|
11
|
+
contentType: 'audio',
|
|
12
|
+
lang: 'en',
|
|
13
|
+
characteristics,
|
|
14
|
+
},
|
|
15
|
+
getSegment: () => Promise.resolve(null),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function videoQuality() {
|
|
19
|
+
return {
|
|
20
|
+
metadata: {
|
|
21
|
+
...createEmptyMediaQualityMetadata(),
|
|
22
|
+
qualityId: 'video',
|
|
23
|
+
contentType: 'video',
|
|
24
|
+
},
|
|
25
|
+
getSegment: () => Promise.resolve(null),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function timelineOf(qualities) {
|
|
29
|
+
return {
|
|
30
|
+
periods: [{ startTime: 0, endTime: 10, qualities: [...qualities] }],
|
|
31
|
+
minBufferTime: 2,
|
|
32
|
+
getAdBreaks: () => Promise.resolve([]),
|
|
33
|
+
getDuration: () => Promise.resolve(Infinity),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** The audio qualityIds kept after applying the filter. */
|
|
37
|
+
function keptAudio(qualities, preferDescription) {
|
|
38
|
+
const filtered = filterTimelineQualities(createAudioDescriptionFilter(preferDescription), throwNoPlayableAudio, timelineOf(qualities));
|
|
39
|
+
return filtered.periods[0].qualities
|
|
40
|
+
.filter((q) => q.metadata.contentType === 'audio')
|
|
41
|
+
.map((q) => q.metadata.qualityId);
|
|
42
|
+
}
|
|
43
|
+
const DVS = 'public.accessibility.describes-video';
|
|
44
|
+
describe('throwNoPlayableAudio', () => {
|
|
45
|
+
it('throws (defensive guard — the filter never strands audio)', () => {
|
|
46
|
+
expect(() => throwNoPlayableAudio()).toThrowError(/No playable audio rendition/);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('isAudioDescription', () => {
|
|
50
|
+
it('detects the HLS describes-video characteristic', () => {
|
|
51
|
+
expect(isAudioDescription({
|
|
52
|
+
...createEmptyMediaQualityMetadata(),
|
|
53
|
+
characteristics: [DVS],
|
|
54
|
+
})).toBeTrue();
|
|
55
|
+
});
|
|
56
|
+
it('detects the DASH description role', () => {
|
|
57
|
+
expect(isAudioDescription({
|
|
58
|
+
...createEmptyMediaQualityMetadata(),
|
|
59
|
+
characteristics: ['description'],
|
|
60
|
+
})).toBeTrue();
|
|
61
|
+
});
|
|
62
|
+
it('is false for a plain rendition', () => {
|
|
63
|
+
expect(isAudioDescription(createEmptyMediaQualityMetadata())).toBeFalse();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('createAudioDescriptionFilter', () => {
|
|
67
|
+
it('drops the description track when a main alternative exists (default)', () => {
|
|
68
|
+
const kept = keptAudio([
|
|
69
|
+
audioQuality('dvs', [DVS]),
|
|
70
|
+
audioQuality('main', []),
|
|
71
|
+
videoQuality(),
|
|
72
|
+
], false);
|
|
73
|
+
expect(kept).toEqual(['main']);
|
|
74
|
+
});
|
|
75
|
+
it('keeps the description track when it is the only audio (never strands)', () => {
|
|
76
|
+
const kept = keptAudio([audioQuality('dvs', [DVS]), videoQuality()], false);
|
|
77
|
+
expect(kept).toEqual(['dvs']);
|
|
78
|
+
});
|
|
79
|
+
it('keeps only the description track when opted in', () => {
|
|
80
|
+
const kept = keptAudio([
|
|
81
|
+
audioQuality('dvs', [DVS]),
|
|
82
|
+
audioQuality('main', []),
|
|
83
|
+
videoQuality(),
|
|
84
|
+
], true);
|
|
85
|
+
expect(kept).toEqual(['dvs']);
|
|
86
|
+
});
|
|
87
|
+
it('keeps all audio when opted in but no description exists', () => {
|
|
88
|
+
const kept = keptAudio([audioQuality('a', []), audioQuality('b', []), videoQuality()], true);
|
|
89
|
+
expect(kept).toEqual(['a', 'b']);
|
|
90
|
+
});
|
|
91
|
+
it('leaves non-audio qualities untouched', () => {
|
|
92
|
+
const filtered = filterTimelineQualities(createAudioDescriptionFilter(false), throwNoPlayableAudio, timelineOf([
|
|
93
|
+
audioQuality('dvs', [DVS]),
|
|
94
|
+
audioQuality('main', []),
|
|
95
|
+
videoQuality(),
|
|
96
|
+
]));
|
|
97
|
+
expect(filtered.periods[0].qualities.some((q) => q.metadata.contentType === 'video')).toBeTrue();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlTextTrackRenderer.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/text/HtmlTextTrackRenderer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { computeCueLayout, renderCueText, HtmlTextTrackRenderer, } from '@amazon/vinyl';
|
|
6
|
+
describe('computeCueLayout', () => {
|
|
7
|
+
it('flows a cue with no line/position (defaults: center, full width)', () => {
|
|
8
|
+
expect(computeCueLayout({})).toEqual({
|
|
9
|
+
textAlign: 'center',
|
|
10
|
+
maxWidth: '100%',
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
it('maps align and size', () => {
|
|
14
|
+
const layout = computeCueLayout({ align: 'start', size: 80 });
|
|
15
|
+
expect(layout.textAlign).toBe('start');
|
|
16
|
+
expect(layout.maxWidth).toBe('80%');
|
|
17
|
+
});
|
|
18
|
+
it('maps vertical writing modes', () => {
|
|
19
|
+
expect(computeCueLayout({ vertical: 'rl' }).writingMode).toBe('vertical-rl');
|
|
20
|
+
expect(computeCueLayout({ vertical: 'lr' }).writingMode).toBe('vertical-lr');
|
|
21
|
+
});
|
|
22
|
+
it('centers horizontally and bottom-anchors when only a line is set', () => {
|
|
23
|
+
// line 40% (snapToLines false), default lineAlign → top:40%.
|
|
24
|
+
const layout = computeCueLayout({ line: 40, snapToLines: false });
|
|
25
|
+
expect(layout.position).toBe('absolute');
|
|
26
|
+
expect(layout.left).toBe('50%');
|
|
27
|
+
expect(layout.top).toBe('40%');
|
|
28
|
+
expect(layout.transform).toBe('translateX(-50%)');
|
|
29
|
+
});
|
|
30
|
+
it('percentage line honors lineAlign end and center', () => {
|
|
31
|
+
expect(computeCueLayout({ line: 20, snapToLines: false, lineAlign: 'end' })
|
|
32
|
+
.bottom).toBe('80%');
|
|
33
|
+
const center = computeCueLayout({
|
|
34
|
+
line: 30,
|
|
35
|
+
snapToLines: false,
|
|
36
|
+
lineAlign: 'center',
|
|
37
|
+
});
|
|
38
|
+
expect(center.top).toBe('30%');
|
|
39
|
+
expect(center.transform).toContain('translateY(-50%)');
|
|
40
|
+
});
|
|
41
|
+
it('snap-to-lines integer line: negative counts up from the bottom', () => {
|
|
42
|
+
expect(computeCueLayout({ line: -3, snapToLines: true }).bottom).toBe('3em');
|
|
43
|
+
expect(computeCueLayout({ line: 2, snapToLines: true }).top).toBe('3em');
|
|
44
|
+
});
|
|
45
|
+
it('positions horizontally by positionAlign', () => {
|
|
46
|
+
expect(computeCueLayout({ position: 20, positionAlign: 'line-left' }).left).toBe('20%');
|
|
47
|
+
expect(computeCueLayout({ position: 20, positionAlign: 'line-right' })
|
|
48
|
+
.right).toBe('80%');
|
|
49
|
+
const center = computeCueLayout({
|
|
50
|
+
position: 30,
|
|
51
|
+
positionAlign: 'center',
|
|
52
|
+
});
|
|
53
|
+
expect(center.left).toBe('30%');
|
|
54
|
+
expect(center.transform).toBe('translateX(-50%)');
|
|
55
|
+
});
|
|
56
|
+
it('a position without a line bottom-anchors', () => {
|
|
57
|
+
expect(computeCueLayout({ position: 10 }).bottom).toBe('0');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('renderCueText', () => {
|
|
61
|
+
it('escapes plain text and turns newlines into <br>', () => {
|
|
62
|
+
expect(renderCueText('a & b\nc')).toBe('a & b<br>c');
|
|
63
|
+
});
|
|
64
|
+
it('escapes a stray < that is not a tag', () => {
|
|
65
|
+
expect(renderCueText('a < b')).toBe('a < b');
|
|
66
|
+
});
|
|
67
|
+
it('converts <c.class> to a styled span', () => {
|
|
68
|
+
expect(renderCueText('<c.styledotitalic>hi</c>')).toBe('<span class="styledotitalic">hi</span>');
|
|
69
|
+
});
|
|
70
|
+
it('joins multiple cue classes', () => {
|
|
71
|
+
expect(renderCueText('<c.a.b>x</c>')).toBe('<span class="a b">x</span>');
|
|
72
|
+
});
|
|
73
|
+
it('passes through i/b/u tags', () => {
|
|
74
|
+
expect(renderCueText('<i>x</i><b>y</b><u>z</u>')).toBe('<i>x</i><b>y</b><u>z</u>');
|
|
75
|
+
});
|
|
76
|
+
it('maps voice and lang tags to spans with attributes', () => {
|
|
77
|
+
expect(renderCueText('<v Bob>hi</v>')).toBe('<span title="Bob">hi</span>');
|
|
78
|
+
expect(renderCueText('<lang en>x</lang>')).toBe('<span lang="en">x</span>');
|
|
79
|
+
});
|
|
80
|
+
it('renders voice/lang without an annotation as a bare span', () => {
|
|
81
|
+
expect(renderCueText('<v>hi</v>')).toBe('<span>hi</span>');
|
|
82
|
+
expect(renderCueText('<lang>x</lang>')).toBe('<span>x</span>');
|
|
83
|
+
});
|
|
84
|
+
it('escapes annotation values', () => {
|
|
85
|
+
expect(renderCueText('<v a"b>x</v>')).toBe('<span title="a"b">x</span>');
|
|
86
|
+
});
|
|
87
|
+
it('drops timestamp tags and unknown tags', () => {
|
|
88
|
+
expect(renderCueText('<00:00:01.000>a')).toBe('a');
|
|
89
|
+
expect(renderCueText('<xyz>a</xyz>')).toBe('a');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('HtmlTextTrackRenderer', () => {
|
|
93
|
+
function fakeElement() {
|
|
94
|
+
return {
|
|
95
|
+
style: {},
|
|
96
|
+
className: '',
|
|
97
|
+
innerHTML: '',
|
|
98
|
+
textContent: '',
|
|
99
|
+
children: [],
|
|
100
|
+
appendChild(node) {
|
|
101
|
+
this.children.push(node);
|
|
102
|
+
},
|
|
103
|
+
replaceChildren(...nodes) {
|
|
104
|
+
this.children = nodes;
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// Reads children as an array so it works with both the Node fake (a plain
|
|
109
|
+
// array) and a real browser (a live HTMLCollection).
|
|
110
|
+
function domChildren() {
|
|
111
|
+
return Array.from(container.children);
|
|
112
|
+
}
|
|
113
|
+
/** The rendered cue boxes (excluding the internal <style> element). */
|
|
114
|
+
function cueBoxes() {
|
|
115
|
+
return domChildren().filter((c) => c.className === 'vinyl-text-cue');
|
|
116
|
+
}
|
|
117
|
+
/** The internal <style> element (always the first child). */
|
|
118
|
+
function styleElement() {
|
|
119
|
+
return domChildren()[0];
|
|
120
|
+
}
|
|
121
|
+
class FakeTextTrack {
|
|
122
|
+
activeCues = [];
|
|
123
|
+
listeners = new Map();
|
|
124
|
+
addEventListener = jasmine
|
|
125
|
+
.createSpy('addEventListener')
|
|
126
|
+
.and.callFake((type, fn) => this.listeners.set(type, fn));
|
|
127
|
+
removeEventListener = jasmine
|
|
128
|
+
.createSpy('removeEventListener')
|
|
129
|
+
.and.callFake((type) => this.listeners.delete(type));
|
|
130
|
+
fireCueChange() {
|
|
131
|
+
this.listeners.get('cuechange')?.();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function cue(text, geometry = {}) {
|
|
135
|
+
return { text, ...geometry };
|
|
136
|
+
}
|
|
137
|
+
let view;
|
|
138
|
+
let container;
|
|
139
|
+
// In Node there is no DOM, so stub `document`; in a real browser (the integ
|
|
140
|
+
// bundle) `document` is a read-only global — use it as-is and only fake when
|
|
141
|
+
// absent.
|
|
142
|
+
let stubbedDocument = false;
|
|
143
|
+
beforeEach(() => {
|
|
144
|
+
if (typeof document === 'undefined') {
|
|
145
|
+
;
|
|
146
|
+
globalThis.document = {
|
|
147
|
+
createElement: () => fakeElement(),
|
|
148
|
+
};
|
|
149
|
+
stubbedDocument = true;
|
|
150
|
+
}
|
|
151
|
+
view = new HtmlTextTrackRenderer();
|
|
152
|
+
container = view.element;
|
|
153
|
+
});
|
|
154
|
+
afterEach(() => {
|
|
155
|
+
view.dispose();
|
|
156
|
+
if (stubbedDocument) {
|
|
157
|
+
delete globalThis.document;
|
|
158
|
+
stubbedDocument = false;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
it('creates a positioned overlay container', () => {
|
|
162
|
+
expect(container.className).toBe('vinyl-text-container');
|
|
163
|
+
expect(container.style.justifyContent).toBe('flex-end');
|
|
164
|
+
expect(container.style.pointerEvents).toBe('none');
|
|
165
|
+
});
|
|
166
|
+
it('renders the active cues, escaping text and applying layout', () => {
|
|
167
|
+
const track = new FakeTextTrack();
|
|
168
|
+
track.activeCues = [cue('hi\nthere', { align: 'start' })];
|
|
169
|
+
view.setTextTrack(track);
|
|
170
|
+
expect(track.addEventListener).toHaveBeenCalledWith('cuechange', jasmine.any(Function));
|
|
171
|
+
const boxes = cueBoxes();
|
|
172
|
+
expect(boxes.length).toBe(1);
|
|
173
|
+
expect(boxes[0].innerHTML).toBe('hi<br>there');
|
|
174
|
+
expect(boxes[0].style.textAlign).toBe('start');
|
|
175
|
+
});
|
|
176
|
+
it('re-renders on cuechange', () => {
|
|
177
|
+
const track = new FakeTextTrack();
|
|
178
|
+
track.activeCues = [];
|
|
179
|
+
view.setTextTrack(track);
|
|
180
|
+
expect(cueBoxes().length).toBe(0);
|
|
181
|
+
track.activeCues = [cue('now showing')];
|
|
182
|
+
track.fireCueChange();
|
|
183
|
+
expect(cueBoxes().length).toBe(1);
|
|
184
|
+
});
|
|
185
|
+
it('renders an empty box for a cue with no text', () => {
|
|
186
|
+
const track = new FakeTextTrack();
|
|
187
|
+
track.activeCues = [{ align: 'center' }]; // no `text`
|
|
188
|
+
view.setTextTrack(track);
|
|
189
|
+
expect(cueBoxes()[0].innerHTML).toBe('');
|
|
190
|
+
});
|
|
191
|
+
it('handles a track with null activeCues', () => {
|
|
192
|
+
const track = new FakeTextTrack();
|
|
193
|
+
track.activeCues = null;
|
|
194
|
+
view.setTextTrack(track);
|
|
195
|
+
expect(cueBoxes().length).toBe(0);
|
|
196
|
+
});
|
|
197
|
+
it('is a no-op when set to the same track', () => {
|
|
198
|
+
const track = new FakeTextTrack();
|
|
199
|
+
view.setTextTrack(track);
|
|
200
|
+
view.setTextTrack(track);
|
|
201
|
+
expect(track.addEventListener).toHaveBeenCalledTimes(1);
|
|
202
|
+
});
|
|
203
|
+
it('detaches and clears when set to null', () => {
|
|
204
|
+
const track = new FakeTextTrack();
|
|
205
|
+
track.activeCues = [cue('bye')];
|
|
206
|
+
view.setTextTrack(track);
|
|
207
|
+
view.setTextTrack(null);
|
|
208
|
+
expect(track.removeEventListener).toHaveBeenCalledWith('cuechange', jasmine.any(Function));
|
|
209
|
+
expect(cueBoxes().length).toBe(0);
|
|
210
|
+
});
|
|
211
|
+
it('injects authored STYLE rules with ::cue selectors rewritten', () => {
|
|
212
|
+
view.setStyles([
|
|
213
|
+
'::cue(.loud) { font-weight: bold }\n::cue { color: red }',
|
|
214
|
+
]);
|
|
215
|
+
const style = styleElement();
|
|
216
|
+
expect(style.textContent).toBe('.vinyl-text-cue .loud { font-weight: bold }\n.vinyl-text-cue { color: red }');
|
|
217
|
+
});
|
|
218
|
+
it('clears authored styles when the track changes', () => {
|
|
219
|
+
view.setStyles(['::cue { color: red }']);
|
|
220
|
+
const style = styleElement();
|
|
221
|
+
expect(style.textContent).not.toBe('');
|
|
222
|
+
view.setTextTrack(new FakeTextTrack());
|
|
223
|
+
expect(style.textContent).toBe('');
|
|
224
|
+
});
|
|
225
|
+
it('dispose detaches the current track', () => {
|
|
226
|
+
const track = new FakeTextTrack();
|
|
227
|
+
view.setTextTrack(track);
|
|
228
|
+
view.dispose();
|
|
229
|
+
expect(track.removeEventListener).toHaveBeenCalled();
|
|
230
|
+
});
|
|
231
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidecarTextTrackController.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/text/SidecarTextTrackController.test.ts"],"names":[],"mappings":""}
|