summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/webrtc/browser_devices_get_user_media_by_device_id.js
blob: 3e5ca0668a51728dc7e53fc06f93217107eddd6a (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
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const TEST_ROOT = getRootDirectory(gTestPath).replace(
  "chrome://mochitests/content/",
  "https://example.com/"
);
const TEST_PAGE = TEST_ROOT + "get_user_media.html";

/**
 * Utility function that should be called after a request for a device
 * has been made. This function will allow sharing that device, and then
 * immediately close the stream.
 */
async function allowStreamsThenClose() {
  let observerPromise1 = expectObserverCalled("getUserMedia:response:allow");
  let observerPromise2 = expectObserverCalled("recording-device-events");
  await promiseMessage("ok", () => {
    PopupNotifications.panel.firstElementChild.button.click();
  });
  await observerPromise1;
  await observerPromise2;

  await closeStream();
}

/**
 * Tests that if a site requests a particular device by ID, that
 * the Permission Panel menulist for that device shows only that
 * device and is disabled.
 */
add_task(async function test_get_user_media_by_device_id() {
  let prefs = [
    [PREF_PERMISSION_FAKE, true],
    [PREF_AUDIO_LOOPBACK, ""],
    [PREF_VIDEO_LOOPBACK, ""],
    [PREF_FAKE_STREAMS, true],
    [PREF_FOCUS_SOURCE, false],
  ];
  await SpecialPowers.pushPrefEnv({ set: prefs });

  let devices = await navigator.mediaDevices.enumerateDevices();
  let audioId = devices
    .filter(d => d.kind == "audioinput")
    .map(d => d.deviceId)[0];
  let videoId = devices
    .filter(d => d.kind == "videoinput")
    .map(d => d.deviceId)[0];

  await BrowserTestUtils.withNewTab(TEST_PAGE, async browser => {
    let promise = promisePopupNotificationShown("webRTC-shareDevices");
    let observerPromise = expectObserverCalled("getUserMedia:request");
    await promiseRequestDevice({ deviceId: { exact: audioId } });
    await promise;
    await observerPromise;
    checkDeviceSelectors(["microphone"]);

    await allowStreamsThenClose();

    promise = promisePopupNotificationShown("webRTC-shareDevices");
    observerPromise = expectObserverCalled("getUserMedia:request");
    await promiseRequestDevice(false, { deviceId: { exact: videoId } });
    await promise;
    await observerPromise;
    checkDeviceSelectors(["camera"]);

    await allowStreamsThenClose();

    promise = promisePopupNotificationShown("webRTC-shareDevices");
    observerPromise = expectObserverCalled("getUserMedia:request");
    await promiseRequestDevice(
      { deviceId: { exact: audioId } },
      { deviceId: { exact: videoId } }
    );
    await promise;
    await observerPromise;
    checkDeviceSelectors(["microphone", "camera"]);
    await allowStreamsThenClose();
  });
});