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

var gTests = [
  {
    desc: "device sharing animation on background tabs",
    run: async function checkAudioVideo() {
      async function getStreamAndCheckBackgroundAnim(aAudio, aVideo, aSharing) {
        // Get a stream
        let observerPromise = expectObserverCalled("getUserMedia:request");
        let popupPromise = promisePopupNotificationShown("webRTC-shareDevices");
        await promiseRequestDevice(aAudio, aVideo);
        await popupPromise;
        await observerPromise;

        let observerPromise1 = expectObserverCalled(
          "getUserMedia:response:allow"
        );
        let observerPromise2 = expectObserverCalled("recording-device-events");
        await promiseMessage("ok", () => {
          PopupNotifications.panel.firstElementChild.button.click();
        });
        await observerPromise1;
        await observerPromise2;
        let expected = {};
        if (aVideo) {
          expected.video = true;
        }
        if (aAudio) {
          expected.audio = true;
        }
        Assert.deepEqual(
          await getMediaCaptureState(),
          expected,
          "expected " + Object.keys(expected).join(" and ") + " to be shared"
        );

        // Check the attribute on the tab, and check there's no visible
        // sharing icon on the tab
        let tab = gBrowser.selectedTab;
        is(
          tab.getAttribute("sharing"),
          aSharing,
          "the tab has the attribute to show the " + aSharing + " icon"
        );
        let icon = tab.sharingIcon;
        is(
          window.getComputedStyle(icon).display,
          "none",
          "the animated sharing icon of the tab is hidden"
        );

        // After selecting a new tab, check the attribute is still there,
        // and the icon is now visible.
        await BrowserTestUtils.switchTab(
          gBrowser,
          BrowserTestUtils.addTab(gBrowser)
        );
        is(
          gBrowser.selectedTab.getAttribute("sharing"),
          "",
          "the new tab doesn't have the 'sharing' attribute"
        );
        is(
          tab.getAttribute("sharing"),
          aSharing,
          "the tab still has the 'sharing' attribute"
        );
        isnot(
          window.getComputedStyle(icon).display,
          "none",
          "the animated sharing icon of the tab is now visible"
        );

        // Ensure the icon disappears when selecting the tab.
        BrowserTestUtils.removeTab(gBrowser.selectedTab);
        ok(tab.selected, "the tab with ongoing sharing is selected again");
        is(
          window.getComputedStyle(icon).display,
          "none",
          "the animated sharing icon is gone after selecting the tab again"
        );

        // And finally verify the attribute is removed when closing the stream.
        await closeStream();

        // TODO(Bug 1304997): Fix the race in closeStream() and remove this
        // TestUtils.waitForCondition().
        await TestUtils.waitForCondition(() => !tab.getAttribute("sharing"));
        is(
          tab.getAttribute("sharing"),
          "",
          "the tab no longer has the 'sharing' attribute after closing the stream"
        );
      }

      await getStreamAndCheckBackgroundAnim(true, true, "camera");
      await getStreamAndCheckBackgroundAnim(false, true, "camera");
      await getStreamAndCheckBackgroundAnim(true, false, "microphone");
    },
  },
];

add_task(async function test() {
  await runTests(gTests);
});