|
|
@@ -116,26 +116,7 @@ const ScreenObtainer = {
|
|
116
|
116
|
});
|
|
117
|
117
|
};
|
|
118
|
118
|
} else if (RTCBrowserType.isElectron()) {
|
|
119
|
|
- obtainDesktopStream = (_, onSuccess, onFailure) => {
|
|
120
|
|
- if (window.JitsiMeetScreenObtainer
|
|
121
|
|
- && window.JitsiMeetScreenObtainer.openDesktopPicker) {
|
|
122
|
|
- window.JitsiMeetScreenObtainer.openDesktopPicker(
|
|
123
|
|
- streamId =>
|
|
124
|
|
- onGetStreamResponse(
|
|
125
|
|
- { streamId },
|
|
126
|
|
- onSuccess,
|
|
127
|
|
- onFailure
|
|
128
|
|
- ),
|
|
129
|
|
- err => onFailure(new JitsiTrackError(
|
|
130
|
|
- JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_ERROR,
|
|
131
|
|
- err
|
|
132
|
|
- ))
|
|
133
|
|
- );
|
|
134
|
|
- } else {
|
|
135
|
|
- onFailure(new JitsiTrackError(
|
|
136
|
|
- JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_NOT_FOUND));
|
|
137
|
|
- }
|
|
138
|
|
- };
|
|
|
119
|
+ obtainDesktopStream = this.obtainScreenOnElectron;
|
|
139
|
120
|
} else if (RTCBrowserType.isTemasysPluginUsed()) {
|
|
140
|
121
|
// XXX Don't require Temasys unless it's to be used because it
|
|
141
|
122
|
// doesn't run on React Native, for example.
|
|
|
@@ -256,13 +237,66 @@ const ScreenObtainer = {
|
|
256
|
237
|
new JitsiTrackError(JitsiTrackErrors.FIREFOX_EXTENSION_NEEDED));
|
|
257
|
238
|
},
|
|
258
|
239
|
|
|
|
240
|
+ /**
|
|
|
241
|
+ * Obtains a screen capture stream on Electron.
|
|
|
242
|
+ *
|
|
|
243
|
+ * @param {Object} [options] - Screen sharing options.
|
|
|
244
|
+ * @param {Array<string>} [options.desktopSharingSources] - Array with the
|
|
|
245
|
+ * sources that have to be displayed in the desktop picker window ('screen',
|
|
|
246
|
+ * 'window', etc.).
|
|
|
247
|
+ * @param onSuccess - Success callback.
|
|
|
248
|
+ * @param onFailure - Failure callback.
|
|
|
249
|
+ */
|
|
|
250
|
+ obtainScreenOnElectron(options = {}, onSuccess, onFailure) {
|
|
|
251
|
+ if (window.JitsiMeetScreenObtainer
|
|
|
252
|
+ && window.JitsiMeetScreenObtainer.openDesktopPicker) {
|
|
|
253
|
+ window.JitsiMeetScreenObtainer.openDesktopPicker(
|
|
|
254
|
+ {
|
|
|
255
|
+ desktopSharingSources:
|
|
|
256
|
+ options.desktopSharingSources
|
|
|
257
|
+ || this.options.desktopSharingChromeSources
|
|
|
258
|
+ },
|
|
|
259
|
+ (streamId, streamType) =>
|
|
|
260
|
+ onGetStreamResponse(
|
|
|
261
|
+ {
|
|
|
262
|
+ streamId,
|
|
|
263
|
+ streamType
|
|
|
264
|
+ },
|
|
|
265
|
+ onSuccess,
|
|
|
266
|
+ onFailure
|
|
|
267
|
+ ),
|
|
|
268
|
+ err => onFailure(new JitsiTrackError(
|
|
|
269
|
+ JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_ERROR,
|
|
|
270
|
+ err
|
|
|
271
|
+ ))
|
|
|
272
|
+ );
|
|
|
273
|
+ } else {
|
|
|
274
|
+ onFailure(new JitsiTrackError(
|
|
|
275
|
+ JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_NOT_FOUND));
|
|
|
276
|
+ }
|
|
|
277
|
+ },
|
|
|
278
|
+
|
|
259
|
279
|
/**
|
|
260
|
280
|
* Asks Chrome extension to call chooseDesktopMedia and gets chrome
|
|
261
|
281
|
* 'desktop' stream for returned stream token.
|
|
262
|
282
|
*/
|
|
263
|
283
|
obtainScreenFromExtension(options, streamCallback, failCallback) {
|
|
|
284
|
+ const {
|
|
|
285
|
+ desktopSharingChromeExtId,
|
|
|
286
|
+ desktopSharingChromeSources
|
|
|
287
|
+ } = this.options;
|
|
|
288
|
+
|
|
|
289
|
+ const gumOptions = {
|
|
|
290
|
+ desktopSharingChromeExtId,
|
|
|
291
|
+ desktopSharingChromeSources:
|
|
|
292
|
+ options.desktopSharingSources
|
|
|
293
|
+ || desktopSharingChromeSources
|
|
|
294
|
+ };
|
|
|
295
|
+
|
|
264
|
296
|
if (chromeExtInstalled) {
|
|
265
|
|
- doGetStreamFromExtension(this.options, streamCallback,
|
|
|
297
|
+ doGetStreamFromExtension(
|
|
|
298
|
+ gumOptions,
|
|
|
299
|
+ streamCallback,
|
|
266
|
300
|
failCallback);
|
|
267
|
301
|
} else {
|
|
268
|
302
|
if (chromeExtUpdateRequired) {
|
|
|
@@ -285,8 +319,10 @@ const ScreenObtainer = {
|
|
285
|
319
|
// available.
|
|
286
|
320
|
waitForExtensionAfterInstall(this.options, 200, 10)
|
|
287
|
321
|
.then(() => {
|
|
288
|
|
- doGetStreamFromExtension(this.options,
|
|
289
|
|
- streamCallback, failCallback);
|
|
|
322
|
+ doGetStreamFromExtension(
|
|
|
323
|
+ gumOptions,
|
|
|
324
|
+ streamCallback,
|
|
|
325
|
+ failCallback);
|
|
290
|
326
|
})
|
|
291
|
327
|
.catch(() => {
|
|
292
|
328
|
this.handleExtensionInstallationError(options,
|
|
|
@@ -570,13 +606,17 @@ function waitForExtensionAfterInstall(options, waitInterval, retries) {
|
|
570
|
606
|
* @param {Function} onSuccess - callback for success.
|
|
571
|
607
|
* @param {Function} onFailure - callback for failure.
|
|
572
|
608
|
*/
|
|
573
|
|
-function onGetStreamResponse({ streamId, error }, onSuccess, onFailure) {
|
|
|
609
|
+function onGetStreamResponse(
|
|
|
610
|
+ { streamId, streamType, error },
|
|
|
611
|
+ onSuccess,
|
|
|
612
|
+ onFailure) {
|
|
574
|
613
|
if (streamId) {
|
|
575
|
614
|
gumFunction(
|
|
576
|
615
|
[ 'desktop' ],
|
|
577
|
616
|
stream => onSuccess({
|
|
578
|
617
|
stream,
|
|
579
|
|
- sourceId: streamId
|
|
|
618
|
+ sourceId: streamId,
|
|
|
619
|
+ sourceType: streamType
|
|
580
|
620
|
}),
|
|
581
|
621
|
onFailure,
|
|
582
|
622
|
{ desktopStream: streamId });
|