From ed69e593457baf5ba5bb1101d75265d47fe35955 Mon Sep 17 00:00:00 2001 From: zeeker999 <13848632+zeeker999@users.noreply.github.com> Date: Tue, 22 Mar 2022 07:38:03 +0800 Subject: [PATCH] fix: IncrementCapturerCount doesn't increase the capturer count (#32973) --- .../browser/api/electron_api_web_contents.cc | 5 +- spec-main/api-browser-view-spec.ts | 62 +++++++++++++++++++ spec-main/api-browser-window-spec.ts | 19 ++++++ 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 58d3f7f016685..c5238cead782f 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -3127,8 +3127,9 @@ void WebContents::IncrementCapturerCount(gin::Arguments* args) { // get stayAwake arguments if they exist args->GetNext(&stay_awake); - std::ignore = - web_contents()->IncrementCapturerCount(size, stay_hidden, stay_awake); + std::ignore = web_contents() + ->IncrementCapturerCount(size, stay_hidden, stay_awake) + .Release(); } void WebContents::DecrementCapturerCount(gin::Arguments* args) { diff --git a/spec-main/api-browser-view-spec.ts b/spec-main/api-browser-view-spec.ts index ac6a036db06b9..8d54b9efe1cae 100644 --- a/spec-main/api-browser-view-spec.ts +++ b/spec-main/api-browser-view-spec.ts @@ -302,4 +302,66 @@ describe('BrowserView module', () => { view.webContents.loadFile(path.join(fixtures, 'pages', 'window-open.html')); }); }); + + describe('BrowserView.capturePage(rect)', () => { + it('returns a Promise with a Buffer', async () => { + view = new BrowserView({ + webPreferences: { + backgroundThrottling: false + } + }); + w.addBrowserView(view); + view.setBounds({ + ...w.getBounds(), + x: 0, + y: 0 + }); + const image = await view.webContents.capturePage({ + x: 0, + y: 0, + width: 100, + height: 100 + }); + + expect(image.isEmpty()).to.equal(true); + }); + + xit('resolves after the window is hidden and capturer count is non-zero', async () => { + view = new BrowserView({ + webPreferences: { + backgroundThrottling: false + } + }); + w.setBrowserView(view); + view.setBounds({ + ...w.getBounds(), + x: 0, + y: 0 + }); + await view.webContents.loadFile(path.join(fixtures, 'pages', 'a.html')); + + view.webContents.incrementCapturerCount(); + const image = await view.webContents.capturePage(); + expect(image.isEmpty()).to.equal(false); + }); + + it('should increase the capturer count', () => { + view = new BrowserView({ + webPreferences: { + backgroundThrottling: false + } + }); + w.setBrowserView(view); + view.setBounds({ + ...w.getBounds(), + x: 0, + y: 0 + }); + + view.webContents.incrementCapturerCount(); + expect(view.webContents.isBeingCaptured()).to.be.true(); + view.webContents.decrementCapturerCount(); + expect(view.webContents.isBeingCaptured()).to.be.false(); + }); + }); }); diff --git a/spec-main/api-browser-window-spec.ts b/spec-main/api-browser-window-spec.ts index 1f6e88b5088dc..d4d4a70799a16 100644 --- a/spec-main/api-browser-window-spec.ts +++ b/spec-main/api-browser-window-spec.ts @@ -1453,6 +1453,17 @@ describe('BrowserWindow module', () => { expect(hiddenImage.isEmpty()).to.equal(isEmpty); }); + it('resolves after the window is hidden and capturer count is non-zero', async () => { + const w = new BrowserWindow({ show: false }); + w.webContents.setBackgroundThrottling(false); + w.loadFile(path.join(fixtures, 'pages', 'a.html')); + await emittedOnce(w, 'ready-to-show'); + + w.webContents.incrementCapturerCount(); + const image = await w.capturePage(); + expect(image.isEmpty()).to.equal(false); + }); + it('preserves transparency', async () => { const w = new BrowserWindow({ show: false, transparent: true }); w.loadFile(path.join(fixtures, 'pages', 'theme-color.html')); @@ -1466,6 +1477,14 @@ describe('BrowserWindow module', () => { // Values can be 0,2,3,4, or 6. We want 6, which is RGB + Alpha expect(imgBuffer[25]).to.equal(6); }); + + it('should increase the capturer count', () => { + const w = new BrowserWindow({ show: false }); + w.webContents.incrementCapturerCount(); + expect(w.webContents.isBeingCaptured()).to.be.true(); + w.webContents.decrementCapturerCount(); + expect(w.webContents.isBeingCaptured()).to.be.false(); + }); }); describe('BrowserWindow.setProgressBar(progress)', () => {