From ff633a8aeb8b8a2c3f0bbe5bb62def02027928a8 Mon Sep 17 00:00:00 2001 From: "Grigorii K. Shartsev" Date: Thu, 4 Apr 2024 11:25:26 +0200 Subject: [PATCH] feat(desktop): add screen sharing support Signed-off-by: Grigorii K. Shartsev --- src/components/TopBar/TopBarMediaControls.vue | 8 ++---- .../webrtc/simplewebrtc/getscreenmedia.js | 26 +++++++++++++++++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/components/TopBar/TopBarMediaControls.vue b/src/components/TopBar/TopBarMediaControls.vue index 328cd99abb15..bf66c09aacd9 100644 --- a/src/components/TopBar/TopBarMediaControls.vue +++ b/src/components/TopBar/TopBarMediaControls.vue @@ -458,16 +458,12 @@ export default { }, toggleScreenSharingMenu() { - if (IS_DESKTOP) { - alert('Unfortunately, Screen sharing is not supported by Nextcloud Talk Preview') - return - } - if (!this.isScreensharingAllowed) { return } - if (!this.model.getWebRtc().capabilities.supportScreenSharing) { + // webrtcsupport consider screen shared supported only via HTTPS event if it is supported in the browser/desktop + if (!this.model.getWebRtc().capabilities.supportScreenSharing && !IS_DESKTOP) { if (window.location.protocol === 'https:') { showMessage(t('spreed', 'Screen sharing is not supported by your browser.')) } else { diff --git a/src/utils/webrtc/simplewebrtc/getscreenmedia.js b/src/utils/webrtc/simplewebrtc/getscreenmedia.js index 6b835221620d..7575ec812b38 100644 --- a/src/utils/webrtc/simplewebrtc/getscreenmedia.js +++ b/src/utils/webrtc/simplewebrtc/getscreenmedia.js @@ -34,13 +34,35 @@ export default function(mode, constraints, cb) { const callback = hasConstraints ? cb : constraints let error - if (typeof window === 'undefined' || window.location.protocol === 'http:') { + if (!IS_DESKTOP && (typeof window === 'undefined' || window.location.protocol === 'http:')) { error = new Error('NavigatorUserMediaError') error.name = 'HTTPS_REQUIRED' return callback(error) } - if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) { + if (IS_DESKTOP) { + return window.OCA.Talk.Desktop.getDesktopMediaSource() + .then(({ sourceId }) => { + if (!sourceId) { + // User canceled + const error = new Error('NavigatorUserMediaError') + error.name = 'PERMISSION_DENIED' + throw error + } + + return navigator.mediaDevices.getUserMedia({ + audio: false, + video: { + mandatory: { + chromeMediaSource: 'desktop', + chromeMediaSourceId: sourceId, + } + } + }) + }) + .then((stream) => callback(null, stream)) + .catch((error) => callback(error)) + } else if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) { navigator.mediaDevices.getDisplayMedia({ video: true, // Disable default audio optimizations, as they are meant to be used