summaryrefslogtreecommitdiffstats
path: root/mobile/android/modules/geckoview/MediaUtils.sys.mjs
blob: 81dc35a56765e1c0c5bbc5b09b6ccc12cc5fff44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

export const MediaUtils = {
  getMetadata(aElement) {
    if (!aElement) {
      return null;
    }
    return {
      src: aElement.currentSrc ?? aElement.src,
      width: aElement.videoWidth ?? 0,
      height: aElement.videoHeight ?? 0,
      duration: aElement.duration,
      seekable: !!aElement.seekable,
      audioTrackCount:
        aElement.audioTracks?.length ??
        aElement.mozHasAudio ??
        aElement.webkitAudioDecodedByteCount ??
        MediaUtils.isAudioElement(aElement)
          ? 1
          : 0,
      videoTrackCount:
        aElement.videoTracks?.length ?? MediaUtils.isVideoElement(aElement)
          ? 1
          : 0,
    };
  },

  isVideoElement(aElement) {
    return (
      aElement && ChromeUtils.getClassName(aElement) === "HTMLVideoElement"
    );
  },

  isAudioElement(aElement) {
    return (
      aElement && ChromeUtils.getClassName(aElement) === "HTMLAudioElement"
    );
  },

  isMediaElement(aElement) {
    return (
      MediaUtils.isVideoElement(aElement) || MediaUtils.isAudioElement(aElement)
    );
  },

  findMediaElement(aElement) {
    return (
      MediaUtils.findVideoElement(aElement) ??
      MediaUtils.findAudioElement(aElement)
    );
  },

  findVideoElement(aElement) {
    if (!aElement) {
      return null;
    }
    if (MediaUtils.isVideoElement(aElement)) {
      return aElement;
    }
    const childrenMedia = aElement.getElementsByTagName("video");
    if (childrenMedia && childrenMedia.length) {
      return childrenMedia[0];
    }
    return null;
  },

  findAudioElement(aElement) {
    if (!aElement || MediaUtils.isAudioElement(aElement)) {
      return aElement;
    }
    const childrenMedia = aElement.getElementsByTagName("audio");
    if (childrenMedia && childrenMedia.length) {
      return childrenMedia[0];
    }
    return null;
  },
};