diff --git a/lib/browser/desktop-capturer.js b/lib/browser/desktop-capturer.js index da1d481c60..48a7a2ad69 100644 --- a/lib/browser/desktop-capturer.js +++ b/lib/browser/desktop-capturer.js @@ -1,23 +1,23 @@ 'use strict' -const ipcMain = require('electron').ipcMain -const desktopCapturer = process.atomBinding('desktop_capturer').desktopCapturer +const {ipcMain} = require('electron') +const {desktopCapturer} = process.atomBinding('desktop_capturer') -var deepEqual = function (opt1, opt2) { - return JSON.stringify(opt1) === JSON.stringify(opt2) -} +const deepEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b) // A queue for holding all requests from renderer process. -var requestsQueue = [] +let requestsQueue = [] -ipcMain.on('ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES', function (event, captureWindow, captureScreen, thumbnailSize, id) { - var request - request = { - id: id, +const electronSources = 'ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES' +const capturerResult = (id) => `ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_${id}` + +ipcMain.on(electronSources, (event, captureWindow, captureScreen, thumbnailSize, id) => { + const request = { + id, options: { - captureWindow: captureWindow, - captureScreen: captureScreen, - thumbnailSize: thumbnailSize + captureWindow, + captureScreen, + thumbnailSize }, webContents: event.sender } @@ -28,45 +28,38 @@ ipcMain.on('ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES', function (event, cap // If the WebContents is destroyed before receiving result, just remove the // reference from requestsQueue to make the module not send the result to it. - event.sender.once('destroyed', function () { + event.sender.once('destroyed', () => { request.webContents = null }) }) -desktopCapturer.emit = function (event, name, sources) { +desktopCapturer.emit = (event, name, sources) => { // Receiving sources result from main process, now send them back to renderer. - var handledRequest, i, len, ref, ref1, request, result, source, unhandledRequestsQueue - handledRequest = requestsQueue.shift(0) - result = (function () { - var i, len, results - results = [] - for (i = 0, len = sources.length; i < len; i++) { - source = sources[i] - results.push({ - id: source.id, - name: source.name, - thumbnail: source.thumbnail.toDataURL() - }) + const handledRequest = requestsQueue.shift() + const handledWebContents = handledRequest.webContents + const unhandledRequestsQueue = [] + + const result = sources.map(source => { + return { + id: source.id, + name: source.name, + thumbnail: source.thumbnail.toDataURL() } - return results - })() - if ((ref = handledRequest.webContents) != null) { - ref.send('ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_' + handledRequest.id, result) + }) + + if (handledWebContents) { + handledWebContents.send(capturerResult(handledRequest.id), result) } - // Check the queue to see whether there is other same request. If has, handle - // it for reducing redunplicated `desktopCaptuer.startHandling` calls. - unhandledRequestsQueue = [] - for (i = 0, len = requestsQueue.length; i < len; i++) { - request = requestsQueue[i] + // Check the queue to see whether there is another identical request & handle + requestsQueue.forEach(request => { + const webContents = request.webContents if (deepEqual(handledRequest.options, request.options)) { - if ((ref1 = request.webContents) != null) { - ref1.send('ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_' + request.id, result) - } + if (webContents) webContents.send(capturerResult(request.id), result) } else { unhandledRequestsQueue.push(request) } - } + }) requestsQueue = unhandledRequestsQueue // If the requestsQueue is not empty, start a new request handling. diff --git a/lib/renderer/api/desktop-capturer.js b/lib/renderer/api/desktop-capturer.js index e998c786a5..b9320c893f 100644 --- a/lib/renderer/api/desktop-capturer.js +++ b/lib/renderer/api/desktop-capturer.js @@ -1,46 +1,43 @@ -const ipcRenderer = require('electron').ipcRenderer -const nativeImage = require('electron').nativeImage +const {ipcRenderer, nativeImage} = require('electron') -var nextId = 0 -var includes = [].includes +const includes = [].includes +let currentId = 0 -var getNextId = function () { - return ++nextId +const incrementId = () => { + currentId += 1 + return currentId } -// |options.type| can not be empty and has to include 'window' or 'screen'. -var isValid = function (options) { - return ((options != null ? options.types : void 0) != null) && Array.isArray(options.types) +// |options.types| can't be empty and must be an array +function isValid (options) { + const types = options ? options.types : undefined + return Array.isArray(types) } exports.getSources = function (options, callback) { - var captureScreen, captureWindow, id - if (!isValid(options)) { - return callback(new Error('Invalid options')) - } - captureWindow = includes.call(options.types, 'window') - captureScreen = includes.call(options.types, 'screen') + if (!isValid(options)) return callback(new Error('Invalid options')) + const captureWindow = includes.call(options.types, 'window') + const captureScreen = includes.call(options.types, 'screen') + if (options.thumbnailSize == null) { options.thumbnailSize = { width: 150, height: 150 } } - id = getNextId() + + const id = incrementId() ipcRenderer.send('ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES', captureWindow, captureScreen, options.thumbnailSize, id) - return ipcRenderer.once('ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_' + id, function (event, sources) { - var source - callback(null, (function () { - var i, len, results - results = [] - for (i = 0, len = sources.length; i < len; i++) { - source = sources[i] + return ipcRenderer.once(`ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_${id}`, (event, sources) => { + callback(null, (() => { + const results = [] + sources.forEach(source => { results.push({ id: source.id, name: source.name, thumbnail: nativeImage.createFromDataURL(source.thumbnail) }) - } + }) return results })()) })