shaka-player 4.12.8 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/AUTHORS +1 -0
  2. package/CONTRIBUTORS +4 -0
  3. package/README.md +22 -21
  4. package/cspell.config.yaml +18 -0
  5. package/dist/controls.css +1 -1
  6. package/dist/controls.css.map +1 -1
  7. package/dist/deps.js +29 -24
  8. package/dist/locales.js +33 -33
  9. package/dist/shaka-player.compiled.d.ts +138 -36
  10. package/dist/shaka-player.compiled.debug.d.ts +138 -36
  11. package/dist/shaka-player.compiled.debug.externs.js +367 -107
  12. package/dist/shaka-player.compiled.debug.js +828 -765
  13. package/dist/shaka-player.compiled.debug.map +4 -4
  14. package/dist/shaka-player.compiled.externs.js +367 -107
  15. package/dist/shaka-player.compiled.js +1451 -1416
  16. package/dist/shaka-player.compiled.map +4 -4
  17. package/dist/shaka-player.ui.d.ts +172 -38
  18. package/dist/shaka-player.ui.debug.d.ts +172 -38
  19. package/dist/shaka-player.ui.debug.externs.js +406 -113
  20. package/dist/shaka-player.ui.debug.js +842 -766
  21. package/dist/shaka-player.ui.debug.map +4 -4
  22. package/dist/shaka-player.ui.externs.js +406 -113
  23. package/dist/shaka-player.ui.js +1670 -1628
  24. package/dist/shaka-player.ui.map +4 -4
  25. package/eslint.config.mjs +343 -0
  26. package/externs/airplay.js +1 -1
  27. package/externs/audiotrack.js +1 -1
  28. package/externs/awesomplete.js +1 -1
  29. package/externs/cast-sdk-v2.js +2 -2
  30. package/externs/cmcd.js +16 -1
  31. package/externs/device_sensor_event.js +1 -1
  32. package/externs/ima.js +8 -8
  33. package/externs/isoboxer.js +31 -31
  34. package/externs/jwk_set.js +1 -1
  35. package/externs/lcevc.js +8 -8
  36. package/externs/mediakeys.js +1 -1
  37. package/externs/mediasession.js +3 -2
  38. package/externs/mediatailor.js +18 -18
  39. package/externs/pictureinpicture.js +41 -1
  40. package/externs/playstation.js +2 -2
  41. package/externs/prefixed_eme.js +1 -1
  42. package/externs/shaka/abortable.js +4 -4
  43. package/externs/shaka/abr_manager.js +1 -1
  44. package/externs/shaka/ads.js +45 -6
  45. package/externs/shaka/cea.js +2 -2
  46. package/externs/shaka/codecs.js +4 -4
  47. package/externs/shaka/drm_info.js +6 -6
  48. package/externs/shaka/error.js +5 -5
  49. package/externs/shaka/manifest.js +51 -56
  50. package/externs/shaka/manifest_parser.js +3 -9
  51. package/externs/shaka/net.js +23 -20
  52. package/externs/shaka/offline.js +37 -37
  53. package/externs/shaka/offline_compat_v1.js +10 -10
  54. package/externs/shaka/offline_compat_v2.js +10 -10
  55. package/externs/shaka/player.js +139 -109
  56. package/externs/shaka/text.js +10 -3
  57. package/externs/shaka/transmuxer.js +1 -1
  58. package/externs/videotrack.js +1 -1
  59. package/lib/abr/ewma.js +1 -1
  60. package/lib/abr/simple_abr_manager.js +70 -22
  61. package/lib/ads/ad_manager.js +43 -18
  62. package/lib/ads/ad_utils.js +160 -58
  63. package/lib/ads/ads_stats.js +1 -1
  64. package/lib/ads/client_side_ad_manager.js +2 -2
  65. package/lib/ads/interstitial_ad.js +16 -11
  66. package/lib/ads/interstitial_ad_manager.js +419 -72
  67. package/lib/ads/interstitial_static_ad.js +299 -0
  68. package/lib/ads/media_tailor_ad.js +1 -0
  69. package/lib/ads/media_tailor_ad_manager.js +37 -36
  70. package/lib/ads/server_side_ad_manager.js +7 -6
  71. package/lib/cast/cast_receiver.js +5 -3
  72. package/lib/cast/cast_sender.js +2 -2
  73. package/lib/cast/cast_utils.js +20 -13
  74. package/lib/cea/cea608_data_channel.js +53 -53
  75. package/lib/cea/cea708_service.js +42 -40
  76. package/lib/cea/cea708_window.js +5 -2
  77. package/lib/cea/cea_decoder.js +5 -7
  78. package/lib/cea/mp4_cea_parser.js +1 -1
  79. package/lib/cea/sei_processor.js +1 -1
  80. package/lib/dash/content_protection.js +62 -192
  81. package/lib/dash/dash_parser.js +119 -119
  82. package/lib/dash/mpd_utils.js +14 -13
  83. package/lib/dash/segment_base.js +5 -5
  84. package/lib/dash/segment_list.js +10 -10
  85. package/lib/dash/segment_template.js +55 -53
  86. package/lib/debug/log.js +2 -2
  87. package/lib/dependencies/all.js +2 -1
  88. package/lib/{media → drm}/drm_engine.js +274 -143
  89. package/lib/{util → drm}/drm_utils.js +20 -11
  90. package/lib/drm/playready.js +233 -0
  91. package/lib/hls/hls_classes.js +14 -14
  92. package/lib/hls/hls_parser.js +257 -196
  93. package/lib/hls/hls_utils.js +14 -14
  94. package/lib/hls/manifest_text_parser.js +10 -10
  95. package/lib/media/adaptation_set.js +6 -5
  96. package/lib/media/adaptation_set_criteria.js +51 -379
  97. package/lib/media/buffering_observer.js +5 -4
  98. package/lib/media/closed_caption_parser.js +2 -2
  99. package/lib/media/content_workarounds.js +2 -2
  100. package/lib/media/example_based_criteria.js +69 -0
  101. package/lib/media/gap_jumping_controller.js +14 -1
  102. package/lib/media/manifest_filterer.js +8 -8
  103. package/lib/media/manifest_parser.js +2 -2
  104. package/lib/media/media_source_capabilities.js +20 -1
  105. package/lib/media/media_source_engine.js +84 -35
  106. package/lib/media/mp4_segment_index_parser.js +5 -5
  107. package/lib/media/playhead.js +2 -8
  108. package/lib/media/playhead_observer.js +1 -1
  109. package/lib/media/preference_based_criteria.js +333 -0
  110. package/lib/media/preload_manager.js +53 -37
  111. package/lib/media/presentation_timeline.js +2 -2
  112. package/lib/media/quality_observer.js +35 -35
  113. package/lib/media/region_observer.js +2 -2
  114. package/lib/media/region_timeline.js +3 -3
  115. package/lib/media/segment_index.js +14 -14
  116. package/lib/media/segment_prefetch.js +17 -13
  117. package/lib/media/segment_reference.js +7 -7
  118. package/lib/media/segment_utils.js +9 -9
  119. package/lib/media/streaming_engine.js +77 -38
  120. package/lib/media/time_ranges_utils.js +1 -1
  121. package/lib/media/video_wrapper.js +1 -1
  122. package/lib/media/webm_segment_index_parser.js +4 -4
  123. package/lib/mss/content_protection.js +17 -222
  124. package/lib/mss/mss_parser.js +23 -24
  125. package/lib/net/data_uri_plugin.js +1 -0
  126. package/lib/net/http_fetch_plugin.js +8 -7
  127. package/lib/net/http_plugin_utils.js +5 -2
  128. package/lib/net/http_xhr_plugin.js +4 -3
  129. package/lib/net/networking_engine.js +72 -17
  130. package/lib/net/networking_utils.js +5 -2
  131. package/lib/offline/download_info.js +5 -1
  132. package/lib/offline/download_manager.js +15 -4
  133. package/lib/offline/download_progress_estimator.js +1 -1
  134. package/lib/offline/indexeddb/base_storage_cell.js +9 -9
  135. package/lib/offline/indexeddb/db_connection.js +1 -1
  136. package/lib/offline/indexeddb/db_operation.js +2 -2
  137. package/lib/offline/indexeddb/eme_session_storage_cell.js +1 -1
  138. package/lib/offline/indexeddb/storage_mechanism.js +1 -1
  139. package/lib/offline/indexeddb/v1_storage_cell.js +3 -3
  140. package/lib/offline/indexeddb/v2_storage_cell.js +2 -2
  141. package/lib/offline/manifest_converter.js +11 -12
  142. package/lib/offline/offline_scheme.js +8 -4
  143. package/lib/offline/session_deleter.js +11 -11
  144. package/lib/offline/storage.js +137 -88
  145. package/lib/offline/storage_muxer.js +8 -8
  146. package/lib/offline/stored_content_utils.js +3 -3
  147. package/lib/offline/stream_bandwidth_estimator.js +1 -1
  148. package/lib/player.js +291 -207
  149. package/lib/polyfill/all.js +1 -1
  150. package/lib/polyfill/media_capabilities.js +5 -5
  151. package/lib/polyfill/patchedmediakeys_apple.js +6 -6
  152. package/lib/polyfill/patchedmediakeys_webkit.js +8 -8
  153. package/lib/polyfill/video_play_promise.js +0 -1
  154. package/lib/text/cue.js +3 -2
  155. package/lib/text/lrc_text_parser.js +1 -1
  156. package/lib/text/mp4_ttml_parser.js +1 -1
  157. package/lib/text/mp4_vtt_parser.js +3 -3
  158. package/lib/text/sbv_text_parser.js +1 -1
  159. package/lib/text/simple_text_displayer.js +37 -10
  160. package/lib/text/ssa_text_parser.js +3 -1
  161. package/lib/text/stub_text_displayer.js +12 -5
  162. package/lib/text/text_engine.js +5 -4
  163. package/lib/text/text_utils.js +4 -4
  164. package/lib/text/ttml_text_parser.js +21 -20
  165. package/lib/text/ui_text_displayer.js +20 -13
  166. package/lib/text/vtt_text_parser.js +10 -10
  167. package/lib/text/web_vtt_generator.js +2 -2
  168. package/lib/transmuxer/aac_transmuxer.js +2 -2
  169. package/lib/transmuxer/ac3_transmuxer.js +2 -2
  170. package/lib/transmuxer/adts.js +2 -0
  171. package/lib/transmuxer/ec3.js +3 -3
  172. package/lib/transmuxer/ec3_transmuxer.js +2 -2
  173. package/lib/transmuxer/h264.js +5 -5
  174. package/lib/transmuxer/h265.js +3 -3
  175. package/lib/transmuxer/mp3_transmuxer.js +2 -2
  176. package/lib/transmuxer/mpeg_audio.js +6 -6
  177. package/lib/transmuxer/mss_transmuxer.js +2 -0
  178. package/lib/transmuxer/transmuxer_engine.js +1 -1
  179. package/lib/transmuxer/ts_transmuxer.js +10 -10
  180. package/lib/util/abortable_operation.js +10 -10
  181. package/lib/util/array_utils.js +6 -6
  182. package/lib/util/cmcd_manager.js +149 -18
  183. package/lib/util/cmsd_manager.js +11 -11
  184. package/lib/util/config_utils.js +3 -3
  185. package/lib/util/content_steering_manager.js +17 -17
  186. package/lib/util/data_view_reader.js +3 -3
  187. package/lib/util/ebml_parser.js +1 -1
  188. package/lib/util/error.js +11 -6
  189. package/lib/util/event_manager.js +1 -1
  190. package/lib/util/exp_golomb.js +1 -1
  191. package/lib/util/fairplay_utils.js +6 -1
  192. package/lib/util/fake_event.js +3 -2
  193. package/lib/util/fake_event_target.js +1 -1
  194. package/lib/util/functional.js +8 -8
  195. package/lib/util/id3_utils.js +1 -1
  196. package/lib/util/iterables.js +6 -6
  197. package/lib/util/language_utils.js +17 -17
  198. package/lib/util/manifest_parser_utils.js +13 -13
  199. package/lib/util/map_utils.js +6 -6
  200. package/lib/util/media_ready_state_utils.js +1 -1
  201. package/lib/util/mime_utils.js +15 -4
  202. package/lib/util/mp4_box_parsers.js +5 -5
  203. package/lib/util/mp4_generator.js +31 -30
  204. package/lib/util/mp4_parser.js +2 -2
  205. package/lib/util/multi_map.js +5 -5
  206. package/lib/util/mutex.js +1 -1
  207. package/lib/util/networking.js +1 -1
  208. package/lib/util/object_utils.js +5 -1
  209. package/lib/util/operation_manager.js +1 -1
  210. package/lib/util/periods.js +24 -24
  211. package/lib/util/platform.js +8 -4
  212. package/lib/util/player_configuration.js +50 -17
  213. package/lib/util/pssh.js +34 -6
  214. package/lib/util/public_promise.js +2 -2
  215. package/lib/util/state_history.js +2 -2
  216. package/lib/util/stream_utils.js +138 -120
  217. package/lib/util/string_utils.js +4 -3
  218. package/lib/util/switch_history.js +2 -2
  219. package/lib/util/tXml.js +22 -17
  220. package/lib/util/text_parser.js +2 -2
  221. package/lib/util/timer.js +1 -1
  222. package/lib/util/ts_parser.js +22 -22
  223. package/lib/util/xml_utils.js +1 -0
  224. package/package.json +7 -4
  225. package/project-words.txt +485 -0
  226. package/shaka-player.uncompiled.js +1 -1
  227. package/third_party/closure-uri/uri.js +2 -2
  228. package/third_party/closure-uri/utils.js +2 -2
  229. package/third_party/language-mapping-list/language-mapping-list.js +1 -1
  230. package/ui/ad_statistics_button.js +9 -5
  231. package/ui/airplay_button.js +1 -0
  232. package/ui/audio_language_selection.js +2 -1
  233. package/ui/context_menu.js +2 -2
  234. package/ui/controls.js +7 -7
  235. package/ui/externs/ui.js +29 -21
  236. package/ui/externs/watermark.js +64 -0
  237. package/ui/fast_forward_button.js +1 -1
  238. package/ui/gl_matrix/matrix_4x4.js +11 -5
  239. package/ui/hidden_fast_forward_button.js +1 -1
  240. package/ui/hidden_seek_button.js +1 -1
  241. package/ui/language_utils.js +27 -26
  242. package/ui/less/buttons.less +2 -2
  243. package/ui/localization.js +21 -21
  244. package/ui/loop_button.js +2 -2
  245. package/ui/overflow_menu.js +2 -2
  246. package/ui/playback_rate_selection.js +1 -1
  247. package/ui/presentation_time.js +4 -1
  248. package/ui/range_element.js +2 -2
  249. package/ui/resolution_selection.js +42 -6
  250. package/ui/rewind_button.js +1 -1
  251. package/ui/seek_bar.js +5 -5
  252. package/ui/statistics_button.js +8 -4
  253. package/ui/text_selection.js +3 -2
  254. package/ui/ui.js +32 -2
  255. package/ui/vr_manager.js +3 -3
  256. package/ui/vr_utils.js +14 -14
  257. package/ui/vr_webgl.js +5 -5
  258. package/ui/watermark.js +313 -0
  259. package/.eslintignore +0 -4
  260. package/.eslintrc.js +0 -310
  261. package/lib/polyfill/patchedmediakeys_nop.js +0 -148
@@ -0,0 +1,343 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ // ESlint config
8
+
9
+ import js from '@eslint/js';
10
+ import google from 'eslint-config-google';
11
+ import jsdoc from 'eslint-plugin-jsdoc';
12
+ import shakaRules from 'eslint-plugin-shaka-rules';
13
+ import globals from 'globals';
14
+
15
+ // This is a matcher (usable in no-restricted-syntax) that matches either a
16
+ // test or a before/after block.
17
+ const testNameRegex =
18
+ '/^([fx]?it|(drm|quarantined)It|(before|after)(Each|All))$/';
19
+ const testCall = `CallExpression[callee.name=${testNameRegex}]`;
20
+
21
+ const commonNoRestrictedSyntax = [
22
+ {
23
+ 'selector':
24
+ 'MemberExpression[object.name="goog"][property.name="inherits"]',
25
+ 'message': 'Don\'t use goog.inherits.',
26
+ },
27
+ {
28
+ 'selector': ':not(MethodDefinition) > FunctionExpression',
29
+ 'message': 'Use arrow functions instead of "function" functions.',
30
+ },
31
+ {
32
+ 'selector': 'CallExpression[callee.property.name="forEach"] >' +
33
+ ':function[params.length=1]',
34
+ 'message': 'Use for-of instead of forEach',
35
+ },
36
+ {
37
+ // NOTE: prefer-spread rule covers .apply() already.
38
+ 'selector': 'CallExpression[callee.property.name=/^(bind|call)$/]',
39
+ 'message': 'Don\'t use Function bind/call.',
40
+ },
41
+ {
42
+ 'selector': 'MemberExpression[property.name="prototype"]',
43
+ 'message': 'Use ES6 classes not .prototype.',
44
+ },
45
+ {
46
+ 'selector': 'BinaryExpression[operator=/^([<>!=]=?)$/] > ' +
47
+ 'CallExpression[callee.property.name=indexOf]',
48
+ 'message': 'Use Array.includes instead of indexOf.',
49
+ },
50
+ ];
51
+
52
+ export default [
53
+ {
54
+ ignores: ['!**/eslint.config.mjs'],
55
+ },
56
+ js.configs.recommended,
57
+ jsdoc.configs['flat/recommended-error'],
58
+ google,
59
+ shakaRules.configs.config,
60
+ {
61
+ languageOptions: {
62
+ globals: globals.browser,
63
+ ecmaVersion: 2017,
64
+ },
65
+ settings: {
66
+ jsdoc: {
67
+ mode: 'closure',
68
+ preferredTypes: {
69
+ '.<>': '<>',
70
+ 'object': 'Object',
71
+ 'symbol': 'Symbol',
72
+ },
73
+ tagNamePreference: {
74
+ augments: 'extends',
75
+ constant: 'const',
76
+ constructor: 'constructor',
77
+ file: 'fileoverview',
78
+ returns: 'return',
79
+ },
80
+ },
81
+ },
82
+ rules: {
83
+ // Things the compiler already takes care of, with more precision: {{{
84
+ 'no-console': 'off',
85
+ 'no-eq-null': 'off',
86
+ 'no-eval': 'off',
87
+ 'no-undef': 'off',
88
+ // }}}
89
+
90
+ // Things we should probably fix, but in stages in multiple commits: {{{
91
+
92
+ // These could catch real bugs
93
+ 'default-case': 'off',
94
+ // TODO: Enable no-loop-func in next eslint release. We can't use it
95
+ // now since it doesn't allow capturing "const" variables, which is safe
96
+ 'no-loop-func': 'off',
97
+ // Conflicts with some Closure declarations
98
+ 'no-unused-expressions': 'off',
99
+ 'prefer-promise-reject-errors': 'off',
100
+ // These could improve readability
101
+ 'complexity': 'off',
102
+ 'no-negated-condition': 'off',
103
+ 'no-shadow': 'off',
104
+ // }}}
105
+
106
+ // "Possible error" rules: {{{
107
+ 'no-async-promise-executor': 'error',
108
+ 'no-await-in-loop': 'error',
109
+ 'no-empty': ['error', {
110
+ allowEmptyCatch: true,
111
+ }],
112
+ 'no-misleading-character-class': 'error',
113
+ 'no-template-curly-in-string': 'error',
114
+ 'no-fallthrough': ['error', {
115
+ allowEmptyCase: true,
116
+ }],
117
+ // TODO: Try to re-enable this if possible. Right now, it produces way
118
+ // too many false-positives with eslint 7.
119
+ // It worked well enough in eslint 5.
120
+ // 'require-atomic-updates': 'error',
121
+ // }}}
122
+
123
+ // "Best practices" rules: {{{
124
+ 'accessor-pairs': 'error',
125
+ 'array-callback-return': 'error',
126
+ // causes issues when implementing an interface
127
+ 'class-methods-use-this': 'off',
128
+ 'consistent-return': 'error',
129
+ 'dot-location': ['error', 'property'],
130
+ 'dot-notation': 'off', // We use bracket notation in tests on purpose
131
+ 'eqeqeq': 'off', // Compiler handles type checking in advance
132
+ 'guard-for-in': 'off',
133
+ 'no-alert': 'error',
134
+ 'no-caller': 'error',
135
+ 'no-div-regex': 'error',
136
+ 'no-extend-native': 'error', // May conflict with future polyfills
137
+ 'no-extra-label': 'error',
138
+ 'no-floating-decimal': 'error',
139
+ 'no-implicit-coercion': ['error', {
140
+ allow: ['!!'],
141
+ }],
142
+ 'no-implied-eval': 'error',
143
+ 'no-invalid-this': 'error',
144
+ 'no-iterator': 'error',
145
+ 'no-labels': 'error',
146
+ 'no-lone-blocks': 'error',
147
+ 'no-multi-spaces': ['error', {
148
+ ignoreEOLComments: true,
149
+ }],
150
+ 'no-multi-str': 'error',
151
+ 'no-new': 'error',
152
+ 'no-new-func': 'error',
153
+ 'no-new-wrappers': 'error',
154
+ 'no-octal-escape': 'error',
155
+ 'no-proto': 'error',
156
+ 'no-return-assign': 'error',
157
+ 'no-return-await': 'error',
158
+ 'no-script-url': 'error',
159
+ 'no-self-compare': 'error',
160
+ 'no-sequences': 'error',
161
+ 'no-throw-literal': 'error',
162
+ 'no-unmodified-loop-condition': 'error',
163
+ // Interface implementations may not require all args
164
+ 'no-unused-vars': 'off',
165
+ 'no-useless-call': 'error',
166
+ 'no-useless-catch': 'error',
167
+ 'no-useless-concat': 'error',
168
+ 'no-useless-return': 'error',
169
+ 'no-void': 'error',
170
+ 'no-warning-comments': 'off', // TODO and FIXME are fine
171
+ 'radix': ['error', 'always'],
172
+ 'require-await': 'error',
173
+ 'wrap-iife': ['error', 'inside'],
174
+ 'yoda': ['error', 'never'],
175
+ // }}}
176
+
177
+ // "Variables" rules: {{{
178
+ 'no-label-var': 'error',
179
+ 'no-shadow-restricted-names': 'error',
180
+ 'no-undef-init': 'off', // Sometimes necessary with hacky compiler casts
181
+ 'no-undefined': 'off', // We use undefined in many places, legitimately
182
+ // Does not know when things are executed, false positives
183
+ 'no-use-before-define': 'off',
184
+ // }}}
185
+
186
+ // "Stylistic Issues" rules: {{{
187
+ 'array-bracket-newline': ['error', 'consistent'],
188
+ 'block-spacing': ['error', 'always'],
189
+ 'brace-style': ['error', '1tbs', {
190
+ allowSingleLine: true,
191
+ }],
192
+ 'id-denylist': ['error', 'async'],
193
+ 'lines-between-class-members': 'error',
194
+ 'max-statements-per-line': ['error', {
195
+ max: 1,
196
+ }],
197
+ 'new-parens': 'error',
198
+ 'no-mixed-operators': ['error', {
199
+ groups: [['&', '|', '^', '~', '<<', '>>', '>>>', '&&', '||']],
200
+ allowSamePrecedence: false,
201
+ }],
202
+ 'no-restricted-syntax': [
203
+ 'error',
204
+ ...commonNoRestrictedSyntax,
205
+ ],
206
+ 'no-whitespace-before-property': 'error',
207
+ // cspell:ignore nonblock
208
+ 'nonblock-statement-body-position': ['error', 'below'],
209
+ 'operator-assignment': 'error',
210
+ 'spaced-comment': ['error', 'always', {
211
+ // Characters which may be glued to the start of a comment block, but
212
+ // which do not violate the rule. The "*" is for jsdoc's "/**" syntax,
213
+ // and the "!" is for the "/*!" of license headers which are passed
214
+ // verbatim through the compiler.
215
+ markers: ['*', '!'],
216
+ }],
217
+ // }}}
218
+
219
+ // "ECMAScript 6" rules: {{{
220
+ 'arrow-spacing': 'error',
221
+ 'no-useless-constructor': 'error',
222
+ 'prefer-arrow-callback': 'error',
223
+ 'prefer-const': ['error', {
224
+ ignoreReadBeforeAssign: true,
225
+ }],
226
+ // }}}
227
+
228
+ // jsdoc rules {{{
229
+ 'jsdoc/check-tag-names': ['error', {
230
+ definedTags: ['exportDoc', 'exportInterface'],
231
+ }],
232
+ // Do not check license, authors, etc
233
+ 'jsdoc/check-values': 'off',
234
+ // This should be checked by the compiler
235
+ 'jsdoc/no-undefined-types': 'off',
236
+ // Some params/props/returns are self-explanatory
237
+ 'jsdoc/require-param-description': 'off',
238
+ 'jsdoc/require-property-description': 'off',
239
+ 'jsdoc/require-returns-description': 'off',
240
+ 'jsdoc/tag-lines': 'off',
241
+ // It throws syntax error on @suppress {missingReturn}
242
+ 'jsdoc/valid-types': 'off',
243
+ // }}}
244
+ },
245
+ },
246
+ {
247
+ files: ['test/**/*.js'],
248
+ rules: {
249
+ 'no-restricted-syntax': [
250
+ 'error',
251
+ {
252
+ 'selector': 'CallExpression[callee.name="beforeAll"] ' +
253
+ ':matches(' +
254
+ 'CallExpression[callee.property.name="createSpy"],' +
255
+ 'CallExpression[callee.name="spyOn"])',
256
+ 'message': 'Create spies in beforeEach, not beforeAll.',
257
+ },
258
+ {
259
+ 'selector': testCall + ' > :function[params.length>0]',
260
+ 'message': 'Use async instead of "done" in tests.',
261
+ },
262
+ {
263
+ 'selector': testCall + ' > CallExpression',
264
+ 'message': 'Use filterDescribe instead of checkAndRun calls',
265
+ },
266
+ {
267
+ 'selector': 'CatchClause',
268
+ 'message': 'Use expect.toThrow or expectAsync.toBeRejected',
269
+ },
270
+ {
271
+ 'selector': 'CallExpression[callee.name=expect] >' +
272
+ 'CallExpression[callee.property.name=count]' +
273
+ '[callee.object.property.name=calls]',
274
+ 'message': 'Use expect.toHaveBeenCalledTimes',
275
+ },
276
+ {
277
+ 'selector':
278
+ 'CallExpression[callee.property.name=toHaveBeenCalledTimes] >' +
279
+ 'Literal[value=0]',
280
+ 'message': 'Use expect.not.toHaveBeenCalled',
281
+ },
282
+ ...commonNoRestrictedSyntax,
283
+ ],
284
+ },
285
+ },
286
+ {
287
+ files: [
288
+ // Closure requires using var in externs.
289
+ 'ui/externs/*.js',
290
+ 'externs/**/*.js',
291
+ 'test/test/externs/*.js',
292
+ // Use var in load.js so it works in old browsers. We'll use
293
+ // compiled mode for the main library and the demo.
294
+ 'demo/load.js',
295
+ ],
296
+ rules: {
297
+ 'no-restricted-syntax': 'off',
298
+ 'no-var': 'off',
299
+ 'jsdoc/require-returns-check': 'off',
300
+ },
301
+ },
302
+ {
303
+ files: [
304
+ // Test code should still use "arguments", since the alternate
305
+ // "rest parameter" syntax won't work in uncompiled code on IE.
306
+ 'test/**/*.js',
307
+ // These two files use "arguments" to patch over functions. It
308
+ // is difficult to reason about whether or not these instances
309
+ // would always work with rest parameters, so just allow them to
310
+ 'demo/log_section.js',
311
+ 'lib/debug/asserts.js',
312
+ ],
313
+ rules: {
314
+ 'prefer-rest-params': 'off',
315
+ },
316
+ },
317
+ {
318
+ files: ['externs/**/*.js'],
319
+ rules: {
320
+ // Disable rules on useless constructors so we can use ES6 classes in
321
+ // externs.
322
+ 'no-useless-constructor': 'off',
323
+ },
324
+ },
325
+ {
326
+ files: ['ui/externs/*.js', 'externs/**/*.js', 'test/test/externs/*.js'],
327
+ rules: {
328
+ // Externs naturally redeclare things eslint knows about.
329
+ 'no-redeclare': 'off',
330
+ },
331
+ },
332
+ {
333
+ files: [
334
+ 'demo/load.js',
335
+ 'externs/**/*.js',
336
+ 'test/**/*.js',
337
+ ],
338
+ rules: {
339
+ // JSDoc is not strictly required in externs, tests, and in load.js.
340
+ 'jsdoc/require-jsdoc': 'off',
341
+ },
342
+ },
343
+ ];
@@ -26,5 +26,5 @@ HTMLMediaElement.prototype.webkitShowPlaybackTargetPicker = function() {};
26
26
 
27
27
  var AirPlayEvent = class extends Event {};
28
28
 
29
- /** @type {String} */
29
+ /** @type {string} */
30
30
  AirPlayEvent.prototype.availability;
@@ -34,7 +34,7 @@ AudioTrack.prototype.sourceBuffer;
34
34
 
35
35
 
36
36
  /**
37
- * @extends {IArrayLike.<AudioTrack>}
37
+ * @extends {IArrayLike<AudioTrack>}
38
38
  * @extends {EventTarget}
39
39
  * @interface
40
40
  */
@@ -13,7 +13,7 @@
13
13
  class Awesomplete {
14
14
  /** @param {!Element} input */
15
15
  constructor(input) {
16
- /** @type {!Array.<string>} */
16
+ /** @type {!Array<string>} */
17
17
  this.list;
18
18
 
19
19
  /** @type {number} */
@@ -93,7 +93,7 @@ cast.receiver.CastReceiverManager = class {
93
93
  */
94
94
  getCastMessageBus(namespace, messageType) {}
95
95
 
96
- /** @return {Array.<string>} */
96
+ /** @return {Array<string>} */
97
97
  getSenders() {}
98
98
 
99
99
  start() {}
@@ -268,7 +268,7 @@ chrome.cast.Session = class {
268
268
  chrome.cast.SessionRequest = class {
269
269
  /**
270
270
  * @param {string} appId
271
- * @param {Array.<Object>} capabilities
271
+ * @param {Array<Object>} capabilities
272
272
  * @param {?number} timeout
273
273
  * @param {boolean} androidReceiverCompatible
274
274
  * @param {Object} credentialsData
package/externs/cmcd.js CHANGED
@@ -31,7 +31,9 @@
31
31
  * st: (string|undefined),
32
32
  * v: (number|undefined),
33
33
  * bs: (boolean|undefined),
34
- * rtp: (number|undefined)
34
+ * rtp: (number|undefined),
35
+ * msd: (number|undefined),
36
+ * ltc: (number|undefined),
35
37
  * }}
36
38
  *
37
39
  * @description
@@ -182,5 +184,18 @@
182
184
  * delivery. The concept is that each client receives the throughput necessary
183
185
  * for great performance, but no more. The CDN may not support the rtp
184
186
  * feature.
187
+ *
188
+ * @property {number} msd
189
+ * The Media Start Delay represents in milliseconds the delay between the
190
+ * initiation of the playback request and the moment the first frame is
191
+ * rendered. This is sent only once when it is calculated.
192
+ *
193
+ * @property {number} ltc
194
+ * Live Stream Latency
195
+ *
196
+ * The time delta between when a given media timestamp was made available at
197
+ * the origin and when it was rendered by the client. The accuracy of this
198
+ * estimate is dependent on synchronization between the packager and the
199
+ * player clocks.
185
200
  */
186
201
  var CmcdData;
@@ -13,6 +13,6 @@
13
13
 
14
14
 
15
15
  /**
16
- * @return {!Promise.<string>}
16
+ * @return {!Promise<string>}
17
17
  */
18
18
  DeviceMotionEvent.requestPermission = function() {};
package/externs/ima.js CHANGED
@@ -96,7 +96,7 @@ google.ima.AdsManager = class {
96
96
  resize(width, height, viewMode) {}
97
97
 
98
98
  /**
99
- * @return {!Array.<number>}
99
+ * @return {!Array<number>}
100
100
  */
101
101
  getCuePoints() {}
102
102
 
@@ -133,10 +133,10 @@ google.ima.AdsManagerLoadedEvent = class extends Event {
133
133
  * bitrate: (number),
134
134
  * enablePreloading: (boolean),
135
135
  * loadVideoTimeout: (number),
136
- * mimeTypes: (?Array.<string>),
136
+ * mimeTypes: (?Array<string>),
137
137
  * playAdsAfterTime: (number),
138
138
  * restoreCustomPlaybackStateOnAdBreakComplete: (boolean),
139
- * uiElements: (?Array.<string>),
139
+ * uiElements: (?Array<string>),
140
140
  * useStyledLinearAds: (boolean),
141
141
  * useStyledNonLinearAds: (boolean),
142
142
  * }}
@@ -161,7 +161,7 @@ google.ima.AdsManagerLoadedEvent = class extends Event {
161
161
  * If loading takes longer than this timeout, the ad playback is canceled
162
162
  * and the next ad in the pod plays, if available.
163
163
  * Use -1 for the default of 8 seconds.
164
- * @property {?Array.<string>} mimeTypes
164
+ * @property {?Array<string>} mimeTypes
165
165
  * Only supported for linear video mime types.
166
166
  * If specified, the SDK will include media that matches
167
167
  * the MIME type(s) specified in the list and exclude media.
@@ -180,7 +180,7 @@ google.ima.AdsManagerLoadedEvent = class extends Event {
180
180
  * state after an ad break completes. This is setting is used primarily
181
181
  * when the publisher passes in its content player to use for
182
182
  * custom ad playback.
183
- * @property {?Array.<string>} uiElements
183
+ * @property {?Array<string>} uiElements
184
184
  * Specifies whether the UI elements that should be displayed.
185
185
  * The elements in this array are ignored for AdSense/AdX ads.
186
186
  * @property {boolean} useStyledLinearAds
@@ -518,7 +518,7 @@ google.ima.dai.api.Ad = class {
518
518
  /** @return {string} */
519
519
  getCreativeAdId() {}
520
520
 
521
- /** @return {!Array.<!google.ima.dai.api.CompanionAd>} */
521
+ /** @return {!Array<!google.ima.dai.api.CompanionAd>} */
522
522
  getCompanionAds() {}
523
523
  };
524
524
 
@@ -606,7 +606,7 @@ google.ima.dai.api.StreamData.prototype.adProgressData;
606
606
  google.ima.dai.api.StreamData.prototype.url;
607
607
 
608
608
 
609
- /** @type {!Array.<!google.ima.dai.api.CuePoint>} */
609
+ /** @type {!Array<!google.ima.dai.api.CuePoint>} */
610
610
  google.ima.dai.api.StreamData.prototype.cuepoints;
611
611
 
612
612
 
@@ -657,7 +657,7 @@ google.ima.dai.api.StreamRequest.prototype.format;
657
657
 
658
658
 
659
659
  /**
660
- * @type {Object.<
660
+ * @type {Object<
661
661
  * google.ima.dai.api.OmidVerificationVendor,
662
662
  * (google.ima.dai.api.OmidAccessMode | undefined)>}
663
663
  */
@@ -57,8 +57,8 @@ var ISOBoxerUtils;
57
57
  * type: string,
58
58
  * size: number,
59
59
  * _parent: ISOBox,
60
- * boxes: !Array.<!ISOBox>,
61
- * entry: !Array.<!Object>,
60
+ * boxes: !Array<!ISOBox>,
61
+ * entry: !Array<!Object>,
62
62
  * version: !number,
63
63
  * flags: !number,
64
64
  * sample_count: !number,
@@ -73,8 +73,8 @@ var ISOBoxerUtils;
73
73
  * _procSubEntries: function(!ISOBox, !string, !number, !function(!ISOEntry)),
74
74
  * major_brand: string,
75
75
  * minor_version: number,
76
- * compatible_brands: Array.<string>,
77
- * _data: Array.<number>,
76
+ * compatible_brands: Array<string>,
77
+ * _data: Array<number>,
78
78
  * creation_time: number,
79
79
  * modification_time: number,
80
80
  * timescale: number,
@@ -82,9 +82,9 @@ var ISOBoxerUtils;
82
82
  * rate: number,
83
83
  * volume: number,
84
84
  * reserved1: number,
85
- * reserved2: (Array.<number>|number),
86
- * matrix: Array.<number>,
87
- * pre_defined: (Array.<number>|number),
85
+ * reserved2: (Array<number>|number),
86
+ * matrix: Array<number>,
87
+ * pre_defined: (Array<number>|number),
88
88
  * next_track_ID: number,
89
89
  * track_ID: number,
90
90
  * layer: number,
@@ -95,20 +95,20 @@ var ISOBoxerUtils;
95
95
  * language: string,
96
96
  * handler_type: string,
97
97
  * name: string,
98
- * reserved: Array.<number>,
98
+ * reserved: Array<number>,
99
99
  * graphicsmode: number,
100
- * opcolor: Array.<number>,
100
+ * opcolor: Array<number>,
101
101
  * balance: number,
102
- * entries: Array.<!ISOEntry>,
102
+ * entries: Array<!ISOEntry>,
103
103
  * location: string,
104
104
  * data_reference_index: number,
105
105
  * pre_defined1: number,
106
- * pre_defined2: Array.<number>,
106
+ * pre_defined2: Array<number>,
107
107
  * pre_defined3: number,
108
108
  * horizresolution: number,
109
109
  * vertresolution: number,
110
110
  * frame_count: number,
111
- * compressorname: Array.<number>,
111
+ * compressorname: Array<number>,
112
112
  * depth: number,
113
113
  * config: Uint8Array,
114
114
  * channelcount: number,
@@ -121,23 +121,23 @@ var ISOBoxerUtils;
121
121
  * scheme_version: number,
122
122
  * default_IsEncrypted: number,
123
123
  * default_IV_size: number,
124
- * default_KID: Array.<number>,
124
+ * default_KID: Array<number>,
125
125
  * default_sample_description_index: number,
126
126
  * default_sample_duration: number,
127
127
  * default_sample_size: number,
128
128
  * default_sample_flags: number,
129
129
  * baseMediaDecodeTime: number,
130
130
  * usertype: (string|null|undefined),
131
- * offset: Array.<number>,
132
- * sample_info_size: Array.<number>,
131
+ * offset: Array<number>,
132
+ * sample_info_size: Array<number>,
133
133
  * data_offset: number
134
134
  * }}
135
135
  * @property {boolean} _parsing
136
136
  * @property {string} type
137
137
  * @property {number} size
138
138
  * @property {ISOBox} _parent
139
- * @property {!Array.<!ISOBox>} boxes
140
- * @property {!Array.<!ISOEntry>} entry
139
+ * @property {!Array<!ISOBox>} boxes
140
+ * @property {!Array<!ISOEntry>} entry
141
141
  * @property {!number} version
142
142
  * @property {!number} flags
143
143
  * @property {!number} sample_count
@@ -148,12 +148,12 @@ var ISOBoxerUtils;
148
148
  * @property {function(!string, !number, !string, !number)} _procFieldArray
149
149
  * @property {function(!string, !number, !function(!ISOEntry))} _procEntries
150
150
  * @property {function(!ISOBox, !string, !string, !number)} _procEntryField
151
- * @property {function(!ISOBox, !string, !number, !function(!ISOEntry))}
152
- * _procSubEntries
151
+ * @property {function(!ISOBox, !string, !number, !function(!ISOEntry))
152
+ * } _procSubEntries
153
153
  * @property {string} major_brand
154
154
  * @property {number} minor_version
155
- * @property {Array.<string>} compatible_brands
156
- * @property {Array.<number>} _data
155
+ * @property {Array<string>} compatible_brands
156
+ * @property {Array<number>} _data
157
157
  * @property {number} creation_time
158
158
  * @property {number} modification_time
159
159
  * @property {number} timescale
@@ -161,9 +161,9 @@ var ISOBoxerUtils;
161
161
  * @property {number} rate
162
162
  * @property {number} volume
163
163
  * @property {number} reserved1
164
- * @property {Array.<number>|number} reserved2
165
- * @property {Array.<number>} matrix
166
- * @property {Array.<number>|number} pre_defined
164
+ * @property {Array<number>|number} reserved2
165
+ * @property {Array<number>} matrix
166
+ * @property {Array<number>|number} pre_defined
167
167
  * @property {number} next_track_ID
168
168
  * @property {number} track_ID
169
169
  * @property {number} layer
@@ -174,15 +174,15 @@ var ISOBoxerUtils;
174
174
  * @property {string} language
175
175
  * @property {string} handler_type
176
176
  * @property {string} name
177
- * @property {Array.<number>} reserved
177
+ * @property {Array<number>} reserved
178
178
  * @property {number} graphicsmode
179
- * @property {Array.<number>} opcolor
179
+ * @property {Array<number>} opcolor
180
180
  * @property {number} balance
181
- * @property {Array.<!ISOEntry>} entries
181
+ * @property {Array<!ISOEntry>} entries
182
182
  * @property {string} location
183
183
  * @property {number} data_reference_index
184
184
  * @property {number} pre_defined1
185
- * @property {Array.<number>} pre_defined2
185
+ * @property {Array<number>} pre_defined2
186
186
  * @property {number} pre_defined3
187
187
  * @property {number} horizresolution
188
188
  * @property {number} vertresolution
@@ -200,15 +200,15 @@ var ISOBoxerUtils;
200
200
  * @property {number} scheme_version
201
201
  * @property {number} default_IsEncrypted
202
202
  * @property {number} default_IV_size
203
- * @property {Array.<number>} default_KID
203
+ * @property {Array<number>} default_KID
204
204
  * @property {number} default_sample_description_index
205
205
  * @property {number} default_sample_duration
206
206
  * @property {number} default_sample_size
207
207
  * @property {number} default_sample_flags
208
208
  * @property {number} baseMediaDecodeTime
209
209
  * @property {string|null|undefined} usertype
210
- * @property {Array.<number} offset
211
- * @property {Array.<number} sample_info_size
210
+ * @property {Array<number} offset
211
+ * @property {Array<number} sample_info_size
212
212
  * @property {number} data_offset
213
213
  * @const
214
214
  */
@@ -13,7 +13,7 @@
13
13
  /** A JSON Web Key set. */
14
14
  class JWKSet {
15
15
  constructor() {
16
- /** @type {Array.<JWK>} */
16
+ /** @type {Array<JWK>} */
17
17
  this.keys = [];
18
18
  }
19
19
  }