From 62df97a366923de638c0f45def3f76caa302a0c9 Mon Sep 17 00:00:00 2001 From: Gautam Singh <5769869+gautamsi@users.noreply.github.com> Date: Wed, 23 Sep 2020 04:14:20 +0530 Subject: Patch getDisplayMedia for screen sharing in all services (#802) Co-authored-by: Gautam Singh --- src/webview/recipe.js | 131 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 126 insertions(+), 5 deletions(-) diff --git a/src/webview/recipe.js b/src/webview/recipe.js index c6724e35a..675f8e311 100644 --- a/src/webview/recipe.js +++ b/src/webview/recipe.js @@ -1,5 +1,5 @@ /* eslint-disable import/first */ -import { ipcRenderer, remote } from 'electron'; +import { ipcRenderer, remote, desktopCapturer } from 'electron'; import path from 'path'; import { autorun, computed, observable } from 'mobx'; import fs from 'fs-extra'; @@ -32,6 +32,69 @@ import { isDevMode } from '../environment'; const debug = require('debug')('Ferdi:Plugin'); +const screenShareCss = ` +.desktop-capturer-selection { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + background: rgba(30,30,30,.75); + color: #fff; + z-index: 10000000; + display: flex; + align-items: center; + justify-content: center; +} +.desktop-capturer-selection__scroller { + width: 100%; + max-height: 100vh; + overflow-y: auto; +} +.desktop-capturer-selection__list { + max-width: calc(100% - 100px); + margin: 50px; + padding: 0; + display: flex; + flex-wrap: wrap; + list-style: none; + overflow: hidden; + justify-content: center; +} +.desktop-capturer-selection__item { + display: flex; + margin: 4px; +} +.desktop-capturer-selection__btn { + display: flex; + flex-direction: column; + align-items: stretch; + width: 145px; + margin: 0; + border: 0; + border-radius: 3px; + padding: 4px; + background: #252626; + text-align: left; + transition: background-color .15s, box-shadow .15s; +} +.desktop-capturer-selection__btn:hover, +.desktop-capturer-selection__btn:focus { + background: rgba(98,100,167,.8); +} +.desktop-capturer-selection__thumbnail { + width: 100%; + height: 81px; + object-fit: cover; +} +.desktop-capturer-selection__name { + margin: 6px 0 6px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +`; + class RecipeController { @observable settings = { overrideSpellcheckerLanguage: false, @@ -128,14 +191,15 @@ class RecipeController { } async loadUserFiles(recipe, config) { + const styles = document.createElement('style'); + styles.innerHTML = screenShareCss; + const userCss = path.join(recipe.path, 'user.css'); if (await fs.exists(userCss)) { const data = await fs.readFile(userCss); - const styles = document.createElement('style'); - styles.innerHTML = data.toString(); - - document.querySelector('head').appendChild(styles); + styles.innerHTML += data.toString(); } + document.querySelector('head').appendChild(styles); const userJs = path.join(recipe.path, 'user.js'); if (await fs.exists(userJs)) { @@ -386,3 +450,60 @@ window.open = (url, frameName, features) => { if (isDevMode) { window.log = console.log; } + +// Patch getDisplayMedia for screen sharing +window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => { + try { + const sources = await desktopCapturer.getSources({ types: ['screen', 'window'] }); + + const selectionElem = document.createElement('div'); + selectionElem.classList = 'desktop-capturer-selection'; + selectionElem.innerHTML = ` +
+ +
+ `; + document.body.appendChild(selectionElem); + + document.querySelectorAll('.desktop-capturer-selection__btn') + .forEach((button) => { + button.addEventListener('click', async () => { + try { + const id = button.getAttribute('data-id'); + const mediaSource = sources.find(source => source.id === id); + if (!mediaSource) { + throw new Error(`Source with id ${id} does not exist`); + } + + const stream = await window.navigator.mediaDevices.getUserMedia({ + audio: false, + video: { + mandatory: { + chromeMediaSource: 'desktop', + chromeMediaSourceId: mediaSource.id, + }, + }, + }); + resolve(stream); + + selectionElem.remove(); + } catch (err) { + reject(err); + } + }); + }); + } catch (err) { + reject(err); + } +}); -- cgit v1.2.3-70-g09d2