Bug 1634703 - Have the webrtcUI module track which windows are being shared. r=florian

Differential Revision: https://phabricator.services.mozilla.com/D73483
This commit is contained in:
Mike Conley 2020-05-12 14:51:08 +00:00
parent c5a8e8d361
commit ab2b2aaf18

View File

@ -21,6 +21,11 @@ ChromeUtils.defineModuleGetter(
"PluralForm",
"resource://gre/modules/PluralForm.jsm"
);
ChromeUtils.defineModuleGetter(
this,
"BrowserWindowTracker",
"resource:///modules/BrowserWindowTracker.jsm"
);
var webrtcUI = {
initialized: false,
@ -50,6 +55,14 @@ var webrtcUI = {
}
},
SHARING_NONE: 0,
SHARING_WINDOW: 1,
SHARING_SCREEN: 2,
// Set of browser windows that are being shared over WebRTC.
sharedWindows: new WeakSet(),
sharingScreen: false,
// Map of browser elements to indicator data.
perTabIndicators: new Map(),
activePerms: new Map(),
@ -264,6 +277,42 @@ var webrtcUI = {
state: aData,
};
}
let sharedWindowRawDeviceIds = new Set();
this.sharingScreen = false;
for (let stream of this._streams) {
let { state } = stream;
for (let device of state.devices) {
if (!device.scary) {
continue;
}
let mediaSource = device.mediaSource;
if (mediaSource == "window") {
sharedWindowRawDeviceIds.add(device.rawId);
} else if (mediaSource == "screen") {
this.sharingScreen = true;
}
}
}
this.sharedWindows = new WeakSet();
for (let win of BrowserWindowTracker.orderedWindows) {
let rawDeviceId;
try {
rawDeviceId = win.windowUtils.webrtcRawDeviceId;
} catch (e) {
// This can theoretically throw if some of the underlying
// window primitives don't exist. In that case, we can skip
// to the next window.
continue;
}
if (sharedWindowRawDeviceIds.has(rawDeviceId)) {
this.sharedWindows.add(win);
}
}
},
/**
@ -463,6 +512,15 @@ var webrtcUI = {
gIndicatorWindow = null;
}
},
getWindowShareState(window) {
if (this.sharingScreen) {
return this.SHARING_SCREEN;
} else if (this.sharedWindows.has(window)) {
return this.SHARING_WINDOW;
}
return this.SHARING_NONE;
},
};
function getGlobalIndicator() {