diff --git a/lib/browser/api/browser-window.ts b/lib/browser/api/browser-window.ts index 909b442c3d27..c8938a580fc1 100644 --- a/lib/browser/api/browser-window.ts +++ b/lib/browser/api/browser-window.ts @@ -199,7 +199,14 @@ BrowserWindow.prototype.setBackgroundThrottling = function (allowed: boolean) { }; BrowserWindow.prototype.addBrowserView = function (browserView: BrowserView) { - if (browserView.ownerWindow) { browserView.ownerWindow.removeBrowserView(browserView); } + if (this._browserViews.includes(browserView)) { + return; + } + + const ownerWindow = browserView.ownerWindow; + if (ownerWindow && ownerWindow !== this) { + ownerWindow.removeBrowserView(browserView); + } this.contentView.addChildView(browserView.webContentsView); browserView.ownerWindow = this; browserView.webContents._setOwnerWindow(this); diff --git a/spec/api-browser-view-spec.ts b/spec/api-browser-view-spec.ts index 6cf339dd3657..bb2c1e19a408 100644 --- a/spec/api-browser-view-spec.ts +++ b/spec/api-browser-view-spec.ts @@ -471,6 +471,39 @@ describe('BrowserView module', () => { w.webContents.loadURL('about:blank'); await once(w.webContents, 'did-finish-load'); }); + + it('document visibilitychange does not change when adding the same BrowserView multiple times', async () => { + w.show(); + expect(w.isVisible()).to.be.true('w is visible'); + + const view = new BrowserView(); + const [width, height] = w.getSize(); + view.setBounds({ x: 0, y: 0, width, height }); + w.addBrowserView(view); + expect(view.ownerWindow).to.equal(w); + + await view.webContents.loadURL(`data:text/html, + + +

HELLO BROWSERVIEW

+ + + + `); + const query = 'document.visibilityChangeCount'; + const countBefore = await view.webContents.executeJavaScript(query); + expect(countBefore).to.equal(0); + + w.addBrowserView(view); + w.addBrowserView(view); + const countAfter = await view.webContents.executeJavaScript(query); + expect(countAfter).to.equal(countBefore); + }); }); describe('BrowserWindow.removeBrowserView()', () => {