rx-player 3.29.0-dev.2022091600 → 3.29.0-dev.2022103100
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/CHANGELOG.md +22 -10
- package/MAINTAINERS.md +2 -1
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -1
- package/dist/_esm5.processed/compat/browser_detection.js +7 -1
- package/dist/_esm5.processed/compat/can_reuse_media_keys.d.ts +12 -0
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +15 -0
- package/dist/_esm5.processed/compat/enable_audio_track.d.ts +11 -0
- package/dist/_esm5.processed/compat/enable_audio_track.js +26 -0
- package/dist/_esm5.processed/compat/index.d.ts +4 -2
- package/dist/_esm5.processed/compat/index.js +4 -2
- package/dist/_esm5.processed/compat/{should_renew_media_keys.d.ts → should_renew_media_key_system_access.d.ts} +3 -3
- package/dist/_esm5.processed/compat/{should_renew_media_keys.js → should_renew_media_key_system_access.js} +3 -3
- package/dist/_esm5.processed/config.d.ts +1 -0
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +14 -5
- package/dist/_esm5.processed/core/api/playback_observer.js +54 -22
- package/dist/_esm5.processed/core/api/public_api.d.ts +7 -4
- package/dist/_esm5.processed/core/api/public_api.js +79 -61
- package/dist/_esm5.processed/core/api/tracks_management/media_element_track_choice_manager.js +9 -10
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +1 -1
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +3 -3
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +4 -1
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +98 -0
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +173 -0
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +4 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +15 -16
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +3 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +5 -2
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +103 -0
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +414 -0
- package/dist/_esm5.processed/core/init/content_time_boundaries_observer.d.ts +4 -3
- package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +21 -22
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +18 -4
- package/dist/_esm5.processed/core/init/initialize_media_source.js +10 -2
- package/dist/_esm5.processed/core/init/load_on_media_source.js +7 -1
- package/dist/_esm5.processed/core/init/stall_avoider.js +3 -1
- package/dist/_esm5.processed/default_config.d.ts +11 -0
- package/dist/_esm5.processed/default_config.js +11 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +1 -1
- package/dist/_esm5.processed/manifest/manifest.js +11 -2
- package/dist/_esm5.processed/manifest/representation.d.ts +12 -1
- package/dist/_esm5.processed/manifest/representation.js +1 -0
- package/dist/_esm5.processed/manifest/representation_index/static.d.ts +1 -1
- package/dist/_esm5.processed/manifest/representation_index/static.js +2 -2
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +32 -15
- package/dist/_esm5.processed/manifest/update_period_in_place.js +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +10 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +11 -11
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +7 -7
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +12 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +5 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +16 -16
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +11 -10
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +14 -13
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.d.ts +3 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +4 -12
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +2 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +1 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +6 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.d.ts +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +3 -8
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +2 -20
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +0 -6
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +0 -11
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +5 -1
- package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +17 -11
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +24 -0
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +8 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +9 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +2 -1
- package/dist/_esm5.processed/transports/dash/construct_segment_url.d.ts +18 -0
- package/dist/_esm5.processed/transports/dash/construct_segment_url.js +21 -0
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +5 -3
- package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -2
- package/dist/_esm5.processed/transports/dash/text_loader.js +4 -2
- package/dist/_esm5.processed/transports/dash/text_parser.js +3 -1
- package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +8 -8
- package/dist/_esm5.processed/transports/smooth/pipelines.js +11 -7
- package/dist/_esm5.processed/transports/smooth/utils.d.ts +4 -2
- package/dist/_esm5.processed/transports/smooth/utils.js +7 -1
- package/dist/_esm5.processed/transports/types.d.ts +5 -3
- package/dist/_esm5.processed/utils/event_emitter.d.ts +1 -2
- package/dist/_esm5.processed/utils/resolve_url.d.ts +7 -4
- package/dist/_esm5.processed/utils/resolve_url.js +11 -8
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +5656 -13236
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +28 -23
- package/package.json +29 -29
- package/sonar-project.properties +1 -1
- package/src/compat/__tests__/can_reuse_media_keys.test.ts +54 -0
- package/src/compat/__tests__/enable_audio_track.test.ts +341 -0
- package/src/compat/__tests__/{should_renew_media_keys.test.ts → should_renew_media_key_system_access.test.ts} +7 -5
- package/src/compat/browser_detection.ts +10 -0
- package/src/compat/can_reuse_media_keys.ts +19 -0
- package/src/compat/enable_audio_track.ts +33 -0
- package/src/compat/index.ts +6 -2
- package/src/compat/{should_renew_media_keys.ts → should_renew_media_key_system_access.ts} +3 -3
- package/src/core/api/playback_observer.ts +97 -33
- package/src/core/api/public_api.ts +126 -74
- package/src/core/api/tracks_management/media_element_track_choice_manager.ts +3 -11
- package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +182 -0
- package/src/core/decrypt/__tests__/__global__/utils.ts +2 -0
- package/src/core/decrypt/find_key_system.ts +3 -3
- package/src/core/decrypt/get_media_keys.ts +5 -1
- package/src/core/fetchers/cdn_prioritizer.ts +198 -0
- package/src/core/fetchers/manifest/manifest_fetcher.ts +7 -11
- package/src/core/fetchers/segment/segment_fetcher.ts +12 -10
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +10 -1
- package/src/core/fetchers/utils/schedule_request.ts +482 -0
- package/src/core/init/content_time_boundaries_observer.ts +12 -12
- package/src/core/init/initialize_media_source.ts +31 -4
- package/src/core/init/load_on_media_source.ts +11 -2
- package/src/core/init/stall_avoider.ts +4 -1
- package/src/core/stream/orchestrator/stream_orchestrator.ts +0 -1
- package/src/default_config.ts +12 -0
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +1 -0
- package/src/manifest/manifest.ts +11 -2
- package/src/manifest/representation.ts +15 -0
- package/src/manifest/representation_index/__tests__/static.test.ts +1 -1
- package/src/manifest/representation_index/static.ts +3 -3
- package/src/manifest/representation_index/types.ts +33 -15
- package/src/manifest/update_period_in_place.ts +1 -0
- package/src/parsers/manifest/dash/common/indexes/base.ts +22 -23
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +6 -4
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +5 -5
- package/src/parsers/manifest/dash/common/indexes/list.ts +19 -20
- package/src/parsers/manifest/dash/common/indexes/template.ts +23 -27
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +25 -23
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +7 -18
- package/src/parsers/manifest/dash/common/parse_mpd.ts +2 -4
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +1 -6
- package/src/parsers/manifest/dash/common/parse_representations.ts +9 -0
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +5 -9
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +2 -29
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/AdaptationSet.test.ts +7 -11
- package/src/parsers/manifest/dash/node_parser_types.ts +0 -7
- package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +3 -1
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +1 -8
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +0 -13
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +8 -0
- package/src/parsers/manifest/local/parse_local_manifest.ts +1 -0
- package/src/parsers/manifest/local/representation_index.ts +2 -2
- package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +7 -1
- package/src/parsers/manifest/smooth/create_parser.ts +17 -13
- package/src/parsers/manifest/smooth/representation_index.ts +2 -2
- package/src/parsers/manifest/types.ts +26 -1
- package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +15 -0
- package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +15 -0
- package/src/parsers/texttracks/ttml/html/apply_extent.ts +8 -1
- package/src/parsers/texttracks/ttml/html/apply_origin.ts +9 -1
- package/src/parsers/texttracks/ttml/html/create_element.ts +2 -2
- package/src/transports/dash/construct_segment_url.ts +28 -0
- package/src/transports/dash/image_pipelines.ts +5 -2
- package/src/transports/dash/segment_loader.ts +5 -2
- package/src/transports/dash/text_loader.ts +5 -2
- package/src/transports/dash/text_parser.ts +3 -1
- package/src/transports/local/segment_loader.ts +3 -2
- package/src/transports/metaplaylist/pipelines.ts +28 -9
- package/src/transports/smooth/pipelines.ts +12 -6
- package/src/transports/smooth/utils.ts +13 -1
- package/src/transports/types.ts +6 -3
- package/src/utils/__tests__/event_emitter.test.ts +72 -67
- package/src/utils/__tests__/initialization_segment_cache.test.ts +7 -7
- package/src/utils/__tests__/resolve_url.test.ts +27 -23
- package/src/utils/event_emitter.ts +1 -3
- package/src/utils/resolve_url.ts +11 -8
- package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.d.ts +0 -85
- package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +0 -264
- package/dummy +0 -1
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +0 -287
package/jest.config.js
CHANGED
|
@@ -9,7 +9,7 @@ module.exports = {
|
|
|
9
9
|
// Without this, Jest just fails when importing rxjs, for some arcane
|
|
10
10
|
// ESM-vs-CommonJS reasons linked to how it works internally.
|
|
11
11
|
moduleNameMapper: {
|
|
12
|
-
|
|
12
|
+
"^rxjs$": require.resolve("rxjs"),
|
|
13
13
|
},
|
|
14
14
|
testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"],
|
|
15
15
|
collectCoverageFrom: [
|
|
@@ -17,29 +17,34 @@ module.exports = {
|
|
|
17
17
|
"!src/**/index.ts",
|
|
18
18
|
"!**/__tests__/**",
|
|
19
19
|
],
|
|
20
|
-
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
20
|
+
transform: {
|
|
21
|
+
"^.+\\.tsx?$": [
|
|
22
|
+
"ts-jest",
|
|
23
|
+
{
|
|
24
|
+
tsconfig: {
|
|
25
|
+
target: "es2017",
|
|
26
|
+
lib: ["es2017", "dom"],
|
|
27
|
+
forceConsistentCasingInFileNames: true,
|
|
28
|
+
skipLibCheck: false,
|
|
29
|
+
noImplicitAny: true,
|
|
30
|
+
strict: true,
|
|
31
|
+
strictNullChecks: true,
|
|
32
|
+
strictPropertyInitialization: true,
|
|
33
|
+
noUnusedParameters: true,
|
|
34
|
+
noUnusedLocals: true,
|
|
35
|
+
types: ["node", "jest"],
|
|
36
|
+
module: "es2015",
|
|
37
|
+
moduleResolution: "node",
|
|
38
|
+
esModuleInterop: true,
|
|
39
|
+
typeRoots: [
|
|
40
|
+
"./src/typings",
|
|
41
|
+
"./node_modules/@types",
|
|
42
|
+
],
|
|
43
|
+
},
|
|
41
44
|
},
|
|
42
|
-
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
globals: {
|
|
43
48
|
__FEATURES__: {
|
|
44
49
|
IS_DISABLED: 0,
|
|
45
50
|
IS_ENABLED: 1,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rx-player",
|
|
3
3
|
"author": "Canal+",
|
|
4
|
-
"version": "3.29.0-dev.
|
|
4
|
+
"version": "3.29.0-dev.2022103100",
|
|
5
5
|
"description": "Canal+ HTML5 Video Player",
|
|
6
6
|
"main": "./dist/rx-player.js",
|
|
7
7
|
"keywords": [
|
|
@@ -78,59 +78,59 @@
|
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"next-tick": "1.1.0",
|
|
81
|
-
"rxjs": "7.
|
|
81
|
+
"rxjs": "7.5.7"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
|
-
"@babel/core": "7.
|
|
85
|
-
"@babel/plugin-transform-runtime": "7.
|
|
86
|
-
"@babel/preset-env": "7.
|
|
84
|
+
"@babel/core": "7.19.6",
|
|
85
|
+
"@babel/plugin-transform-runtime": "7.19.6",
|
|
86
|
+
"@babel/preset-env": "7.19.4",
|
|
87
87
|
"@babel/preset-react": "7.18.6",
|
|
88
88
|
"@types/chai": "4.3.3",
|
|
89
|
-
"@types/jest": "
|
|
90
|
-
"@types/mocha": "
|
|
91
|
-
"@types/node": "18.
|
|
89
|
+
"@types/jest": "29.2.0",
|
|
90
|
+
"@types/mocha": "10.0.0",
|
|
91
|
+
"@types/node": "18.11.8",
|
|
92
92
|
"@types/sinon": "10.0.13",
|
|
93
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
94
|
-
"@typescript-eslint/eslint-plugin-tslint": "5.
|
|
95
|
-
"@typescript-eslint/parser": "5.
|
|
93
|
+
"@typescript-eslint/eslint-plugin": "5.41.0",
|
|
94
|
+
"@typescript-eslint/eslint-plugin-tslint": "5.41.0",
|
|
95
|
+
"@typescript-eslint/parser": "5.41.0",
|
|
96
96
|
"arraybuffer-loader": "1.0.8",
|
|
97
|
-
"babel-loader": "
|
|
97
|
+
"babel-loader": "9.0.0",
|
|
98
98
|
"chai": "4.3.6",
|
|
99
99
|
"cheerio": "1.0.0-rc.12",
|
|
100
|
-
"core-js": "3.
|
|
101
|
-
"esbuild": "0.15.
|
|
102
|
-
"eslint": "8.
|
|
100
|
+
"core-js": "3.26.0",
|
|
101
|
+
"esbuild": "0.15.12",
|
|
102
|
+
"eslint": "8.26.0",
|
|
103
103
|
"eslint-plugin-import": "2.26.0",
|
|
104
|
-
"eslint-plugin-jsdoc": "39.
|
|
105
|
-
"eslint-plugin-react": "7.31.
|
|
104
|
+
"eslint-plugin-jsdoc": "39.4.0",
|
|
105
|
+
"eslint-plugin-react": "7.31.10",
|
|
106
106
|
"esm": "3.2.25",
|
|
107
|
-
"express": "4.18.
|
|
107
|
+
"express": "4.18.2",
|
|
108
108
|
"highlight.js": "11.6.0",
|
|
109
109
|
"html-entities": "2.3.3",
|
|
110
|
-
"jest": "
|
|
111
|
-
"jest-environment-jsdom": "
|
|
112
|
-
"karma": "6.4.
|
|
110
|
+
"jest": "29.2.2",
|
|
111
|
+
"jest-environment-jsdom": "29.2.2",
|
|
112
|
+
"karma": "6.4.1",
|
|
113
113
|
"karma-chrome-launcher": "3.1.1",
|
|
114
114
|
"karma-firefox-launcher": "2.1.2",
|
|
115
115
|
"karma-mocha": "2.0.1",
|
|
116
116
|
"karma-webpack": "5.0.0",
|
|
117
117
|
"markdown-it": "13.0.1",
|
|
118
|
-
"mocha": "10.
|
|
118
|
+
"mocha": "10.1.0",
|
|
119
119
|
"mocha-loader": "5.1.5",
|
|
120
120
|
"raw-loader": "4.0.2",
|
|
121
121
|
"react": "18.2.0",
|
|
122
122
|
"react-dom": "18.2.0",
|
|
123
|
-
"regenerator-runtime": "0.13.
|
|
123
|
+
"regenerator-runtime": "0.13.10",
|
|
124
124
|
"rimraf": "3.0.2",
|
|
125
|
-
"semver": "7.3.
|
|
126
|
-
"sinon": "14.0.
|
|
125
|
+
"semver": "7.3.8",
|
|
126
|
+
"sinon": "14.0.1",
|
|
127
127
|
"terser-webpack-plugin": "5.3.6",
|
|
128
|
-
"ts-jest": "
|
|
129
|
-
"ts-loader": "9.
|
|
128
|
+
"ts-jest": "29.0.3",
|
|
129
|
+
"ts-loader": "9.4.1",
|
|
130
130
|
"tslint": "6.1.3",
|
|
131
|
-
"typescript": "4.8.
|
|
131
|
+
"typescript": "4.8.4",
|
|
132
132
|
"webpack": "5.74.0",
|
|
133
|
-
"webpack-bundle-analyzer": "4.
|
|
133
|
+
"webpack-bundle-analyzer": "4.7.0",
|
|
134
134
|
"webpack-cli": "4.10.0"
|
|
135
135
|
},
|
|
136
136
|
"scripts-list": {
|
package/sonar-project.properties
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
sonar.projectKey=rx-player
|
|
2
2
|
sonar.organization=rx-player
|
|
3
3
|
sonar.projectName=rx-player
|
|
4
|
-
sonar.projectVersion=3.29.0-dev.
|
|
4
|
+
sonar.projectVersion=3.29.0-dev.2022103100
|
|
5
5
|
sonar.sources=./src,./demo,./tests
|
|
6
6
|
sonar.exclusions=demo/full/bundle.js,demo/standalone/lib.js,demo/bundle.js
|
|
7
7
|
sonar.host.url=https://sonarcloud.io
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
5
|
+
|
|
6
|
+
describe("Compat - canReuseMediaKeys", () => {
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
jest.resetModules();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("should return true on any browser but WebOS 2021 and 2022", () => {
|
|
12
|
+
jest.mock("../browser_detection", () => {
|
|
13
|
+
return { __esModule: true as const,
|
|
14
|
+
isWebOs2021: false,
|
|
15
|
+
isWebOs2022: false };
|
|
16
|
+
});
|
|
17
|
+
const canReuseMediaKeys =
|
|
18
|
+
jest.requireActual("../can_reuse_media_keys.ts");
|
|
19
|
+
expect(canReuseMediaKeys.default()).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("should return false on WebOs 2021", () => {
|
|
23
|
+
jest.mock("../browser_detection", () => {
|
|
24
|
+
return { __esModule: true as const,
|
|
25
|
+
isWebOs2021: true,
|
|
26
|
+
isWebOs2022: false };
|
|
27
|
+
});
|
|
28
|
+
const canReuseMediaKeys =
|
|
29
|
+
jest.requireActual("../can_reuse_media_keys.ts");
|
|
30
|
+
expect(canReuseMediaKeys.default()).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("should return false on WebOs 2022", () => {
|
|
34
|
+
jest.mock("../browser_detection", () => {
|
|
35
|
+
return { __esModule: true as const,
|
|
36
|
+
isWebOs2021: false,
|
|
37
|
+
isWebOs2022: true };
|
|
38
|
+
});
|
|
39
|
+
const canReuseMediaKeys =
|
|
40
|
+
jest.requireActual("../can_reuse_media_keys.ts");
|
|
41
|
+
expect(canReuseMediaKeys.default()).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should return false in the improbable case of both WebOs 2021 and 2022", () => {
|
|
45
|
+
jest.mock("../browser_detection", () => {
|
|
46
|
+
return { __esModule: true as const,
|
|
47
|
+
isWebOs2021: true,
|
|
48
|
+
isWebOs2022: true };
|
|
49
|
+
});
|
|
50
|
+
const canReuseMediaKeys =
|
|
51
|
+
jest.requireActual("../can_reuse_media_keys.ts");
|
|
52
|
+
expect(canReuseMediaKeys.default()).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
7
|
+
describe("compat - enableAudioTrack", () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
jest.resetModules();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("should enable the wanted audioTrack", () => {
|
|
13
|
+
jest.mock("../browser_detection", () => {
|
|
14
|
+
return {
|
|
15
|
+
__esModule: true as const,
|
|
16
|
+
isTizen: false,
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
const fakeAudioTracks = [
|
|
20
|
+
{
|
|
21
|
+
id: "id1",
|
|
22
|
+
kind: "descriptions",
|
|
23
|
+
label: "Toto",
|
|
24
|
+
language: "swa",
|
|
25
|
+
enabled: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "id2",
|
|
29
|
+
kind: "normal",
|
|
30
|
+
label: "Titi",
|
|
31
|
+
language: "fre",
|
|
32
|
+
enabled: false,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "id26",
|
|
36
|
+
kind: "bloop",
|
|
37
|
+
label: "hay",
|
|
38
|
+
language: "hay",
|
|
39
|
+
enabled: false,
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
const enableAudioTrack = jest.requireActual("../enable_audio_track");
|
|
43
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 2)).toEqual(true);
|
|
44
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
45
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
46
|
+
expect(fakeAudioTracks[2].enabled).toBe(true);
|
|
47
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 1)).toEqual(true);
|
|
48
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
49
|
+
expect(fakeAudioTracks[1].enabled).toBe(true);
|
|
50
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
51
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 0)).toEqual(true);
|
|
52
|
+
expect(fakeAudioTracks[0].enabled).toBe(true);
|
|
53
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
54
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should enable the wanted audioTrack on Tizen", () => {
|
|
58
|
+
jest.mock("../browser_detection", () => {
|
|
59
|
+
return {
|
|
60
|
+
__esModule: true as const,
|
|
61
|
+
isTizen: true,
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const fakeAudioTracks = [
|
|
65
|
+
{
|
|
66
|
+
id: "id1",
|
|
67
|
+
kind: "descriptions",
|
|
68
|
+
label: "Toto",
|
|
69
|
+
language: "swa",
|
|
70
|
+
enabled: true,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "id2",
|
|
74
|
+
kind: "normal",
|
|
75
|
+
label: "Titi",
|
|
76
|
+
language: "fre",
|
|
77
|
+
enabled: false,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "id26",
|
|
81
|
+
kind: "bloop",
|
|
82
|
+
label: "hay",
|
|
83
|
+
language: "hay",
|
|
84
|
+
enabled: false,
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
const enableAudioTrack = jest.requireActual("../enable_audio_track");
|
|
88
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 2)).toEqual(true);
|
|
89
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
90
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
91
|
+
expect(fakeAudioTracks[2].enabled).toBe(true);
|
|
92
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 1)).toEqual(true);
|
|
93
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
94
|
+
expect(fakeAudioTracks[1].enabled).toBe(true);
|
|
95
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
96
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 0)).toEqual(true);
|
|
97
|
+
expect(fakeAudioTracks[0].enabled).toBe(true);
|
|
98
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
99
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("should return false if the audio track index does not exist", () => {
|
|
103
|
+
jest.mock("../browser_detection", () => {
|
|
104
|
+
return {
|
|
105
|
+
__esModule: true as const,
|
|
106
|
+
isTizen: false,
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
const fakeAudioTracks = [
|
|
110
|
+
{
|
|
111
|
+
id: "id1",
|
|
112
|
+
kind: "descriptions",
|
|
113
|
+
label: "Toto",
|
|
114
|
+
language: "swa",
|
|
115
|
+
enabled: true,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "id2",
|
|
119
|
+
kind: "normal",
|
|
120
|
+
label: "Titi",
|
|
121
|
+
language: "fre",
|
|
122
|
+
enabled: false,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: "id26",
|
|
126
|
+
kind: "bloop",
|
|
127
|
+
label: "hay",
|
|
128
|
+
language: "hay",
|
|
129
|
+
enabled: false,
|
|
130
|
+
},
|
|
131
|
+
];
|
|
132
|
+
const enableAudioTrack = jest.requireActual("../enable_audio_track");
|
|
133
|
+
expect(enableAudioTrack.default(fakeAudioTracks, -1)).toEqual(false);
|
|
134
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
135
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
136
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
137
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 0)).toEqual(true);
|
|
138
|
+
expect(fakeAudioTracks[0].enabled).toBe(true);
|
|
139
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
140
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
141
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 4)).toEqual(false);
|
|
142
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
143
|
+
expect(fakeAudioTracks[1].enabled).toBe(false);
|
|
144
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("should return false if the audio track index does not exist on Tizen", () => {
|
|
148
|
+
jest.mock("../browser_detection", () => {
|
|
149
|
+
return {
|
|
150
|
+
__esModule: true as const,
|
|
151
|
+
isTizen: false,
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
let track1IsEnabled = true;
|
|
155
|
+
let track2IsEnabled = false;
|
|
156
|
+
let track3IsEnabled = false;
|
|
157
|
+
let track1WasDisabled = 0;
|
|
158
|
+
let track2WasDisabled = 0;
|
|
159
|
+
let track3WasDisabled = 0;
|
|
160
|
+
let track1WasEnabled = 0;
|
|
161
|
+
let track2WasEnabled = 0;
|
|
162
|
+
let track3WasEnabled = 0;
|
|
163
|
+
const fakeAudioTracks = [
|
|
164
|
+
{
|
|
165
|
+
id: "id1",
|
|
166
|
+
kind: "descriptions",
|
|
167
|
+
label: "Toto",
|
|
168
|
+
language: "swa",
|
|
169
|
+
enabled: true,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: "id2",
|
|
173
|
+
kind: "normal",
|
|
174
|
+
label: "Titi",
|
|
175
|
+
language: "fre",
|
|
176
|
+
enabled: false,
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: "id26",
|
|
180
|
+
kind: "bloop",
|
|
181
|
+
label: "hay",
|
|
182
|
+
language: "hay",
|
|
183
|
+
enabled: false,
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
Object.defineProperty(fakeAudioTracks[0], "enabled", {
|
|
187
|
+
enumerable: true,
|
|
188
|
+
get() : boolean {
|
|
189
|
+
return track1IsEnabled;
|
|
190
|
+
},
|
|
191
|
+
set(enabled : boolean) {
|
|
192
|
+
if (!enabled) {
|
|
193
|
+
track1WasDisabled++;
|
|
194
|
+
} else {
|
|
195
|
+
track1WasEnabled++;
|
|
196
|
+
}
|
|
197
|
+
track1IsEnabled = enabled;
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
Object.defineProperty(fakeAudioTracks[1], "enabled", {
|
|
201
|
+
enumerable: true,
|
|
202
|
+
get() : boolean {
|
|
203
|
+
return track2IsEnabled;
|
|
204
|
+
},
|
|
205
|
+
set(enabled : boolean) {
|
|
206
|
+
if (!enabled) {
|
|
207
|
+
track2WasDisabled++;
|
|
208
|
+
} else {
|
|
209
|
+
track2WasEnabled++;
|
|
210
|
+
}
|
|
211
|
+
track2IsEnabled = enabled;
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
Object.defineProperty(fakeAudioTracks[2], "enabled", {
|
|
215
|
+
enumerable: true,
|
|
216
|
+
get() : boolean {
|
|
217
|
+
return track3IsEnabled;
|
|
218
|
+
},
|
|
219
|
+
set(enabled : boolean) {
|
|
220
|
+
if (!enabled) {
|
|
221
|
+
track3WasDisabled++;
|
|
222
|
+
} else {
|
|
223
|
+
track3WasEnabled++;
|
|
224
|
+
}
|
|
225
|
+
track3IsEnabled = enabled;
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
const enableAudioTrack = jest.requireActual("../enable_audio_track");
|
|
229
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 1)).toBe(true);
|
|
230
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
231
|
+
expect(fakeAudioTracks[1].enabled).toBe(true);
|
|
232
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
233
|
+
expect(track1IsEnabled).toBe(false);
|
|
234
|
+
expect(track2IsEnabled).toBe(true);
|
|
235
|
+
expect(track3IsEnabled).toBe(false);
|
|
236
|
+
expect(track1WasDisabled).toBe(1);
|
|
237
|
+
expect(track2WasDisabled).toBe(1);
|
|
238
|
+
expect(track3WasDisabled).toBe(1);
|
|
239
|
+
expect(track1WasEnabled).toBe(0);
|
|
240
|
+
expect(track2WasEnabled).toBe(1);
|
|
241
|
+
expect(track3WasEnabled).toBe(0);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// eslint-disable-next-line max-len
|
|
245
|
+
it("should first disable all audioTracks except the one wanted by default on Tizen", () => {
|
|
246
|
+
jest.mock("../browser_detection", () => {
|
|
247
|
+
return {
|
|
248
|
+
__esModule: true as const,
|
|
249
|
+
isTizen: true,
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
let track1IsEnabled = true;
|
|
253
|
+
let track2IsEnabled = false;
|
|
254
|
+
let track3IsEnabled = false;
|
|
255
|
+
let track1WasDisabled = 0;
|
|
256
|
+
let track2WasDisabled = 0;
|
|
257
|
+
let track3WasDisabled = 0;
|
|
258
|
+
let track1WasEnabled = 0;
|
|
259
|
+
let track2WasEnabled = 0;
|
|
260
|
+
let track3WasEnabled = 0;
|
|
261
|
+
const fakeAudioTracks = [
|
|
262
|
+
{
|
|
263
|
+
id: "id1",
|
|
264
|
+
kind: "descriptions",
|
|
265
|
+
label: "Toto",
|
|
266
|
+
language: "swa",
|
|
267
|
+
enabled: true,
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
id: "id2",
|
|
271
|
+
kind: "normal",
|
|
272
|
+
label: "Titi",
|
|
273
|
+
language: "fre",
|
|
274
|
+
enabled: false,
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: "id26",
|
|
278
|
+
kind: "bloop",
|
|
279
|
+
label: "hay",
|
|
280
|
+
language: "hay",
|
|
281
|
+
enabled: false,
|
|
282
|
+
},
|
|
283
|
+
];
|
|
284
|
+
Object.defineProperty(fakeAudioTracks[0], "enabled", {
|
|
285
|
+
enumerable: true,
|
|
286
|
+
get() : boolean {
|
|
287
|
+
return track1IsEnabled;
|
|
288
|
+
},
|
|
289
|
+
set(enabled : boolean) {
|
|
290
|
+
if (!enabled) {
|
|
291
|
+
track1WasDisabled++;
|
|
292
|
+
} else {
|
|
293
|
+
track1WasEnabled++;
|
|
294
|
+
}
|
|
295
|
+
track1IsEnabled = enabled;
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
Object.defineProperty(fakeAudioTracks[1], "enabled", {
|
|
299
|
+
enumerable: true,
|
|
300
|
+
get() : boolean {
|
|
301
|
+
return track2IsEnabled;
|
|
302
|
+
},
|
|
303
|
+
set(enabled : boolean) {
|
|
304
|
+
if (!enabled) {
|
|
305
|
+
track2WasDisabled++;
|
|
306
|
+
} else {
|
|
307
|
+
track2WasEnabled++;
|
|
308
|
+
}
|
|
309
|
+
track2IsEnabled = enabled;
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
Object.defineProperty(fakeAudioTracks[2], "enabled", {
|
|
313
|
+
enumerable: true,
|
|
314
|
+
get() : boolean {
|
|
315
|
+
return track3IsEnabled;
|
|
316
|
+
},
|
|
317
|
+
set(enabled : boolean) {
|
|
318
|
+
if (!enabled) {
|
|
319
|
+
track3WasDisabled++;
|
|
320
|
+
} else {
|
|
321
|
+
track3WasEnabled++;
|
|
322
|
+
}
|
|
323
|
+
track3IsEnabled = enabled;
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
const enableAudioTrack = jest.requireActual("../enable_audio_track");
|
|
327
|
+
expect(enableAudioTrack.default(fakeAudioTracks, 1)).toBe(true);
|
|
328
|
+
expect(fakeAudioTracks[0].enabled).toBe(false);
|
|
329
|
+
expect(fakeAudioTracks[1].enabled).toBe(true);
|
|
330
|
+
expect(fakeAudioTracks[2].enabled).toBe(false);
|
|
331
|
+
expect(track1IsEnabled).toBe(false);
|
|
332
|
+
expect(track2IsEnabled).toBe(true);
|
|
333
|
+
expect(track3IsEnabled).toBe(false);
|
|
334
|
+
expect(track1WasDisabled).toBe(1);
|
|
335
|
+
expect(track2WasDisabled).toBe(0);
|
|
336
|
+
expect(track3WasDisabled).toBe(1);
|
|
337
|
+
expect(track1WasEnabled).toBe(0);
|
|
338
|
+
expect(track2WasEnabled).toBe(1);
|
|
339
|
+
expect(track3WasEnabled).toBe(0);
|
|
340
|
+
});
|
|
341
|
+
});
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
22
22
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
23
23
|
|
|
24
|
-
describe("compat -
|
|
24
|
+
describe("compat - shouldRenewMediaKeySystemAccess", () => {
|
|
25
25
|
beforeEach(() => {
|
|
26
26
|
jest.resetModules();
|
|
27
27
|
});
|
|
@@ -33,8 +33,9 @@ describe("compat - shouldRenewMediaKeys", () => {
|
|
|
33
33
|
isIE11: false,
|
|
34
34
|
};
|
|
35
35
|
});
|
|
36
|
-
const
|
|
37
|
-
|
|
36
|
+
const shouldRenewMediaKeySystemAccess =
|
|
37
|
+
jest.requireActual("../should_renew_media_key_system_access");
|
|
38
|
+
expect(shouldRenewMediaKeySystemAccess.default()).toBe(false);
|
|
38
39
|
});
|
|
39
40
|
|
|
40
41
|
it("should return true if we are on IE11", () => {
|
|
@@ -44,8 +45,9 @@ describe("compat - shouldRenewMediaKeys", () => {
|
|
|
44
45
|
isIE11: true,
|
|
45
46
|
};
|
|
46
47
|
});
|
|
47
|
-
const
|
|
48
|
-
|
|
48
|
+
const shouldRenewMediaKeySystemAccess =
|
|
49
|
+
jest.requireActual("../should_renew_media_key_system_access");
|
|
50
|
+
expect(shouldRenewMediaKeySystemAccess.default()).toBe(true);
|
|
49
51
|
});
|
|
50
52
|
beforeEach(() => {
|
|
51
53
|
jest.resetModules();
|
|
@@ -50,6 +50,13 @@ const isSamsungBrowser : boolean = !isNode &&
|
|
|
50
50
|
const isTizen : boolean = !isNode &&
|
|
51
51
|
/Tizen/.test(navigator.userAgent);
|
|
52
52
|
|
|
53
|
+
const isWebOs : boolean = !isNode &&
|
|
54
|
+
/Web0S/.test(navigator.userAgent);
|
|
55
|
+
const isWebOs2021 : boolean = !isNode &&
|
|
56
|
+
/WebOS.TV-2021/.test(navigator.userAgent);
|
|
57
|
+
const isWebOs2022 : boolean = !isNode &&
|
|
58
|
+
/WebOS.TV-2022/.test(navigator.userAgent);
|
|
59
|
+
|
|
53
60
|
interface ISafariWindowObject extends Window {
|
|
54
61
|
safari? : { pushNotification? : { toString() : string } };
|
|
55
62
|
}
|
|
@@ -76,4 +83,7 @@ export {
|
|
|
76
83
|
isSafariMobile,
|
|
77
84
|
isSamsungBrowser,
|
|
78
85
|
isTizen,
|
|
86
|
+
isWebOs,
|
|
87
|
+
isWebOs2021,
|
|
88
|
+
isWebOs2022,
|
|
79
89
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isWebOs2021,
|
|
3
|
+
isWebOs2022,
|
|
4
|
+
} from "./browser_detection";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Returns `true` if a `MediaKeys` instance (the `Encrypted Media Extension`
|
|
8
|
+
* concept) can be reused between contents.
|
|
9
|
+
*
|
|
10
|
+
* This should usually be the case but we found rare devices where this would
|
|
11
|
+
* cause problem:
|
|
12
|
+
* - (2022-10-26): WebOS (LG TVs) 2021 and 2022 just rebuffered indefinitely
|
|
13
|
+
* when loading a content already-loaded on the HTMLMediaElement.
|
|
14
|
+
*
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
export default function canReuseMediaKeys() : boolean {
|
|
18
|
+
return !(isWebOs2021 || isWebOs2022);
|
|
19
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ICompatAudioTrack } from "./browser_compatibility_types";
|
|
2
|
+
import { isTizen } from "./browser_detection";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Enable the audio track at the given index while disabling all others in the
|
|
6
|
+
* `audioTracks` array.
|
|
7
|
+
*
|
|
8
|
+
* Returns false if the given index is not found in the `audioTracks` array.
|
|
9
|
+
* @param {array.<audioTrack>} audioTracks
|
|
10
|
+
* @param {number} indexToEnable
|
|
11
|
+
* @returns {boolean}
|
|
12
|
+
*/
|
|
13
|
+
export default function enableAudioTrack(
|
|
14
|
+
audioTracks : ICompatAudioTrack[],
|
|
15
|
+
indexToEnable : number
|
|
16
|
+
) : boolean {
|
|
17
|
+
// Seen on Safari MacOS only (2022-02-14), not disabling ALL audio tracks
|
|
18
|
+
// first (even the wanted one), can lead to the media not playing.
|
|
19
|
+
for (let i = 0; i < audioTracks.length; i++) {
|
|
20
|
+
// However, Tizen just plays no audio if it is disabled then enabled
|
|
21
|
+
// synchronously (2022-10-12)
|
|
22
|
+
if (!isTizen || i !== indexToEnable) {
|
|
23
|
+
audioTracks[i].enabled = false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (indexToEnable < 0 || indexToEnable >= audioTracks.length) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
audioTracks[indexToEnable].enabled = true;
|
|
32
|
+
return true;
|
|
33
|
+
}
|