feat: disable fetching thumbnails if thumbnailSize is 0 (#14906)

Capturing window thmubnails is expensive as it actually uses the
window capturer and it records one full frame per window and then
downscale to the default size 150x150. When only interested in the
window names or the app icons we do not need all of this.

Underlying change is merged in chromium72 so this patch only modifies
the doc, see:
  https://chromium.googlesource.com/chromium/src.git/+log/72.0.3626.52/chrome/browser/media/webrtc/native_desktop_media_list.cc

Example: desktopCapturer.getSources({thumbnailSize: {width: 0, height: 0}}, ...)

Also added a unit test in spec/api-desktop-capturer-spec.js that verifies
that the returned thumbails are of type NativeImage and empty,
when the user disable fetching thumbnails.

notes: Can disable fetching the thumbnails for the DesktopCapturer.

https://github.com/electron/electron/issues/14872
This commit is contained in:
Julien Isorce 2019-02-13 10:27:42 -08:00 коммит произвёл Samuel Attard
Родитель 3dfef4a376
Коммит 9b29befdc8
2 изменённых файлов: 23 добавлений и 2 удалений

Просмотреть файл

@ -82,7 +82,9 @@ The `desktopCapturer` module has the following methods:
* `types` String[] - An array of Strings that lists the types of desktop sources * `types` String[] - An array of Strings that lists the types of desktop sources
to be captured, available types are `screen` and `window`. to be captured, available types are `screen` and `window`.
* `thumbnailSize` [Size](structures/size.md) (optional) - The size that the media source thumbnail * `thumbnailSize` [Size](structures/size.md) (optional) - The size that the media source thumbnail
should be scaled to. Default is `150` x `150`. should be scaled to. Default is `150` x `150`. Set width or height to 0 when you do not need
the thumbnails. This will save the processing time required for capturing the content of each
window and screen.
* `fetchWindowIcons` Boolean (optional) - Set to true to enable fetching window icons. The default * `fetchWindowIcons` Boolean (optional) - Set to true to enable fetching window icons. The default
value is false. When false the appIcon property of the sources return null. Same if a source has value is false. When false the appIcon property of the sources return null. Same if a source has
the type screen. the type screen.
@ -107,7 +109,9 @@ captured.
* `types` String[] - An array of Strings that lists the types of desktop sources * `types` String[] - An array of Strings that lists the types of desktop sources
to be captured, available types are `screen` and `window`. to be captured, available types are `screen` and `window`.
* `thumbnailSize` [Size](structures/size.md) (optional) - The size that the media source thumbnail * `thumbnailSize` [Size](structures/size.md) (optional) - The size that the media source thumbnail
should be scaled to. Default is `150` x `150`. should be scaled to. Default is `150` x `150`. Set width or height to 0 when you do not need
the thumbnails. This will save the processing time required for capturing the content of each
window and screen.
* `fetchWindowIcons` Boolean (optional) - Set to true to enable fetching window icons. The default * `fetchWindowIcons` Boolean (optional) - Set to true to enable fetching window icons. The default
value is false. When false the appIcon property of the sources return null. Same if a source has value is false. When false the appIcon property of the sources return null. Same if a source has
the type screen. the type screen.

Просмотреть файл

@ -4,6 +4,7 @@ const chaiAsPromised = require('chai-as-promised')
const { desktopCapturer, ipcRenderer, remote } = require('electron') const { desktopCapturer, ipcRenderer, remote } = require('electron')
const { screen } = remote const { screen } = remote
const features = process.atomBinding('features') const features = process.atomBinding('features')
const { emittedOnce } = require('./events-helpers')
const { expect } = chai const { expect } = chai
chai.use(dirtyChai) chai.use(dirtyChai)
@ -105,4 +106,20 @@ describe('desktopCapturer', () => {
expect(sources).to.be.empty() expect(sources).to.be.empty()
}) })
}) })
it('disabling thumbnail should return empty images', async () => {
const { BrowserWindow } = remote
const w = new BrowserWindow({ show: false, width: 200, height: 200 })
const wShown = emittedOnce(w, 'show')
w.show()
await wShown
const sources = await desktopCapturer.getSources({ types: ['window', 'screen'], thumbnailSize: { width: 0, height: 0 } })
w.destroy()
expect(sources).to.be.an('array').that.is.not.empty()
for (const { thumbnail: thumbnailImage } of sources) {
expect(thumbnailImage).to.be.a('NativeImage')
expect(thumbnailImage.isEmpty()).to.be.true()
}
})
}) })