DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (b6d82b1a6b02)

VCS Links

Line Code
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 150 151 152 153 154 155 156 157
<!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">
createHTML({
  bug: "1219711",
  title: "Disabling locally should be reflected remotely, individually for clones"
});

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

  await pushPrefs(
    ["media.getusermedia.camera.stop_on_disable.enabled", true],
    ["media.getusermedia.camera.stop_on_disable.delay_ms", 0],
    ["media.getusermedia.microphone.stop_on_disable.enabled", true],
    ["media.getusermedia.microphone.stop_on_disable.delay_ms", 0],
    // Always use fake tracks since we depend on audio to have a large 1000Hz
    // component.
    ['media.audio_loopback_dev', ''],
    ['media.navigator.streams.fake', true]);

  var originalStream;
  var localVideoOriginal;

  test.setMediaConstraints([{audio: true, video: 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");
    },
    async 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,
        px => (px[3] = 255, h.isPixelNot(px, h.black, threshold)),
        { offsetX, offsetY }
      );
      var checkVideoDisabled = video => h.waitForPixel(video,
        px => (px[3] = 255, h.isPixel(px, h.black, threshold)),
        { offsetX, offsetY }
      );

      info("Checking local original enabled");
      await checkVideoEnabled(localVideoOriginal);
      info("Checking local clone enabled");
      await checkVideoEnabled(localVideoClone);
      info("Checking remote clone enabled");
      await checkVideoEnabled(remoteVideoClone);

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

      info("Checking local original disabled");
      await checkVideoDisabled(localVideoOriginal);
      info("Checking local clone enabled");
      await checkVideoEnabled(localVideoClone);
      info("Checking remote clone enabled");
      await checkVideoEnabled(remoteVideoClone);

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

      info("Checking local original enabled");
      await checkVideoEnabled(localVideoOriginal);
      info("Checking local clone disabled");
      await checkVideoDisabled(localVideoClone);
      info("Checking remote clone disabled");
      await checkVideoDisabled(remoteVideoClone);
    },
    async 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 freq = localAnalyserOriginal.binIndexForFrequency(TEST_AUDIO_FREQ);
      var checkAudioEnabled = analyser =>
        analyser.waitForAnalysisSuccess(array => array[freq] > 200);
      var checkAudioDisabled = analyser =>
        analyser.waitForAnalysisSuccess(array => array[freq] < 50);

      info("Checking local original enabled");
      await checkAudioEnabled(localAnalyserOriginal);
      info("Checking local clone enabled");
      await checkAudioEnabled(localAnalyserClone);
      info("Checking remote clone enabled");
      await checkAudioEnabled(remoteAnalyserClone);

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

      info("Checking local original disabled");
      await checkAudioDisabled(localAnalyserOriginal);
      info("Checking local clone enabled");
      await checkAudioEnabled(localAnalyserClone);
      info("Checking remote clone enabled");
      await checkAudioEnabled(remoteAnalyserClone);

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

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