Sfoglia il codice sorgente

fix(ScreenObtainer) fix using gDM with old Electron clients

Detect if gDM support has been enabled and fallback to the previous gUM
flow otherwise.
release-8443
Saúl Ibarra Corretgé 8 mesi fa
parent
commit
522577a42d
4 ha cambiato i file con 40 aggiunte e 10 eliminazioni
  1. 2
    0
      JitsiTrackError.js
  2. 3
    0
      JitsiTrackErrors.spec.ts
  3. 7
    0
      JitsiTrackErrors.ts
  4. 28
    10
      modules/RTC/ScreenObtainer.js

+ 2
- 0
JitsiTrackError.js Vedi File

8
     = 'User canceled screen sharing prompt';
8
     = 'User canceled screen sharing prompt';
9
 TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR]
9
 TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR]
10
     = 'Unknown error from screensharing';
10
     = 'Unknown error from screensharing';
11
+TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.SCREENSHARING_NOT_SUPPORTED_ERROR]
12
+    = 'Not supported';
11
 TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_ERROR]
13
 TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_ERROR]
12
     = 'Unkown error from desktop picker';
14
     = 'Unkown error from desktop picker';
13
 TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_NOT_FOUND]
15
 TRACK_ERROR_TO_MESSAGE_MAP[JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_NOT_FOUND]

+ 3
- 0
JitsiTrackErrors.spec.ts Vedi File

11
         NOT_FOUND,
11
         NOT_FOUND,
12
         PERMISSION_DENIED,
12
         PERMISSION_DENIED,
13
         SCREENSHARING_GENERIC_ERROR,
13
         SCREENSHARING_GENERIC_ERROR,
14
+        SCREENSHARING_NOT_SUPPORTED_ERROR,
14
         SCREENSHARING_USER_CANCELED,
15
         SCREENSHARING_USER_CANCELED,
15
         TIMEOUT,
16
         TIMEOUT,
16
         TRACK_IS_DISPOSED,
17
         TRACK_IS_DISPOSED,
30
         expect( NOT_FOUND ).toBe( 'gum.not_found' );
31
         expect( NOT_FOUND ).toBe( 'gum.not_found' );
31
         expect( PERMISSION_DENIED ).toBe( 'gum.permission_denied' );
32
         expect( PERMISSION_DENIED ).toBe( 'gum.permission_denied' );
32
         expect( SCREENSHARING_GENERIC_ERROR ).toBe( 'gum.screensharing_generic_error' );
33
         expect( SCREENSHARING_GENERIC_ERROR ).toBe( 'gum.screensharing_generic_error' );
34
+        expect( SCREENSHARING_NOT_SUPPORTED_ERROR ).toBe( 'gdm.screen_sharing_not_supported' );
33
         expect( SCREENSHARING_USER_CANCELED ).toBe( 'gum.screensharing_user_canceled' );
35
         expect( SCREENSHARING_USER_CANCELED ).toBe( 'gum.screensharing_user_canceled' );
34
         expect( TIMEOUT ).toBe( 'gum.timeout' );
36
         expect( TIMEOUT ).toBe( 'gum.timeout' );
35
         expect( TRACK_IS_DISPOSED ).toBe( 'track.track_is_disposed' );
37
         expect( TRACK_IS_DISPOSED ).toBe( 'track.track_is_disposed' );
47
         expect( JitsiTrackErrors.NOT_FOUND ).toBe( 'gum.not_found' );
49
         expect( JitsiTrackErrors.NOT_FOUND ).toBe( 'gum.not_found' );
48
         expect( JitsiTrackErrors.PERMISSION_DENIED ).toBe( 'gum.permission_denied' );
50
         expect( JitsiTrackErrors.PERMISSION_DENIED ).toBe( 'gum.permission_denied' );
49
         expect( JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR ).toBe( 'gum.screensharing_generic_error' );
51
         expect( JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR ).toBe( 'gum.screensharing_generic_error' );
52
+        expect( JitsiTrackErrors.SCREENSHARING_NOT_SUPPORTED_ERROR ).toBe( 'gdm.screen_sharing_not_supported' );
50
         expect( JitsiTrackErrors.SCREENSHARING_USER_CANCELED ).toBe( 'gum.screensharing_user_canceled' );
53
         expect( JitsiTrackErrors.SCREENSHARING_USER_CANCELED ).toBe( 'gum.screensharing_user_canceled' );
51
         expect( JitsiTrackErrors.TIMEOUT ).toBe( 'gum.timeout' );
54
         expect( JitsiTrackErrors.TIMEOUT ).toBe( 'gum.timeout' );
52
         expect( JitsiTrackErrors.TRACK_IS_DISPOSED ).toBe( 'track.track_is_disposed' );
55
         expect( JitsiTrackErrors.TRACK_IS_DISPOSED ).toBe( 'track.track_is_disposed' );

+ 7
- 0
JitsiTrackErrors.ts Vedi File

42
      */
42
      */
43
     SCREENSHARING_GENERIC_ERROR = 'gum.screensharing_generic_error',
43
     SCREENSHARING_GENERIC_ERROR = 'gum.screensharing_generic_error',
44
 
44
 
45
+    /**
46
+     * Error in getDisplayMedia when not supported. Can happen in Electron if no
47
+     * permission handler was set.
48
+     */
49
+    SCREENSHARING_NOT_SUPPORTED_ERROR = 'gdm.screen_sharing_not_supported',
50
+
45
     /**
51
     /**
46
      * An error which indicates that user canceled screen sharing window
52
      * An error which indicates that user canceled screen sharing window
47
      * selection dialog.
53
      * selection dialog.
89
 export const NOT_FOUND = JitsiTrackErrors.NOT_FOUND;
95
 export const NOT_FOUND = JitsiTrackErrors.NOT_FOUND;
90
 export const PERMISSION_DENIED = JitsiTrackErrors.PERMISSION_DENIED;
96
 export const PERMISSION_DENIED = JitsiTrackErrors.PERMISSION_DENIED;
91
 export const SCREENSHARING_GENERIC_ERROR = JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR;
97
 export const SCREENSHARING_GENERIC_ERROR = JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR;
98
+export const SCREENSHARING_NOT_SUPPORTED_ERROR = JitsiTrackErrors.SCREENSHARING_NOT_SUPPORTED_ERROR;
92
 export const SCREENSHARING_USER_CANCELED = JitsiTrackErrors.SCREENSHARING_USER_CANCELED;
99
 export const SCREENSHARING_USER_CANCELED = JitsiTrackErrors.SCREENSHARING_USER_CANCELED;
93
 export const TIMEOUT = JitsiTrackErrors.TIMEOUT;
100
 export const TIMEOUT = JitsiTrackErrors.TIMEOUT;
94
 export const TRACK_IS_DISPOSED = JitsiTrackErrors.TRACK_IS_DISPOSED;
101
 export const TRACK_IS_DISPOSED = JitsiTrackErrors.TRACK_IS_DISPOSED;

+ 28
- 10
modules/RTC/ScreenObtainer.js Vedi File

36
         if (!this.obtainStream) {
36
         if (!this.obtainStream) {
37
             logger.info('Desktop sharing disabled');
37
             logger.info('Desktop sharing disabled');
38
         }
38
         }
39
+
40
+        this._electronSkipDisplayMedia = false;
39
     },
41
     },
40
 
42
 
41
     /**
43
     /**
48
     _createObtainStreamMethod() {
50
     _createObtainStreamMethod() {
49
         const supportsGetDisplayMedia = browser.supportsGetDisplayMedia();
51
         const supportsGetDisplayMedia = browser.supportsGetDisplayMedia();
50
 
52
 
51
-        if (browser.isElectron() && !this.options.testing?.electronUseGetDisplayMedia) {
53
+        if (browser.isElectron()) {
52
             return this.obtainScreenOnElectron;
54
             return this.obtainScreenOnElectron;
53
         } else if (browser.isReactNative() && supportsGetDisplayMedia) {
55
         } else if (browser.isReactNative() && supportsGetDisplayMedia) {
54
             return this.obtainScreenFromGetDisplayMediaRN;
56
             return this.obtainScreenFromGetDisplayMediaRN;
94
      * @param {Object} options - Optional parameters.
96
      * @param {Object} options - Optional parameters.
95
      */
97
      */
96
     obtainScreenOnElectron(onSuccess, onFailure, options = {}) {
98
     obtainScreenOnElectron(onSuccess, onFailure, options = {}) {
97
-        if (typeof window.JitsiMeetScreenObtainer?.openDesktopPicker === 'function') {
98
-            // Detect if we have the fallback option.
99
-            if (window.JitsiMeetScreenObtainer?.gDMSupported) {
100
-                return this.obtainScreenFromGetDisplayMedia(onSuccess, onFailure);
101
-            }
99
+        if (!this._electronSkipDisplayMedia) {
100
+            // Fall-back to the old API in case of not supported error. This can happen if
101
+            // an old Electron SDK is used with a new Jitsi Meet + lib-jitsi-meet version.
102
+            this.obtainScreenFromGetDisplayMedia(onSuccess, err => {
103
+                if (err.name === JitsiTrackErrors.SCREENSHARING_NOT_SUPPORTED_ERROR) {
104
+                    // Make sure we don't recurse infinitely.
105
+                    this._electronSkipDisplayMedia = true;
106
+                    this.obtainScreenOnElectron(onSuccess, onFailure);
107
+                } else {
108
+                    onFailure(err);
109
+                }
110
+            });
111
+
112
+            return;
113
+        }
102
 
114
 
115
+        // TODO: legacy flow, remove after the Electron SDK supporting gDM has been out for a while.
116
+        if (typeof window.JitsiMeetScreenObtainer?.openDesktopPicker === 'function') {
103
             const { desktopSharingFrameRate, desktopSharingResolution, desktopSharingSources } = this.options;
117
             const { desktopSharingFrameRate, desktopSharingResolution, desktopSharingSources } = this.options;
104
 
118
 
105
             window.JitsiMeetScreenObtainer.openDesktopPicker(
119
             window.JitsiMeetScreenObtainer.openDesktopPicker(
293
             })
307
             })
294
             .catch(error => {
308
             .catch(error => {
295
                 const errorDetails = {
309
                 const errorDetails = {
296
-                    errorName: error?.name,
297
-                    errorMsg: error?.message,
298
-                    errorStack: error?.stack
310
+                    errorCode: error.code,
311
+                    errorName: error.name,
312
+                    errorMsg: error.message,
313
+                    errorStack: error.stack
299
                 };
314
                 };
300
 
315
 
301
                 logger.warn('getDisplayMedia error', JSON.stringify(constraints), JSON.stringify(errorDetails));
316
                 logger.warn('getDisplayMedia error', JSON.stringify(constraints), JSON.stringify(errorDetails));
302
 
317
 
303
-                if (errorDetails.errorMsg?.indexOf('denied by system') !== -1) {
318
+                if (errorDetails.code === DOMException.NOT_SUPPORTED_ERR) {
319
+                    // This error is thrown when an Electron client has not set a permissions handler.
320
+                    errorCallback(new JitsiTrackError(JitsiTrackErrors.SCREENSHARING_NOT_SUPPORTED_ERROR));
321
+                } else if (errorDetails.errorMsg?.indexOf('denied by system') !== -1) {
304
                     // On Chrome this is the only thing different between error returned when user cancels
322
                     // On Chrome this is the only thing different between error returned when user cancels
305
                     // and when no permission was given on the OS level.
323
                     // and when no permission was given on the OS level.
306
                     errorCallback(new JitsiTrackError(JitsiTrackErrors.PERMISSION_DENIED));
324
                     errorCallback(new JitsiTrackError(JitsiTrackErrors.PERMISSION_DENIED));

Loading…
Annulla
Salva