版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

433 строки
13 KiB

  1. "use strict";
  2. var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
  3. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  4. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  5. return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
  6. };
  7. var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
  8. if (kind === "m") throw new TypeError("Private method is not writable");
  9. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  10. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  11. return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
  12. };
  13. var __importDefault = (this && this.__importDefault) || function (mod) {
  14. return (mod && mod.__esModule) ? mod : { "default": mod };
  15. };
  16. var _HTMLMediaElement_volume, _HTMLMediaElement_paused, _HTMLMediaElement_currentTime, _HTMLMediaElement_playbackRate, _HTMLMediaElement_defaultPlaybackRate, _HTMLMediaElement_muted, _HTMLMediaElement_defaultMuted, _HTMLMediaElement_preservesPitch;
  17. Object.defineProperty(exports, "__esModule", { value: true });
  18. const Event_1 = __importDefault(require("../../event/Event"));
  19. const DOMException_1 = __importDefault(require("../../exception/DOMException"));
  20. const DOMExceptionNameEnum_1 = __importDefault(require("../../exception/DOMExceptionNameEnum"));
  21. const HTMLElement_1 = __importDefault(require("../html-element/HTMLElement"));
  22. /**
  23. *
  24. * This implementation coming from jsdom
  25. * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/HTMLMediaElement-impl.js#L7
  26. *
  27. */
  28. function getTimeRangeDummy() {
  29. return {
  30. length: 0,
  31. start() {
  32. return 0;
  33. },
  34. end() {
  35. return 0;
  36. }
  37. };
  38. }
  39. /**
  40. * HTML Media Element.
  41. *
  42. * Reference:
  43. * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement.
  44. *
  45. */
  46. class HTMLMediaElement extends HTMLElement_1.default {
  47. constructor() {
  48. super(...arguments);
  49. // Public Properties
  50. this.buffered = getTimeRangeDummy();
  51. this.duration = NaN;
  52. this.error = null;
  53. this.ended = false;
  54. this.networkState = 0;
  55. this.readyState = 0;
  56. this.textTracks = [];
  57. this.videoTracks = [];
  58. this.seeking = false;
  59. this.seekable = getTimeRangeDummy();
  60. this.played = getTimeRangeDummy();
  61. // Events
  62. this.onabort = null;
  63. this.oncanplay = null;
  64. this.oncanplaythrough = null;
  65. this.ondurationchange = null;
  66. this.onemptied = null;
  67. this.onended = null;
  68. this.onerror = null;
  69. this.onloadeddata = null;
  70. this.onloadedmetadata = null;
  71. this.onloadstart = null;
  72. this.onpause = null;
  73. this.onplay = null;
  74. this.onplaying = null;
  75. this.onprogress = null;
  76. this.onratechange = null;
  77. this.onresize = null;
  78. this.onseeked = null;
  79. this.onseeking = null;
  80. this.onstalled = null;
  81. this.onsuspend = null;
  82. this.ontimeupdate = null;
  83. this.onvolumechange = null;
  84. this.onwaiting = null;
  85. _HTMLMediaElement_volume.set(this, 1);
  86. _HTMLMediaElement_paused.set(this, true);
  87. _HTMLMediaElement_currentTime.set(this, 0);
  88. _HTMLMediaElement_playbackRate.set(this, 1);
  89. _HTMLMediaElement_defaultPlaybackRate.set(this, 1);
  90. _HTMLMediaElement_muted.set(this, false);
  91. _HTMLMediaElement_defaultMuted.set(this, false);
  92. _HTMLMediaElement_preservesPitch.set(this, true);
  93. }
  94. /**
  95. * Returns autoplay.
  96. *
  97. * @returns Autoplay.
  98. */
  99. get autoplay() {
  100. return this.getAttributeNS(null, 'autoplay') !== null;
  101. }
  102. /**
  103. * Sets autoplay.
  104. *
  105. * @param autoplay Autoplay.
  106. */
  107. set autoplay(autoplay) {
  108. if (!autoplay) {
  109. this.removeAttributeNS(null, 'autoplay');
  110. }
  111. else {
  112. this.setAttributeNS(null, 'autoplay', '');
  113. }
  114. }
  115. /**
  116. * Returns controls.
  117. *
  118. * @returns Controls.
  119. */
  120. get controls() {
  121. return this.getAttributeNS(null, 'controls') !== null;
  122. }
  123. /**
  124. * Sets controls.
  125. *
  126. * @param controls Controls.
  127. */
  128. set controls(controls) {
  129. if (!controls) {
  130. this.removeAttributeNS(null, 'controls');
  131. }
  132. else {
  133. this.setAttributeNS(null, 'controls', '');
  134. }
  135. }
  136. /**
  137. * Returns loop.
  138. *
  139. * @returns Loop.
  140. */
  141. get loop() {
  142. return this.getAttributeNS(null, 'loop') !== null;
  143. }
  144. /**
  145. * Sets loop.
  146. *
  147. * @param loop Loop.
  148. */
  149. set loop(loop) {
  150. if (!loop) {
  151. this.removeAttributeNS(null, 'loop');
  152. }
  153. else {
  154. this.setAttributeNS(null, 'loop', '');
  155. }
  156. }
  157. /**
  158. * Returns muted.
  159. *
  160. * @returns Muted.
  161. */
  162. get muted() {
  163. if (__classPrivateFieldGet(this, _HTMLMediaElement_muted, "f")) {
  164. return __classPrivateFieldGet(this, _HTMLMediaElement_muted, "f");
  165. }
  166. if (!__classPrivateFieldGet(this, _HTMLMediaElement_defaultMuted, "f")) {
  167. return this.getAttributeNS(null, 'muted') !== null;
  168. }
  169. return false;
  170. }
  171. /**
  172. * Sets muted.
  173. *
  174. * @param muted Muted.
  175. */
  176. set muted(muted) {
  177. __classPrivateFieldSet(this, _HTMLMediaElement_muted, !!muted, "f");
  178. if (!muted && !__classPrivateFieldGet(this, _HTMLMediaElement_defaultMuted, "f")) {
  179. this.removeAttributeNS(null, 'muted');
  180. }
  181. else {
  182. this.setAttributeNS(null, 'muted', '');
  183. }
  184. }
  185. /**
  186. * Returns defaultMuted.
  187. *
  188. * @returns DefaultMuted.
  189. */
  190. get defaultMuted() {
  191. return __classPrivateFieldGet(this, _HTMLMediaElement_defaultMuted, "f");
  192. }
  193. /**
  194. * Sets defaultMuted.
  195. *
  196. * @param defaultMuted DefaultMuted.
  197. */
  198. set defaultMuted(defaultMuted) {
  199. __classPrivateFieldSet(this, _HTMLMediaElement_defaultMuted, !!defaultMuted, "f");
  200. if (!__classPrivateFieldGet(this, _HTMLMediaElement_defaultMuted, "f") && !__classPrivateFieldGet(this, _HTMLMediaElement_muted, "f")) {
  201. this.removeAttributeNS(null, 'muted');
  202. }
  203. else {
  204. this.setAttributeNS(null, 'muted', '');
  205. }
  206. }
  207. /**
  208. * Returns src.
  209. *
  210. * @returns Src.
  211. */
  212. get src() {
  213. return this.getAttributeNS(null, 'src') || '';
  214. }
  215. /**
  216. * Sets src.
  217. *
  218. * @param src Src.
  219. */
  220. set src(src) {
  221. this.setAttributeNS(null, 'src', src);
  222. if (Boolean(src)) {
  223. this.dispatchEvent(new Event_1.default('canplay', { bubbles: false, cancelable: false }));
  224. this.dispatchEvent(new Event_1.default('durationchange', { bubbles: false, cancelable: false }));
  225. }
  226. }
  227. /**
  228. * Returns currentSrc.
  229. *
  230. * @returns CurrentrSrc.
  231. */
  232. get currentSrc() {
  233. return this.src;
  234. }
  235. /**
  236. * Returns volume.
  237. *
  238. * @returns Volume.
  239. */
  240. get volume() {
  241. return __classPrivateFieldGet(this, _HTMLMediaElement_volume, "f");
  242. }
  243. /**
  244. * Sets volume.
  245. *
  246. * @param volume Volume.
  247. */
  248. set volume(volume) {
  249. const parsedVolume = Number(volume);
  250. if (isNaN(parsedVolume)) {
  251. throw new TypeError(`Failed to set the 'volume' property on 'HTMLMediaElement': The provided double value is non-finite.`);
  252. }
  253. if (parsedVolume < 0 || parsedVolume > 1) {
  254. throw new DOMException_1.default(`Failed to set the 'volume' property on 'HTMLMediaElement': The volume provided (${parsedVolume}) is outside the range [0, 1].`, DOMExceptionNameEnum_1.default.indexSizeError);
  255. }
  256. // TODO: volumechange event https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volumechange_event
  257. __classPrivateFieldSet(this, _HTMLMediaElement_volume, parsedVolume, "f");
  258. }
  259. /**
  260. * Returns crossOrigin.
  261. *
  262. * @returns CrossOrigin.
  263. */
  264. get crossOrigin() {
  265. return this.getAttributeNS(null, 'crossorigin');
  266. }
  267. /**
  268. * Sets crossOrigin.
  269. *
  270. * @param crossOrigin CrossOrigin.
  271. */
  272. set crossOrigin(crossOrigin) {
  273. if (crossOrigin === null) {
  274. return;
  275. }
  276. if (['', 'use-credentials', 'anonymous'].includes(crossOrigin)) {
  277. this.setAttributeNS(null, 'crossorigin', crossOrigin);
  278. }
  279. else {
  280. this.setAttributeNS(null, 'crossorigin', 'anonymous');
  281. }
  282. }
  283. /**
  284. * Returns currentTime.
  285. *
  286. * @returns CurrentTime.
  287. */
  288. get currentTime() {
  289. return __classPrivateFieldGet(this, _HTMLMediaElement_currentTime, "f");
  290. }
  291. /**
  292. * Sets currentTime.
  293. *
  294. * @param currentTime CurrentTime.
  295. */
  296. set currentTime(currentTime) {
  297. const parsedCurrentTime = Number(currentTime);
  298. if (isNaN(parsedCurrentTime)) {
  299. throw new TypeError(`Failed to set the 'currentTime' property on 'HTMLMediaElement': The provided double value is non-finite.`);
  300. }
  301. __classPrivateFieldSet(this, _HTMLMediaElement_currentTime, parsedCurrentTime, "f");
  302. }
  303. /**
  304. * Returns playbackRate.
  305. *
  306. * @returns PlaybackRate.
  307. */
  308. get playbackRate() {
  309. return __classPrivateFieldGet(this, _HTMLMediaElement_playbackRate, "f");
  310. }
  311. /**
  312. * Sets playbackRate.
  313. *
  314. * @param playbackRate PlaybackRate.
  315. */
  316. set playbackRate(playbackRate) {
  317. const parsedPlaybackRate = Number(playbackRate);
  318. if (isNaN(parsedPlaybackRate)) {
  319. throw new TypeError(`Failed to set the 'playbackRate' property on 'HTMLMediaElement': The provided double value is non-finite.`);
  320. }
  321. __classPrivateFieldSet(this, _HTMLMediaElement_playbackRate, parsedPlaybackRate, "f");
  322. }
  323. /**
  324. * Returns defaultPlaybackRate.
  325. *
  326. * @returns DefaultPlaybackRate.
  327. */
  328. get defaultPlaybackRate() {
  329. return __classPrivateFieldGet(this, _HTMLMediaElement_defaultPlaybackRate, "f");
  330. }
  331. /**
  332. * Sets defaultPlaybackRate.
  333. *
  334. * @param defaultPlaybackRate DefaultPlaybackRate.
  335. */
  336. set defaultPlaybackRate(defaultPlaybackRate) {
  337. const parsedDefaultPlaybackRate = Number(defaultPlaybackRate);
  338. if (isNaN(parsedDefaultPlaybackRate)) {
  339. throw new TypeError(`Failed to set the 'defaultPlaybackRate' property on 'HTMLMediaElement': The provided double value is non-finite.`);
  340. }
  341. __classPrivateFieldSet(this, _HTMLMediaElement_defaultPlaybackRate, parsedDefaultPlaybackRate, "f");
  342. }
  343. /**
  344. * Returns preservesPitch.
  345. *
  346. * @returns PlaybackRate.
  347. */
  348. get preservesPitch() {
  349. return __classPrivateFieldGet(this, _HTMLMediaElement_preservesPitch, "f");
  350. }
  351. /**
  352. * Sets preservesPitch.
  353. *
  354. * @param preservesPitch PreservesPitch.
  355. */
  356. set preservesPitch(preservesPitch) {
  357. __classPrivateFieldSet(this, _HTMLMediaElement_preservesPitch, Boolean(preservesPitch), "f");
  358. }
  359. /**
  360. * Returns preload.
  361. *
  362. * @returns preload.
  363. */
  364. get preload() {
  365. return this.getAttributeNS(null, 'preload') || 'auto';
  366. }
  367. /**
  368. * Sets preload.
  369. *
  370. * @param preload preload.
  371. */
  372. set preload(preload) {
  373. this.setAttributeNS(null, 'preload', preload);
  374. }
  375. /**
  376. * Returns paused.
  377. *
  378. * @returns Paused.
  379. */
  380. get paused() {
  381. return __classPrivateFieldGet(this, _HTMLMediaElement_paused, "f");
  382. }
  383. /**
  384. * Pause played media.
  385. */
  386. pause() {
  387. __classPrivateFieldSet(this, _HTMLMediaElement_paused, true, "f");
  388. this.dispatchEvent(new Event_1.default('pause', { bubbles: false, cancelable: false }));
  389. }
  390. /**
  391. * Start playing media.
  392. */
  393. async play() {
  394. __classPrivateFieldSet(this, _HTMLMediaElement_paused, false, "f");
  395. return Promise.resolve();
  396. }
  397. /**
  398. *
  399. * @param _type
  400. */
  401. canPlayType(_type) {
  402. return '';
  403. }
  404. /**
  405. * Load media.
  406. */
  407. load() {
  408. this.dispatchEvent(new Event_1.default('emptied', { bubbles: false, cancelable: false }));
  409. }
  410. /**
  411. *
  412. */
  413. captureStream() {
  414. return {};
  415. }
  416. /**
  417. * Clones a node.
  418. *
  419. * @override
  420. * @param [deep=false] "true" to clone deep.
  421. * @returns Cloned node.
  422. */
  423. /**
  424. *
  425. * @param deep
  426. */
  427. cloneNode(deep = false) {
  428. return super.cloneNode(deep);
  429. }
  430. }
  431. exports.default = HTMLMediaElement;
  432. _HTMLMediaElement_volume = new WeakMap(), _HTMLMediaElement_paused = new WeakMap(), _HTMLMediaElement_currentTime = new WeakMap(), _HTMLMediaElement_playbackRate = new WeakMap(), _HTMLMediaElement_defaultPlaybackRate = new WeakMap(), _HTMLMediaElement_muted = new WeakMap(), _HTMLMediaElement_defaultMuted = new WeakMap(), _HTMLMediaElement_preservesPitch = new WeakMap();
  433. //# sourceMappingURL=HTMLMediaElement.js.map