Przeglądaj źródła

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 miesięcy temu
rodzic
commit
522577a42d
4 zmienionych plików z 40 dodań i 10 usunięć
  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 Wyświetl plik

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

+ 3
- 0
JitsiTrackErrors.spec.ts Wyświetl plik

@@ -11,6 +11,7 @@ describe( "/JitsiTrackErrors members", () => {
11 11
         NOT_FOUND,
12 12
         PERMISSION_DENIED,
13 13
         SCREENSHARING_GENERIC_ERROR,
14
+        SCREENSHARING_NOT_SUPPORTED_ERROR,
14 15
         SCREENSHARING_USER_CANCELED,
15 16
         TIMEOUT,
16 17
         TRACK_IS_DISPOSED,
@@ -30,6 +31,7 @@ describe( "/JitsiTrackErrors members", () => {
30 31
         expect( NOT_FOUND ).toBe( 'gum.not_found' );
31 32
         expect( PERMISSION_DENIED ).toBe( 'gum.permission_denied' );
32 33
         expect( SCREENSHARING_GENERIC_ERROR ).toBe( 'gum.screensharing_generic_error' );
34
+        expect( SCREENSHARING_NOT_SUPPORTED_ERROR ).toBe( 'gdm.screen_sharing_not_supported' );
33 35
         expect( SCREENSHARING_USER_CANCELED ).toBe( 'gum.screensharing_user_canceled' );
34 36
         expect( TIMEOUT ).toBe( 'gum.timeout' );
35 37
         expect( TRACK_IS_DISPOSED ).toBe( 'track.track_is_disposed' );
@@ -47,6 +49,7 @@ describe( "/JitsiTrackErrors members", () => {
47 49
         expect( JitsiTrackErrors.NOT_FOUND ).toBe( 'gum.not_found' );
48 50
         expect( JitsiTrackErrors.PERMISSION_DENIED ).toBe( 'gum.permission_denied' );
49 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 53
         expect( JitsiTrackErrors.SCREENSHARING_USER_CANCELED ).toBe( 'gum.screensharing_user_canceled' );
51 54
         expect( JitsiTrackErrors.TIMEOUT ).toBe( 'gum.timeout' );
52 55
         expect( JitsiTrackErrors.TRACK_IS_DISPOSED ).toBe( 'track.track_is_disposed' );

+ 7
- 0
JitsiTrackErrors.ts Wyświetl plik

@@ -42,6 +42,12 @@ export enum JitsiTrackErrors {
42 42
      */
43 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 52
      * An error which indicates that user canceled screen sharing window
47 53
      * selection dialog.
@@ -89,6 +95,7 @@ export const GENERAL = JitsiTrackErrors.GENERAL;
89 95
 export const NOT_FOUND = JitsiTrackErrors.NOT_FOUND;
90 96
 export const PERMISSION_DENIED = JitsiTrackErrors.PERMISSION_DENIED;
91 97
 export const SCREENSHARING_GENERIC_ERROR = JitsiTrackErrors.SCREENSHARING_GENERIC_ERROR;
98
+export const SCREENSHARING_NOT_SUPPORTED_ERROR = JitsiTrackErrors.SCREENSHARING_NOT_SUPPORTED_ERROR;
92 99
 export const SCREENSHARING_USER_CANCELED = JitsiTrackErrors.SCREENSHARING_USER_CANCELED;
93 100
 export const TIMEOUT = JitsiTrackErrors.TIMEOUT;
94 101
 export const TRACK_IS_DISPOSED = JitsiTrackErrors.TRACK_IS_DISPOSED;

+ 28
- 10
modules/RTC/ScreenObtainer.js Wyświetl plik

@@ -36,6 +36,8 @@ const ScreenObtainer = {
36 36
         if (!this.obtainStream) {
37 37
             logger.info('Desktop sharing disabled');
38 38
         }
39
+
40
+        this._electronSkipDisplayMedia = false;
39 41
     },
40 42
 
41 43
     /**
@@ -48,7 +50,7 @@ const ScreenObtainer = {
48 50
     _createObtainStreamMethod() {
49 51
         const supportsGetDisplayMedia = browser.supportsGetDisplayMedia();
50 52
 
51
-        if (browser.isElectron() && !this.options.testing?.electronUseGetDisplayMedia) {
53
+        if (browser.isElectron()) {
52 54
             return this.obtainScreenOnElectron;
53 55
         } else if (browser.isReactNative() && supportsGetDisplayMedia) {
54 56
             return this.obtainScreenFromGetDisplayMediaRN;
@@ -94,12 +96,24 @@ const ScreenObtainer = {
94 96
      * @param {Object} options - Optional parameters.
95 97
      */
96 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 117
             const { desktopSharingFrameRate, desktopSharingResolution, desktopSharingSources } = this.options;
104 118
 
105 119
             window.JitsiMeetScreenObtainer.openDesktopPicker(
@@ -293,14 +307,18 @@ const ScreenObtainer = {
293 307
             })
294 308
             .catch(error => {
295 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 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 322
                     // On Chrome this is the only thing different between error returned when user cancels
305 323
                     // and when no permission was given on the OS level.
306 324
                     errorCallback(new JitsiTrackError(JitsiTrackErrors.PERMISSION_DENIED));

Ładowanie…
Anuluj
Zapisz