From e2770171f0a787da058b61d6e82c3eb8e3ca9849 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Mon, 9 May 2022 12:16:48 +0200 Subject: [PATCH] fix: WCO crash on bad titlebarStyle --- shell/browser/ui/views/win_frame_view.cc | 4 +- spec-main/api-browser-window-spec.ts | 72 ++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/shell/browser/ui/views/win_frame_view.cc b/shell/browser/ui/views/win_frame_view.cc index 8a25bcdd73e8e..cea0b2937c92a 100644 --- a/shell/browser/ui/views/win_frame_view.cc +++ b/shell/browser/ui/views/win_frame_view.cc @@ -55,8 +55,8 @@ SkColor WinFrameView::GetReadableFeatureColor(SkColor background_color) { } void WinFrameView::InvalidateCaptionButtons() { - // Ensure that the caption buttons container exists - DCHECK(caption_button_container_); + if (!caption_button_container_) + return; caption_button_container_->InvalidateLayout(); caption_button_container_->SchedulePaint(); diff --git a/spec-main/api-browser-window-spec.ts b/spec-main/api-browser-window-spec.ts index b938b483b8c5e..47384de1bdc99 100644 --- a/spec-main/api-browser-window-spec.ts +++ b/spec-main/api-browser-window-spec.ts @@ -2,10 +2,8 @@ import { expect } from 'chai'; import * as childProcess from 'child_process'; import * as path from 'path'; import * as fs from 'fs'; -import * as os from 'os'; import * as qs from 'querystring'; import * as http from 'http'; -import * as semver from 'semver'; import { AddressInfo } from 'net'; import { app, BrowserWindow, BrowserView, dialog, ipcMain, OnBeforeSendHeadersListenerDetails, protocol, screen, webContents, session, WebContents, BrowserWindowConstructorOptions } from 'electron/main'; @@ -2150,7 +2148,7 @@ describe('BrowserWindow module', () => { }); }); - ifdescribe(process.platform === 'win32' || (process.platform === 'darwin' && semver.gte(os.release(), '14.0.0')))('"titleBarStyle" option', () => { + ifdescribe(['win32', 'darwin'].includes(process.platform))('"titleBarStyle" option', () => { const testWindowsOverlay = async (style: any) => { const w = new BrowserWindow({ show: false, @@ -2219,7 +2217,7 @@ describe('BrowserWindow module', () => { }); }); - ifdescribe(process.platform === 'win32' || (process.platform === 'darwin' && semver.gte(os.release(), '14.0.0')))('"titleBarOverlay" option', () => { + ifdescribe(['win32', 'darwin'].includes(process.platform))('"titleBarOverlay" option', () => { const testWindowsOverlayHeight = async (size: any) => { const w = new BrowserWindow({ show: false, @@ -2269,6 +2267,72 @@ describe('BrowserWindow module', () => { }); }); + ifdescribe(process.platform === 'win32')('BrowserWindow.setTitlebarOverlay', () => { + afterEach(closeAllWindows); + afterEach(() => { ipcMain.removeAllListeners('geometrychange'); }); + + it('does not crash when an invalid titleBarStyle was initially set', () => { + const win = new BrowserWindow({ + titleBarOverlay: { + color: '#0000f0', + symbolColor: '#ffffff' + }, + titleBarStyle: 'hiddenInset' + }); + + expect(() => { + win.setTitleBarOverlay({ + color: '#000000' + }); + }).to.not.throw(); + }); + + it('correctly updates the height of the overlay', async () => { + const testOverlay = async (w: BrowserWindow, size: Number) => { + const overlayHTML = path.join(__dirname, 'fixtures', 'pages', 'overlay.html'); + const overlayReady = emittedOnce(ipcMain, 'geometrychange'); + await w.loadFile(overlayHTML); + await overlayReady; + const overlayEnabled = await w.webContents.executeJavaScript('navigator.windowControlsOverlay.visible'); + expect(overlayEnabled).to.be.true('overlayEnabled'); + const overlayRectPreMax = await w.webContents.executeJavaScript('getJSOverlayProperties()'); + await w.maximize(); + const max = await w.isMaximized(); + expect(max).to.equal(true); + const overlayRectPostMax = await w.webContents.executeJavaScript('getJSOverlayProperties()'); + + expect(overlayRectPreMax.y).to.equal(0); + expect(overlayRectPreMax.x).to.equal(0); + expect(overlayRectPreMax.width).to.be.greaterThan(0); + expect(overlayRectPreMax.height).to.equal(size); + expect(overlayRectPostMax.height).to.equal(size); + }; + + const INITIAL_SIZE = 40; + const w = new BrowserWindow({ + show: false, + width: 400, + height: 400, + titleBarStyle: 'hidden', + webPreferences: { + nodeIntegration: true, + contextIsolation: false + }, + titleBarOverlay: { + height: INITIAL_SIZE + } + }); + + await testOverlay(w, INITIAL_SIZE); + + w.setTitleBarOverlay({ + height: INITIAL_SIZE + 10 + }); + + await testOverlay(w, INITIAL_SIZE + 10); + }); + }); + ifdescribe(process.platform === 'darwin')('"enableLargerThanScreen" option', () => { afterEach(closeAllWindows); it('can move the window out of screen', () => {