summaryrefslogtreecommitdiffstats
path: root/dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html
blob: 98548b21587e5793a3be660d3f1a22941edc6ecc (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<!DOCTYPE HTML>
<html>
<head>
  <script type="application/javascript" src="pc.js"></script>
  <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript;version=1.8">
createHTML({
  bug: "1219711",
  title: "Disabling locally should be reflected remotely, individually for clones"
});

runNetworkTest(() => {
  var test = new PeerConnectionTest();

  var originalStream;
  var localVideoOriginal;

  // Always use fake tracks since we depend on audio to have a large 1000Hz
  // component.
  test.setMediaConstraints([{audio: true, video: true, fake: true}], []);
  test.chain.replace("PC_LOCAL_GUM", [
    function PC_LOCAL_GUM_CLONE() {
      return getUserMedia(test.pcLocal.constraints[0]).then(stream => {
        originalStream = stream;
        localVideoOriginal =
          createMediaElement("video", "local-original");
        localVideoOriginal.srcObject = stream;
        test.pcLocal.attachLocalStream(originalStream.clone());
      });
    }
  ]);
  test.chain.append([
    function CHECK_ASSUMPTIONS() {
      is(test.pcLocal.localMediaElements.length, 2,
         "pcLocal should have one media element");
      is(test.pcRemote.remoteMediaElements.length, 2,
         "pcRemote should have one media element");
      is(test.pcLocal._pc.getLocalStreams().length, 1,
         "pcLocal should have one stream");
      is(test.pcRemote._pc.getRemoteStreams().length, 1,
         "pcRemote should have one stream");
    },
    function CHECK_VIDEO() {
      info("Checking video");
      var h = new CaptureStreamTestHelper2D();
      var localVideoClone = test.pcLocal.localMediaElements
        .find(e => e instanceof HTMLVideoElement);
      var remoteVideoClone = test.pcRemote.remoteMediaElements
        .find(e => e instanceof HTMLVideoElement);

      // We check a pixel somewhere away from the top left corner since
      // MediaEngineDefault puts semi-transparent time indicators there.
      const offsetX = 50;
      const offsetY = 50;
      const threshold = 128;
      const remoteDisabledColor = h.black;

      // We're regarding black as disabled here, and we're setting the alpha
      // channel of the pixel to 255 to disregard alpha when testing.
      var checkVideoEnabled = video =>
        h.waitForPixel(video, offsetX, offsetY,
                       px => (px[3] = 255, h.isPixelNot(px, h.black, threshold)));
      var checkVideoDisabled = video =>
        h.waitForPixel(video, offsetX, offsetY,
                       px => (px[3] = 255, h.isPixel(px, h.black, threshold)));

      return Promise.resolve()
        .then(() => info("Checking local original enabled"))
        .then(() => checkVideoEnabled(localVideoOriginal))
        .then(() => info("Checking local clone enabled"))
        .then(() => checkVideoEnabled(localVideoClone))
        .then(() => info("Checking remote clone enabled"))
        .then(() => checkVideoEnabled(remoteVideoClone))

        .then(() => info("Disabling original"))
        .then(() => originalStream.getVideoTracks()[0].enabled = false)

        .then(() => info("Checking local original disabled"))
        .then(() => checkVideoDisabled(localVideoOriginal))
        .then(() => info("Checking local clone enabled"))
        .then(() => checkVideoEnabled(localVideoClone))
        .then(() => info("Checking remote clone enabled"))
        .then(() => checkVideoEnabled(remoteVideoClone))

        .then(() => info("Re-enabling original; disabling clone"))
        .then(() => originalStream.getVideoTracks()[0].enabled = true)
        .then(() => test.pcLocal._pc.getLocalStreams()[0].getVideoTracks()[0].enabled = false)

        .then(() => info("Checking local original enabled"))
        .then(() => checkVideoEnabled(localVideoOriginal))
        .then(() => info("Checking local clone disabled"))
        .then(() => checkVideoDisabled(localVideoClone))
        .then(() => info("Checking remote clone disabled"))
        .then(() => checkVideoDisabled(remoteVideoClone))
    },
    function CHECK_AUDIO() {
      info("Checking audio");
      var ac = new AudioContext();
      var localAnalyserOriginal = new AudioStreamAnalyser(ac, originalStream);
      var localAnalyserClone =
        new AudioStreamAnalyser(ac, test.pcLocal._pc.getLocalStreams()[0]);
      var remoteAnalyserClone =
        new AudioStreamAnalyser(ac, test.pcRemote._pc.getRemoteStreams()[0]);

      var freq1k = localAnalyserOriginal.binIndexForFrequency(1000);
      var checkAudioEnabled = analyser =>
        analyser.waitForAnalysisSuccess(array => array[freq1k] > 200);
      var checkAudioDisabled = analyser =>
        analyser.waitForAnalysisSuccess(array => array[freq1k] < 50);

      return Promise.resolve()
        .then(() => info("Checking local original enabled"))
        .then(() => checkAudioEnabled(localAnalyserOriginal))
        .then(() => info("Checking local clone enabled"))
        .then(() => checkAudioEnabled(localAnalyserClone))
        .then(() => info("Checking remote clone enabled"))
        .then(() => checkAudioEnabled(remoteAnalyserClone))

        .then(() => info("Disabling original"))
        .then(() => originalStream.getAudioTracks()[0].enabled = false)

        .then(() => info("Checking local original disabled"))
        .then(() => checkAudioDisabled(localAnalyserOriginal))
        .then(() => info("Checking local clone enabled"))
        .then(() => checkAudioEnabled(localAnalyserClone))
        .then(() => info("Checking remote clone enabled"))
        .then(() => checkAudioEnabled(remoteAnalyserClone))

        .then(() => info("Re-enabling original; disabling clone"))
        .then(() => originalStream.getAudioTracks()[0].enabled = true)
        .then(() => test.pcLocal._pc.getLocalStreams()[0].getAudioTracks()[0].enabled = false)

        .then(() => info("Checking local original enabled"))
        .then(() => checkAudioEnabled(localAnalyserOriginal))
        .then(() => info("Checking local clone disabled"))
        .then(() => checkAudioDisabled(localAnalyserClone))
        .then(() => info("Checking remote clone disabled"))
        .then(() => checkAudioDisabled(remoteAnalyserClone))
    }
  ]);
  test.run();
});
</script>
</pre>
</body>
</html>