@gcorevideo/player 2.19.15 → 2.20.3
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/assets/level-selector/list.ejs +1 -1
- package/dist/core.js +2 -2
- package/dist/index.css +966 -966
- package/dist/index.js +884 -627
- package/dist/player.d.ts +536 -122
- package/dist/plugins/index.css +1160 -1160
- package/dist/plugins/index.js +2006 -1725
- package/docs/api/player.audioselector.md +1 -251
- package/docs/api/player.bigmutebutton.md +1 -156
- package/docs/api/player.clapprnerdstats.md +12 -259
- package/docs/api/player.clapprstats.exportmetrics.md +4 -0
- package/docs/api/player.clapprstats.md +7 -223
- package/docs/api/player.clapprstats.setupdatemetrics.md +2 -0
- package/docs/api/player.clicktopause.md +5 -113
- package/docs/api/player.clipsplugin.gettext.md +9 -0
- package/docs/api/player.clipsplugin.md +10 -94
- package/docs/api/{player.playbackrate.setselectedrate.md → player.clipspluginsettings.md} +18 -10
- package/docs/api/player.clipspluginsettings.text.md +13 -0
- package/docs/api/player.contextmenu._constructor_.md +6 -3
- package/docs/api/player.contextmenu.md +13 -256
- package/docs/api/player.contextmenupluginsettings.label.md +11 -0
- package/docs/api/player.contextmenupluginsettings.md +93 -0
- package/docs/api/player.contextmenupluginsettings.preventshowcontextmenu.md +11 -0
- package/docs/api/player.contextmenupluginsettings.url.md +11 -0
- package/docs/api/player.dvrcontrols.md +5 -1
- package/docs/api/player.errorscreen.attributes.md +3 -0
- package/docs/api/player.errorscreen.bindevents.md +3 -0
- package/docs/api/player.errorscreen.container.md +3 -0
- package/docs/api/player.errorscreen.hide.md +3 -0
- package/docs/api/player.errorscreen.md +25 -0
- package/docs/api/player.errorscreen.name.md +3 -0
- package/docs/api/player.errorscreen.render.md +3 -0
- package/docs/api/player.errorscreen.show.md +3 -0
- package/docs/api/player.errorscreen.supportedversion.md +3 -0
- package/docs/api/player.errorscreen.template.md +3 -0
- package/docs/api/player.errorscreen.unbindevents.md +3 -0
- package/docs/api/player.favicon._constructor_.md +3 -0
- package/docs/api/player.favicon.bindevents.md +3 -0
- package/docs/api/player.favicon.configure.md +3 -0
- package/docs/api/player.favicon.destroy.md +3 -0
- package/docs/api/player.favicon.disable.md +3 -0
- package/docs/api/player.favicon.md +18 -1
- package/docs/api/player.favicon.name.md +3 -0
- package/docs/api/player.favicon.supportedversion.md +3 -0
- package/docs/api/player.gearevents.md +4 -1
- package/docs/api/player.googleanalytics._constructor_.md +3 -0
- package/docs/api/player.googleanalytics.addeventlisteners.md +3 -0
- package/docs/api/player.googleanalytics.embedscript.md +3 -0
- package/docs/api/player.googleanalytics.md +42 -1
- package/docs/api/player.googleanalytics.name.md +3 -0
- package/docs/api/player.googleanalytics.onbufferfull.md +3 -0
- package/docs/api/player.googleanalytics.onbuffering.md +3 -0
- package/docs/api/player.googleanalytics.ondvr.md +3 -0
- package/docs/api/player.googleanalytics.onended.md +3 -0
- package/docs/api/player.googleanalytics.onerror.md +3 -0
- package/docs/api/player.googleanalytics.onfullscreen.md +3 -0
- package/docs/api/player.googleanalytics.onhd.md +3 -0
- package/docs/api/player.googleanalytics.onpause.md +3 -0
- package/docs/api/player.googleanalytics.onplay.md +3 -0
- package/docs/api/player.googleanalytics.onready.md +3 -0
- package/docs/api/player.googleanalytics.onseek.md +3 -0
- package/docs/api/player.googleanalytics.onstop.md +3 -0
- package/docs/api/player.googleanalytics.onvolumechanged.md +3 -0
- package/docs/api/player.googleanalytics.push.md +3 -0
- package/docs/api/player.googleanalytics.supportedversion.md +3 -0
- package/docs/api/{player.clapprstats.name.md → player.initeventdata.event.md} +3 -3
- package/docs/api/player.initeventdata.md +60 -0
- package/docs/api/player.logo._constructor_.md +3 -0
- package/docs/api/player.logo.attributes.md +3 -0
- package/docs/api/player.logo.bindevents.md +3 -0
- package/docs/api/player.logo.md +20 -1
- package/docs/api/player.logo.name.md +3 -0
- package/docs/api/player.logo.render.md +3 -0
- package/docs/api/player.logo.stoplistening.md +3 -0
- package/docs/api/player.logo.supportedversion.md +3 -0
- package/docs/api/player.logo.template.md +3 -0
- package/docs/api/player.md +149 -18
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/player.multicamera.md +2 -0
- package/docs/api/player.pictureinpicture.md +9 -197
- package/docs/api/player.playbackrate.md +10 -314
- package/docs/api/player.seektime.attributes.md +3 -0
- package/docs/api/player.seektime.bindevents.md +3 -0
- package/docs/api/player.seektime.durationshown.md +3 -0
- package/docs/api/player.seektime.getseektime.md +3 -0
- package/docs/api/player.seektime.islivestreamwithdvr.md +3 -0
- package/docs/api/player.seektime.md +31 -0
- package/docs/api/player.seektime.mediacontrol.md +3 -0
- package/docs/api/player.seektime.mediacontrolcontainer.md +3 -0
- package/docs/api/player.seektime.name.md +3 -0
- package/docs/api/player.seektime.render.md +3 -0
- package/docs/api/player.seektime.shouldbevisible.md +3 -0
- package/docs/api/player.seektime.supportedversion.md +3 -0
- package/docs/api/player.seektime.template.md +3 -0
- package/docs/api/player.seektime.update.md +3 -0
- package/docs/api/player.share.md +2 -0
- package/docs/api/player.skiptime.md +2 -0
- package/docs/api/{player.clapprstats.destroy.md → player.stalleventdata.count.md} +5 -7
- package/docs/api/{player.bigmutebutton.template.md → player.stalleventdata.event.md} +3 -3
- package/docs/api/player.stalleventdata.md +117 -0
- package/docs/api/{player.audioselector.onshowlevelselectmenu.md → player.stalleventdata.time.md} +5 -7
- package/docs/api/{player.clapprstats.starttimers.md → player.stalleventdata.total_ms.md} +5 -7
- package/docs/api/{player.audioselector.template.md → player.starteventdata.event.md} +3 -3
- package/docs/api/player.starteventdata.md +60 -0
- package/docs/api/{player.clapprstats._defaultreport.md → player.telemetry._constructor_.md} +7 -9
- package/docs/api/player.telemetry.md +146 -0
- package/docs/api/{player.clapprnerdstats.name.md → player.telemetry.name.md} +4 -2
- package/docs/api/{player.clapprstats.supportedversion.md → player.telemetry.supportedversion.md} +4 -2
- package/docs/api/player.telemetryevent.md +100 -0
- package/docs/api/player.telemetryeventdata.md +18 -0
- package/docs/api/player.telemetrypluginsettings.md +60 -0
- package/docs/api/{player.audioselector.bindevents.md → player.telemetrypluginsettings.send.md} +5 -7
- package/docs/api/{player.audioselector.reload.md → player.telemetryrecord.md} +8 -6
- package/docs/api/player.thumbnails.md +21 -139
- package/docs/api/player.thumbnailspluginsettings.md +23 -0
- package/docs/api/player.volumefade.md +1 -93
- package/docs/api/{player.audioselector.name.md → player.watcheventdata.event.md} +3 -3
- package/docs/api/player.watcheventdata.md +60 -0
- package/lib/index.plugins.d.ts +2 -3
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +2 -3
- package/lib/playback/hls-playback/HlsPlayback.js +1 -1
- package/lib/plugins/audio-selector/AudioSelector.d.ts +28 -6
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +52 -22
- package/lib/plugins/big-mute-button/BigMuteButton.d.ts +18 -2
- package/lib/plugins/big-mute-button/BigMuteButton.d.ts.map +1 -1
- package/lib/plugins/big-mute-button/BigMuteButton.js +21 -16
- package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +1 -0
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +38 -5
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts.map +1 -1
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +63 -17
- package/lib/plugins/clappr-stats/ClapprStats.d.ts +31 -8
- package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
- package/lib/plugins/clappr-stats/ClapprStats.js +24 -0
- package/lib/plugins/clappr-stats/types.d.ts +12 -0
- package/lib/plugins/clappr-stats/types.d.ts.map +1 -1
- package/lib/plugins/clappr-stats/types.js +3 -0
- package/lib/plugins/click-to-pause/ClickToPause.d.ts +13 -1
- package/lib/plugins/click-to-pause/ClickToPause.d.ts.map +1 -1
- package/lib/plugins/click-to-pause/ClickToPause.js +14 -4
- package/lib/plugins/clips/Clips.d.ts +34 -2
- package/lib/plugins/clips/Clips.d.ts.map +1 -1
- package/lib/plugins/clips/Clips.js +51 -22
- package/lib/plugins/context-menu/ContextMenu.d.ts +40 -13
- package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/plugins/context-menu/ContextMenu.js +48 -36
- package/lib/plugins/dvr-controls/DvrControls.d.ts +5 -4
- package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
- package/lib/plugins/dvr-controls/DvrControls.js +15 -29
- package/lib/plugins/error-screen/ErrorScreen.d.ts +4 -0
- package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -1
- package/lib/plugins/error-screen/ErrorScreen.js +4 -0
- package/lib/plugins/favicon/Favicon.d.ts +4 -0
- package/lib/plugins/favicon/Favicon.d.ts.map +1 -1
- package/lib/plugins/favicon/Favicon.js +4 -0
- package/lib/plugins/google-analytics/GoogleAnalytics.d.ts +4 -0
- package/lib/plugins/google-analytics/GoogleAnalytics.d.ts.map +1 -1
- package/lib/plugins/google-analytics/GoogleAnalytics.js +5 -1
- package/lib/plugins/index.d.ts +2 -4
- package/lib/plugins/index.d.ts.map +1 -1
- package/lib/plugins/index.js +2 -4
- package/lib/plugins/logo/Logo.d.ts +4 -0
- package/lib/plugins/logo/Logo.d.ts.map +1 -1
- package/lib/plugins/logo/Logo.js +4 -0
- package/lib/plugins/media-control/MediaControl.d.ts +1 -1
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +3 -1
- package/lib/plugins/multi-camera/MultiCamera.d.ts +3 -0
- package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
- package/lib/plugins/multi-camera/MultiCamera.js +3 -0
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +32 -4
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +30 -2
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +47 -14
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +38 -9
- package/lib/plugins/seek-time/SeekTime.d.ts +4 -0
- package/lib/plugins/seek-time/SeekTime.d.ts.map +1 -1
- package/lib/plugins/seek-time/SeekTime.js +5 -1
- package/lib/plugins/share/Share.d.ts +3 -0
- package/lib/plugins/share/Share.d.ts.map +1 -1
- package/lib/plugins/share/Share.js +3 -0
- package/lib/plugins/skip-time/SkipTime.d.ts +3 -0
- package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -1
- package/lib/plugins/skip-time/SkipTime.js +3 -0
- package/lib/plugins/statistics/Statistics.d.ts +38 -3
- package/lib/plugins/statistics/Statistics.d.ts.map +1 -1
- package/lib/plugins/statistics/Statistics.js +51 -9
- package/lib/plugins/telemetry/Telemetry.d.ts +153 -0
- package/lib/plugins/telemetry/Telemetry.d.ts.map +1 -0
- package/lib/plugins/telemetry/Telemetry.js +181 -0
- package/lib/plugins/thumbnails/Thumbnails.d.ts +48 -3
- package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -1
- package/lib/plugins/thumbnails/Thumbnails.js +52 -18
- package/lib/plugins/volume-fade/VolumeFade.d.ts +8 -1
- package/lib/plugins/volume-fade/VolumeFade.d.ts.map +1 -1
- package/lib/plugins/volume-fade/VolumeFade.js +9 -1
- package/package.json +1 -1
- package/src/index.plugins.ts +2 -3
- package/src/playback/hls-playback/HlsPlayback.ts +1 -1
- package/src/plugins/audio-selector/AudioSelector.ts +227 -154
- package/src/plugins/big-mute-button/BigMuteButton.ts +100 -79
- package/src/plugins/bottom-gear/BottomGear.ts +1 -0
- package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +240 -173
- package/src/plugins/clappr-stats/ClapprStats.ts +32 -8
- package/src/plugins/clappr-stats/types.ts +13 -0
- package/src/plugins/click-to-pause/ClickToPause.ts +47 -36
- package/src/plugins/clips/Clips.ts +127 -71
- package/src/plugins/context-menu/ContextMenu.ts +105 -76
- package/src/plugins/dvr-controls/DvrControls.ts +15 -31
- package/src/plugins/error-screen/ErrorScreen.ts +4 -0
- package/src/plugins/favicon/Favicon.ts +4 -0
- package/src/plugins/google-analytics/GoogleAnalytics.ts +5 -1
- package/src/plugins/index.ts +2 -4
- package/src/plugins/level-selector/__tests__/LevelSelector.test.ts +47 -26
- package/src/plugins/level-selector/__tests__/__snapshots__/LevelSelector.test.ts.snap +18 -18
- package/src/plugins/logo/Logo.ts +4 -0
- package/src/plugins/media-control/MediaControl.ts +4 -1
- package/src/plugins/multi-camera/MultiCamera.ts +3 -0
- package/src/plugins/picture-in-picture/PictureInPicture.ts +35 -7
- package/src/plugins/playback-rate/PlaybackRate.ts +53 -24
- package/src/plugins/seek-time/SeekTime.ts +5 -1
- package/src/plugins/share/Share.ts +3 -0
- package/src/plugins/skip-time/SkipTime.ts +3 -0
- package/src/plugins/telemetry/Telemetry.ts +317 -0
- package/src/plugins/thumbnails/Thumbnails.ts +268 -194
- package/src/plugins/volume-fade/VolumeFade.ts +10 -2
- package/temp/player.api.json +2457 -5257
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.audioselector.attributes.md +0 -17
- package/docs/api/player.audioselector.events.md +0 -17
- package/docs/api/player.audioselector.hideselecttrackmenu.md +0 -18
- package/docs/api/player.audioselector.render.md +0 -18
- package/docs/api/player.audioselector.supportedversion.md +0 -16
- package/docs/api/player.audioselector.togglecontextmenu.md +0 -18
- package/docs/api/player.audioselector.unbindevents.md +0 -18
- package/docs/api/player.audioselector.version.md +0 -14
- package/docs/api/player.bigmutebutton.bindevents.md +0 -18
- package/docs/api/player.bigmutebutton.events.md +0 -17
- package/docs/api/player.bigmutebutton.name.md +0 -14
- package/docs/api/player.bigmutebutton.render.md +0 -18
- package/docs/api/player.bigmutebutton.supportedversion.md +0 -16
- package/docs/api/player.clapprnerdstats.attributes.md +0 -17
- package/docs/api/player.clapprnerdstats.bindevents.md +0 -18
- package/docs/api/player.clapprnerdstats.events.md +0 -18
- package/docs/api/player.clapprnerdstats.playerheight.md +0 -14
- package/docs/api/player.clapprnerdstats.playerwidth.md +0 -14
- package/docs/api/player.clapprnerdstats.render.md +0 -18
- package/docs/api/player.clapprnerdstats.statsboxelem.md +0 -14
- package/docs/api/player.clapprnerdstats.statsboxwidththreshold.md +0 -14
- package/docs/api/player.clapprnerdstats.supportedversion.md +0 -16
- package/docs/api/player.clapprnerdstats.template.md +0 -14
- package/docs/api/player.clapprstats._buildreport.md +0 -18
- package/docs/api/player.clapprstats._playbackname.md +0 -14
- package/docs/api/player.clapprstats._playbacktype.md +0 -14
- package/docs/api/player.clapprstats.bindevents.md +0 -18
- package/docs/api/player.clapprstats.onfirstplaying.md +0 -18
- package/docs/api/player.clapprstats.playafterpause.md +0 -18
- package/docs/api/player.clapprstats.stopreporting.md +0 -18
- package/docs/api/player.clicktopause.bindevents.md +0 -15
- package/docs/api/player.clicktopause.config.md +0 -11
- package/docs/api/player.clicktopause.name.md +0 -11
- package/docs/api/player.clicktopause.supportedversion.md +0 -13
- package/docs/api/player.clipsplugin.attributes.md +0 -13
- package/docs/api/player.clipsplugin.bindevents.md +0 -15
- package/docs/api/player.clipsplugin.makesvg.md +0 -49
- package/docs/api/player.clipsplugin.name.md +0 -11
- package/docs/api/player.clipsplugin.unbindevents.md +0 -15
- package/docs/api/player.contextmenu.attributes.md +0 -13
- package/docs/api/player.contextmenu.bindevents.md +0 -15
- package/docs/api/player.contextmenu.destroy.md +0 -15
- package/docs/api/player.contextmenu.events.md +0 -13
- package/docs/api/player.contextmenu.exposeversion.md +0 -14
- package/docs/api/player.contextmenu.label.md +0 -11
- package/docs/api/player.contextmenu.mediacontrol.md +0 -11
- package/docs/api/player.contextmenu.name.md +0 -11
- package/docs/api/player.contextmenu.render.md +0 -15
- package/docs/api/player.contextmenu.supportedversion.md +0 -13
- package/docs/api/player.contextmenu.template.md +0 -11
- package/docs/api/player.contextmenu.url.md +0 -11
- package/docs/api/player.disablecontrols.bindevents.md +0 -15
- package/docs/api/player.disablecontrols.container.md +0 -11
- package/docs/api/player.disablecontrols.md +0 -138
- package/docs/api/player.disablecontrols.name.md +0 -11
- package/docs/api/player.disablecontrols.supportedversion.md +0 -13
- package/docs/api/player.disablecontrols.unbindevents.md +0 -15
- package/docs/api/player.pictureinpicture.bindevents.md +0 -15
- package/docs/api/player.pictureinpicture.events.md +0 -13
- package/docs/api/player.pictureinpicture.exitpictureinpicture.md +0 -15
- package/docs/api/player.pictureinpicture.name.md +0 -11
- package/docs/api/player.pictureinpicture.render.md +0 -15
- package/docs/api/player.pictureinpicture.requestpictureinpicture.md +0 -15
- package/docs/api/player.pictureinpicture.supportedversion.md +0 -13
- package/docs/api/player.pictureinpicture.togglepictureinpicture.md +0 -15
- package/docs/api/player.pictureinpicture.version.md +0 -11
- package/docs/api/player.pictureinpicture.videoelement.md +0 -11
- package/docs/api/player.playbackrate.attributes.md +0 -14
- package/docs/api/player.playbackrate.bindevents.md +0 -15
- package/docs/api/player.playbackrate.events.md +0 -15
- package/docs/api/player.playbackrate.gettitle.md +0 -15
- package/docs/api/player.playbackrate.goback.md +0 -15
- package/docs/api/player.playbackrate.highlightcurrentrate.md +0 -15
- package/docs/api/player.playbackrate.name.md +0 -11
- package/docs/api/player.playbackrate.onfinishad.md +0 -15
- package/docs/api/player.playbackrate.onplay.md +0 -15
- package/docs/api/player.playbackrate.onrateselect.md +0 -49
- package/docs/api/player.playbackrate.onshowmenu.md +0 -15
- package/docs/api/player.playbackrate.onstartad.md +0 -15
- package/docs/api/player.playbackrate.onstop.md +0 -15
- package/docs/api/player.playbackrate.reload.md +0 -15
- package/docs/api/player.playbackrate.render.md +0 -15
- package/docs/api/player.playbackrate.supportedversion.md +0 -13
- package/docs/api/player.playbackrate.template.md +0 -11
- package/docs/api/player.playbackrate.unbindevents.md +0 -15
- package/docs/api/player.playbackrate.updateplaybackrate.md +0 -49
- package/docs/api/player.pluginsettings.md +0 -13
- package/docs/api/player.statistics._constructor_.md +0 -47
- package/docs/api/player.statistics.bindevents.md +0 -15
- package/docs/api/player.statistics.md +0 -141
- package/docs/api/player.statistics.name.md +0 -11
- package/docs/api/player.statistics.supportedversion.md +0 -13
- package/docs/api/player.thumbnails.attributes.md +0 -13
- package/docs/api/player.thumbnails.bindevents.md +0 -15
- package/docs/api/player.thumbnails.name.md +0 -11
- package/docs/api/player.thumbnails.settext.md +0 -49
- package/docs/api/player.thumbnails.supportedversion.md +0 -13
- package/docs/api/player.thumbnails.template.md +0 -11
- package/docs/api/player.volumefade.bindevents.md +0 -18
- package/docs/api/player.volumefade.name.md +0 -14
- package/docs/api/player.volumefade.unbindevents.md +0 -18
- package/src/plugins/disable-controls/DisableControls.ts +0 -81
- package/src/plugins/ga-events/GaEvents.js +0 -395
- package/src/plugins/ga-events/ga-tracking.js +0 -46
- package/src/plugins/statistics/Statistics.ts +0 -207
- /package/src/plugins/{statistics → telemetry}/Statistics copy.xts +0 -0
|
@@ -1,134 +1,163 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import {
|
|
2
|
+
UICorePlugin,
|
|
3
|
+
Events,
|
|
4
|
+
template,
|
|
5
|
+
$,
|
|
6
|
+
Core,
|
|
7
|
+
Container,
|
|
8
|
+
UIContainerPlugin,
|
|
9
|
+
} from '@clappr/core'
|
|
10
|
+
|
|
11
|
+
import { CLAPPR_VERSION } from '../../build.js'
|
|
12
|
+
|
|
13
|
+
import '../../../assets/context-menu/context_menu.scss'
|
|
14
|
+
import templateHtml from '../../../assets/context-menu/context_menu.ejs'
|
|
15
|
+
import { version } from '../../version.js'
|
|
7
16
|
|
|
8
17
|
type MenuOption = {
|
|
9
|
-
label: string
|
|
10
|
-
name: string
|
|
18
|
+
label: string
|
|
19
|
+
name: string
|
|
11
20
|
}
|
|
12
21
|
|
|
13
|
-
export
|
|
14
|
-
|
|
22
|
+
export interface ContextMenuPluginSettings {
|
|
23
|
+
label?: string
|
|
24
|
+
url?: string
|
|
25
|
+
preventShowContextMenu?: boolean
|
|
26
|
+
}
|
|
15
27
|
|
|
16
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Displays a small context menu when clicked on the player container.
|
|
30
|
+
* @beta
|
|
31
|
+
* @remarks
|
|
32
|
+
* Configuration options - {@link ContextMenuPluginSettings}
|
|
33
|
+
*/
|
|
34
|
+
export class ContextMenu extends UIContainerPlugin {
|
|
35
|
+
private _label: string = ''
|
|
17
36
|
|
|
18
|
-
private
|
|
37
|
+
private _url: string = ''
|
|
19
38
|
|
|
20
|
-
private menuOptions: MenuOption[] = []
|
|
39
|
+
private menuOptions: MenuOption[] = []
|
|
21
40
|
|
|
41
|
+
/**
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
22
44
|
get name() {
|
|
23
|
-
return 'context_menu'
|
|
45
|
+
return 'context_menu'
|
|
24
46
|
}
|
|
25
47
|
|
|
48
|
+
/**
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
26
51
|
get supportedVersion() {
|
|
27
|
-
return { min: CLAPPR_VERSION }
|
|
52
|
+
return { min: CLAPPR_VERSION }
|
|
28
53
|
}
|
|
29
54
|
|
|
55
|
+
/**
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
30
58
|
override get attributes() {
|
|
31
|
-
return {
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get mediaControl() {
|
|
35
|
-
return this.core.mediaControl;
|
|
59
|
+
return { class: 'context-menu' }
|
|
36
60
|
}
|
|
37
61
|
|
|
38
|
-
|
|
39
|
-
return template(templateHtml);
|
|
40
|
-
}
|
|
62
|
+
private static readonly template = template(templateHtml)
|
|
41
63
|
|
|
42
|
-
get label() {
|
|
43
|
-
return this._label || 'Gcore player ver. ' +
|
|
64
|
+
private get label() {
|
|
65
|
+
return this._label || 'Gcore player ver. ' + version().gplayer
|
|
44
66
|
}
|
|
45
67
|
|
|
46
|
-
get url() {
|
|
47
|
-
return this._url || 'https://gcore.com/'
|
|
68
|
+
private get url() {
|
|
69
|
+
return this._url || 'https://gcore.com/'
|
|
48
70
|
}
|
|
49
71
|
|
|
50
|
-
get exposeVersion() {
|
|
72
|
+
private get exposeVersion() {
|
|
51
73
|
return {
|
|
52
74
|
label: this.label,
|
|
53
|
-
name: 'version'
|
|
54
|
-
}
|
|
75
|
+
name: 'version',
|
|
76
|
+
}
|
|
55
77
|
}
|
|
56
78
|
|
|
79
|
+
/**
|
|
80
|
+
* @internal
|
|
81
|
+
*/
|
|
57
82
|
override get events() {
|
|
58
83
|
return {
|
|
59
|
-
'click [data-version]': 'onOpenMainPage'
|
|
60
|
-
}
|
|
84
|
+
'click [data-version]': 'onOpenMainPage',
|
|
85
|
+
}
|
|
61
86
|
}
|
|
62
87
|
|
|
63
|
-
constructor(
|
|
64
|
-
super(
|
|
88
|
+
constructor(container: Container) {
|
|
89
|
+
super(container)
|
|
65
90
|
if (this.options.contextMenu && this.options.contextMenu.label) {
|
|
66
|
-
this._label = this.options.contextMenu.label
|
|
91
|
+
this._label = this.options.contextMenu.label
|
|
67
92
|
}
|
|
68
93
|
if (this.options.contextMenu && this.options.contextMenu.url) {
|
|
69
|
-
this._url = this.options.contextMenu.url
|
|
94
|
+
this._url = this.options.contextMenu.url
|
|
70
95
|
}
|
|
71
|
-
this.render()
|
|
72
|
-
this.bindEvents()
|
|
96
|
+
this.render()
|
|
97
|
+
this.bindEvents()
|
|
73
98
|
}
|
|
74
99
|
|
|
100
|
+
/**
|
|
101
|
+
* @internal
|
|
102
|
+
*/
|
|
75
103
|
override bindEvents() {
|
|
76
|
-
|
|
77
|
-
this.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
104
|
+
this.listenTo(
|
|
105
|
+
this.container,
|
|
106
|
+
Events.CONTAINER_CONTEXTMENU,
|
|
107
|
+
this.toggleContextMenu,
|
|
108
|
+
)
|
|
109
|
+
this.listenTo(this.container, Events.CONTAINER_CLICK, this.hide)
|
|
110
|
+
$('body').on('click', this.hideOnBodyClick)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @internal
|
|
115
|
+
*/
|
|
87
116
|
override destroy() {
|
|
88
|
-
$('body').off('click', this.
|
|
89
|
-
|
|
90
|
-
this.stopListening();
|
|
91
|
-
return super.destroy();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
private containerChanged() {
|
|
95
|
-
this.container = this.core.activeContainer;
|
|
96
|
-
// @ts-ignore
|
|
97
|
-
this.stopListening();
|
|
98
|
-
this.bindEvents();
|
|
117
|
+
$('body').off('click', this.hideOnBodyClick)
|
|
118
|
+
return super.destroy()
|
|
99
119
|
}
|
|
100
120
|
|
|
101
121
|
private toggleContextMenu(event: MouseEvent) {
|
|
102
|
-
event.preventDefault()
|
|
103
|
-
const offset = this.container?.$el.offset()
|
|
122
|
+
event.preventDefault()
|
|
123
|
+
const offset = this.container?.$el.offset()
|
|
104
124
|
|
|
105
|
-
this.show(event.pageY - offset.top, event.pageX - offset.left)
|
|
125
|
+
this.show(event.pageY - offset.top, event.pageX - offset.left)
|
|
106
126
|
}
|
|
107
127
|
|
|
108
128
|
private show(top: number, left: number) {
|
|
109
|
-
this.hide()
|
|
110
|
-
if (
|
|
111
|
-
|
|
129
|
+
this.hide()
|
|
130
|
+
if (
|
|
131
|
+
this.options.contextMenu &&
|
|
132
|
+
this.options.contextMenu.preventShowContextMenu
|
|
133
|
+
) {
|
|
134
|
+
return
|
|
112
135
|
}
|
|
113
|
-
this.$el.css({ top, left })
|
|
114
|
-
this.$el.show()
|
|
136
|
+
this.$el.css({ top, left })
|
|
137
|
+
this.$el.show()
|
|
115
138
|
}
|
|
116
139
|
|
|
117
140
|
private hide() {
|
|
118
|
-
this.$el.hide()
|
|
141
|
+
this.$el.hide()
|
|
119
142
|
}
|
|
120
143
|
|
|
121
144
|
private onOpenMainPage() {
|
|
122
|
-
window.open(this.url, '_blank')
|
|
145
|
+
window.open(this.url, '_blank')
|
|
123
146
|
}
|
|
124
147
|
|
|
148
|
+
/**
|
|
149
|
+
* @internal
|
|
150
|
+
*/
|
|
125
151
|
override render() {
|
|
126
|
-
this.menuOptions = [this.exposeVersion]
|
|
127
|
-
this.$el.html(
|
|
128
|
-
this.
|
|
129
|
-
this.hide()
|
|
130
|
-
|
|
152
|
+
this.menuOptions = [this.exposeVersion]
|
|
153
|
+
this.$el.html(ContextMenu.template({ options: this.menuOptions }))
|
|
154
|
+
this.container.$el.append(this.$el) // TODO append to the container, turn into a container plugin
|
|
155
|
+
this.hide()
|
|
156
|
+
|
|
157
|
+
return this
|
|
158
|
+
}
|
|
131
159
|
|
|
132
|
-
|
|
160
|
+
private hideOnBodyClick = () => {
|
|
161
|
+
this.hide()
|
|
133
162
|
}
|
|
134
163
|
}
|
|
@@ -11,8 +11,11 @@ import '../../../assets/dvr-controls/dvr_controls.scss';
|
|
|
11
11
|
* @beta
|
|
12
12
|
*
|
|
13
13
|
* @remarks
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* Depends on:
|
|
15
|
+
*
|
|
16
|
+
* - {@link MediaControl}
|
|
17
|
+
*
|
|
18
|
+
* The plugin renders the live stream indicator and the DVR seek bar, if DVR is enabled, in the media control UI.
|
|
16
19
|
*/
|
|
17
20
|
export class DvrControls extends UICorePlugin {
|
|
18
21
|
private static readonly template = template(dvrHTML);
|
|
@@ -21,7 +24,7 @@ export class DvrControls extends UICorePlugin {
|
|
|
21
24
|
* @internal
|
|
22
25
|
*/
|
|
23
26
|
get name() {
|
|
24
|
-
return '
|
|
27
|
+
return 'dvr_controls';
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
/**
|
|
@@ -59,35 +62,16 @@ export class DvrControls extends UICorePlugin {
|
|
|
59
62
|
* @internal
|
|
60
63
|
*/
|
|
61
64
|
override bindEvents() {
|
|
62
|
-
this.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private bindCoreEvents() {
|
|
71
|
-
if (this.core.mediaControl.settings) {
|
|
72
|
-
this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_CONTAINERCHANGED, this.containerChanged);
|
|
73
|
-
this.listenTo(this.core.mediaControl, Events.MEDIACONTROL_RENDERED, this.settingsUpdate);
|
|
74
|
-
this.listenTo(this.core, Events.CORE_OPTIONS_CHANGE, this.render);
|
|
75
|
-
} else {
|
|
76
|
-
setTimeout(() => this.bindCoreEvents(), 100);
|
|
77
|
-
}
|
|
65
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
66
|
+
assert(mediaControl, 'media_control plugin is required');
|
|
67
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.settingsUpdate);
|
|
68
|
+
this.listenTo(this.core, Events.CORE_OPTIONS_CHANGE, this.render);
|
|
69
|
+
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
|
|
78
70
|
}
|
|
79
71
|
|
|
80
72
|
private bindContainerEvents() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.dvrChanged);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private containerChanged() {
|
|
88
|
-
// @ts-ignore
|
|
89
|
-
this.stopListening();
|
|
90
|
-
this.bindEvents();
|
|
73
|
+
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.render);
|
|
74
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.dvrChanged);
|
|
91
75
|
}
|
|
92
76
|
|
|
93
77
|
private dvrChanged(dvrEnabled: boolean) {
|
|
@@ -124,7 +108,7 @@ export class DvrControls extends UICorePlugin {
|
|
|
124
108
|
private settingsUpdate() {
|
|
125
109
|
// @ts-ignore
|
|
126
110
|
this.stopListening(); // TODO sort out
|
|
127
|
-
this.core.
|
|
111
|
+
this.core.getPlugin('media_control').$el.removeClass('live'); // TODO don't access directly
|
|
128
112
|
if (this.shouldRender()) {
|
|
129
113
|
this.render();
|
|
130
114
|
this.$el.click(() => this.click());
|
|
@@ -147,7 +131,7 @@ export class DvrControls extends UICorePlugin {
|
|
|
147
131
|
backToLive: this.core.i18n.t('back_to_live')
|
|
148
132
|
}));
|
|
149
133
|
if (this.shouldRender()) {
|
|
150
|
-
const mediaControl = this.core.
|
|
134
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
151
135
|
assert(mediaControl, 'media_control plugin is required');
|
|
152
136
|
// TODO don't tap into the $el directly
|
|
153
137
|
mediaControl.$el.addClass('live');
|
|
@@ -12,6 +12,10 @@ const FAVICON_SELECTOR = 'link[rel="shortcut icon"]';
|
|
|
12
12
|
|
|
13
13
|
// const oldIcon = $(FAVICON_SELECTOR);
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* The plugin adds custom favicon to the player's tab.
|
|
17
|
+
* @beta
|
|
18
|
+
*/
|
|
15
19
|
export class Favicon extends CorePlugin {
|
|
16
20
|
private _container: Container | null = null;
|
|
17
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2014 Globo.com Player authors. All rights reserved.
|
|
2
2
|
// Use of this source code is governed by a BSD-style
|
|
3
|
-
// license that can be found
|
|
3
|
+
// license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE
|
|
4
4
|
|
|
5
5
|
import { Container, ContainerPlugin, Events } from '@clappr/core';
|
|
6
6
|
|
|
@@ -10,6 +10,10 @@ declare const _gaq: {
|
|
|
10
10
|
push(args: string[]): void;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* An example Google Analytics integration plugin
|
|
15
|
+
* @beta
|
|
16
|
+
*/
|
|
13
17
|
export class GoogleAnalytics extends ContainerPlugin {
|
|
14
18
|
private account: string = '';
|
|
15
19
|
|
package/src/plugins/index.ts
CHANGED
|
@@ -14,7 +14,6 @@ export * from "./clappr-stats/ClapprStats.js";
|
|
|
14
14
|
export * from "./click-to-pause/ClickToPause.js";
|
|
15
15
|
export * from "./clips/Clips.js";
|
|
16
16
|
export * from "./context-menu/ContextMenu.js";
|
|
17
|
-
export * from "./disable-controls/DisableControls.js";
|
|
18
17
|
export * from "./dvr-controls/DvrControls.js";
|
|
19
18
|
export * from "./error-screen/ErrorScreen.js";
|
|
20
19
|
export * from "./favicon/Favicon.js";
|
|
@@ -31,12 +30,11 @@ export * from "./poster/Poster.js";
|
|
|
31
30
|
export * from "./seek-time/SeekTime.js";
|
|
32
31
|
export * from "./share/Share.js";
|
|
33
32
|
export * from "./skip-time/SkipTime.js";
|
|
33
|
+
export * from "./source-controller/SourceController.js";
|
|
34
34
|
export * from "./spinner-three-bounce/SpinnerThreeBounce.js";
|
|
35
|
-
export * from "./statistics/Statistics.js";
|
|
36
35
|
export * from "./subtitles/Subtitles.js";
|
|
36
|
+
export * from "./telemetry/Telemetry.js";
|
|
37
37
|
export * from "./thumbnails/Thumbnails.js";
|
|
38
|
-
export { setTracer} from "@gcorevideo/utils";
|
|
39
|
-
export * from "./source-controller/SourceController.js";
|
|
40
38
|
// _ vast-ads
|
|
41
39
|
// _ video360
|
|
42
40
|
export * from "./volume-fade/VolumeFade.js";
|
|
@@ -44,6 +44,7 @@ describe('LevelSelector', () => {
|
|
|
44
44
|
const activeContainer = createContainer()
|
|
45
45
|
activePlayback = createPlayback()
|
|
46
46
|
let mediaControl: UICorePlugin | null = null
|
|
47
|
+
let bottomGear: UICorePlugin | null = null
|
|
47
48
|
core = Object.assign(new EventLite(), {
|
|
48
49
|
activeContainer,
|
|
49
50
|
activePlayback,
|
|
@@ -57,10 +58,14 @@ describe('LevelSelector', () => {
|
|
|
57
58
|
if (name === 'media_control') {
|
|
58
59
|
return mediaControl
|
|
59
60
|
}
|
|
61
|
+
if (name === 'bottom_gear') {
|
|
62
|
+
return bottomGear
|
|
63
|
+
}
|
|
60
64
|
return null
|
|
61
65
|
}),
|
|
62
66
|
})
|
|
63
67
|
mediaControl = createMediaControl(core)
|
|
68
|
+
bottomGear = createBottomGear(core)
|
|
64
69
|
levelSelector = new LevelSelector(core)
|
|
65
70
|
})
|
|
66
71
|
describe('initially', () => {
|
|
@@ -71,29 +76,15 @@ describe('LevelSelector', () => {
|
|
|
71
76
|
await clock.tickAsync(1)
|
|
72
77
|
})
|
|
73
78
|
it('should render the proper level label', () => {
|
|
79
|
+
// @ts-ignore
|
|
74
80
|
expect(levelSelector.el.textContent).toMatchQualityLevelLabel('Auto')
|
|
75
81
|
})
|
|
76
82
|
})
|
|
77
83
|
describe.each([
|
|
78
|
-
[
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
'Auto',
|
|
83
|
-
],
|
|
84
|
-
[
|
|
85
|
-
'standard label',
|
|
86
|
-
LEVELS,
|
|
87
|
-
0,
|
|
88
|
-
'360p',
|
|
89
|
-
],
|
|
90
|
-
[
|
|
91
|
-
'custom label',
|
|
92
|
-
LEVELS,
|
|
93
|
-
1,
|
|
94
|
-
'HD',
|
|
95
|
-
],
|
|
96
|
-
])("%s", (_, levels, current, label) => {
|
|
84
|
+
['auto', LEVELS, -1, 'Auto'],
|
|
85
|
+
['standard label', LEVELS, 0, '360p'],
|
|
86
|
+
['custom label', LEVELS, 1, 'HD'],
|
|
87
|
+
])('%s', (_, levels, current, label) => {
|
|
97
88
|
beforeEach(async () => {
|
|
98
89
|
core.emit('core:active:container:changed')
|
|
99
90
|
await clock.tickAsync(1)
|
|
@@ -102,14 +93,19 @@ describe('LevelSelector', () => {
|
|
|
102
93
|
await clock.tickAsync(1)
|
|
103
94
|
levelSelector.$el.find('.gear-option').click()
|
|
104
95
|
await clock.tickAsync(1)
|
|
105
|
-
levelSelector.$el
|
|
96
|
+
levelSelector.$el
|
|
97
|
+
.find(`.gear-sub-menu_btn[data-id="${current}"]`)
|
|
98
|
+
.click()
|
|
106
99
|
await clock.tickAsync(1)
|
|
107
100
|
})
|
|
108
101
|
it('should render the proper level labels', () => {
|
|
109
102
|
expect(levelSelector.el.innerHTML).toMatchSnapshot()
|
|
110
103
|
})
|
|
111
104
|
it('should render the selected level', () => {
|
|
112
|
-
expect(
|
|
105
|
+
expect(
|
|
106
|
+
levelSelector.$el.find('ul.gear-sub-menu .current')[0].textContent,
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
).toMatchQualityLevelOption(label)
|
|
113
109
|
})
|
|
114
110
|
})
|
|
115
111
|
})
|
|
@@ -118,6 +114,7 @@ describe('LevelSelector', () => {
|
|
|
118
114
|
const activeContainer = createContainer()
|
|
119
115
|
activePlayback = createPlayback()
|
|
120
116
|
let mediaControl: UICorePlugin | null = null
|
|
117
|
+
let bottomGear: UICorePlugin | null = null
|
|
121
118
|
core = Object.assign(new EventLite(), {
|
|
122
119
|
activeContainer,
|
|
123
120
|
activePlayback,
|
|
@@ -131,10 +128,14 @@ describe('LevelSelector', () => {
|
|
|
131
128
|
if (name === 'media_control') {
|
|
132
129
|
return mediaControl
|
|
133
130
|
}
|
|
131
|
+
if (name === 'bottom_gear') {
|
|
132
|
+
return bottomGear
|
|
133
|
+
}
|
|
134
134
|
return null
|
|
135
135
|
}),
|
|
136
136
|
})
|
|
137
137
|
mediaControl = createMediaControl(core)
|
|
138
|
+
bottomGear = createBottomGear(core)
|
|
138
139
|
levelSelector = new LevelSelector(core)
|
|
139
140
|
})
|
|
140
141
|
describe('basically', () => {
|
|
@@ -146,7 +147,8 @@ describe('LevelSelector', () => {
|
|
|
146
147
|
})
|
|
147
148
|
it('should render the restricted quality level label', () => {
|
|
148
149
|
expect(
|
|
149
|
-
levelSelector.el.textContent
|
|
150
|
+
levelSelector.el.textContent,
|
|
151
|
+
// @ts-ignore
|
|
150
152
|
).toMatchQualityLevelLabel('360p')
|
|
151
153
|
|
|
152
154
|
expect(levelSelector.el.innerHTML).toMatchSnapshot()
|
|
@@ -185,7 +187,10 @@ describe('LevelSelector', () => {
|
|
|
185
187
|
expect(levelSelector.el.innerHTML).toMatchSnapshot()
|
|
186
188
|
})
|
|
187
189
|
it('should properly apply the restriction', () => {
|
|
188
|
-
expect(
|
|
190
|
+
expect(
|
|
191
|
+
levelSelector.$el.find('li:not(.level-disabled)')[0].textContent,
|
|
192
|
+
// @ts-ignore
|
|
193
|
+
).toMatchQualityLevelOption('360p')
|
|
189
194
|
})
|
|
190
195
|
})
|
|
191
196
|
})
|
|
@@ -217,7 +222,10 @@ expect.extend({
|
|
|
217
222
|
.trim()
|
|
218
223
|
return {
|
|
219
224
|
pass: rendered.includes(`Quality ${expected}`),
|
|
220
|
-
message: () =>
|
|
225
|
+
message: () =>
|
|
226
|
+
`Quality label must${
|
|
227
|
+
isNot ? ' not' : ''
|
|
228
|
+
} be ${expected} in "${rendered}"`,
|
|
221
229
|
}
|
|
222
230
|
},
|
|
223
231
|
toMatchQualityLevelOption(received, expected) {
|
|
@@ -228,13 +236,26 @@ expect.extend({
|
|
|
228
236
|
.trim()
|
|
229
237
|
return {
|
|
230
238
|
pass: rendered === expected,
|
|
231
|
-
message: () =>
|
|
239
|
+
message: () =>
|
|
240
|
+
`Quality option must${
|
|
241
|
+
isNot ? ' not' : ''
|
|
242
|
+
} be ${expected} in "${rendered}"`,
|
|
232
243
|
}
|
|
233
|
-
}
|
|
244
|
+
},
|
|
234
245
|
})
|
|
235
246
|
|
|
236
247
|
function createMediaControl(core: any) {
|
|
237
248
|
const mediaControl = new UICorePlugin(core)
|
|
249
|
+
// @ts-ignore
|
|
238
250
|
mediaControl.getElement = vi.fn().mockReturnValue(null)
|
|
239
251
|
return mediaControl
|
|
240
252
|
}
|
|
253
|
+
|
|
254
|
+
function createBottomGear(core: any) {
|
|
255
|
+
const bottomGear = new UICorePlugin(core)
|
|
256
|
+
// @ts-ignore
|
|
257
|
+
bottomGear.getElement = vi.fn().mockReturnValue(null)
|
|
258
|
+
// @ts-ignore
|
|
259
|
+
bottomGear.setContent = vi.fn()
|
|
260
|
+
return bottomGear
|
|
261
|
+
}
|