From e88053091157e734bc0631ae72b74ef435ccc0d3 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:30:24 +0200 Subject: [PATCH] fix: `BrowserWindow.setBackgroundColor` should work with transparency (#42927) fix: BrowserWindow.setBackgroundColor should work with transparency Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr --- .../browser/api/electron_api_web_contents.cc | 5 ++- spec/api-browser-window-spec.ts | 42 ++++++++++++++----- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index b617442fb26..2ecb429f903 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -3729,14 +3729,17 @@ void WebContents::SetBackgroundColor(std::optional maybe_color) { type_ == Type::kBrowserView ? SK_ColorTRANSPARENT : SK_ColorWHITE); + bool is_opaque = SkColorGetA(color) == SK_AlphaOPAQUE; web_contents()->SetPageBaseBackgroundColor(color); content::RenderFrameHost* rfh = web_contents()->GetPrimaryMainFrame(); if (!rfh) return; + content::RenderWidgetHostView* rwhv = rfh->GetView(); if (rwhv) { - rwhv->SetBackgroundColor(color); + // RenderWidgetHostView doesn't allow setting an alpha that's not 0 or 255. + rwhv->SetBackgroundColor(is_opaque ? color : SK_ColorTRANSPARENT); static_cast(rwhv) ->SetContentBackgroundColor(color); } diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index db2412341f4..d5d21b96297 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -1660,6 +1660,7 @@ describe('BrowserWindow module', () => { w = new BrowserWindow({}); expect(w.getBackgroundColor()).to.equal('#FFFFFF'); }); + it('returns correct value if backgroundColor is set', () => { const backgroundColor = '#BBAAFF'; w.destroy(); @@ -1668,6 +1669,7 @@ describe('BrowserWindow module', () => { }); expect(w.getBackgroundColor()).to.equal(backgroundColor); }); + it('returns correct value from setBackgroundColor()', () => { const backgroundColor = '#AABBFF'; w.destroy(); @@ -1675,24 +1677,42 @@ describe('BrowserWindow module', () => { w.setBackgroundColor(backgroundColor); expect(w.getBackgroundColor()).to.equal(backgroundColor); }); - it('returns correct color with multiple passed formats', () => { + + it('returns correct color with multiple passed formats', async () => { w.destroy(); w = new BrowserWindow({}); - w.setBackgroundColor('#AABBFF'); - expect(w.getBackgroundColor()).to.equal('#AABBFF'); + await w.loadURL('about:blank'); - w.setBackgroundColor('blueviolet'); - expect(w.getBackgroundColor()).to.equal('#8A2BE2'); + const colors = new Map([ + ['blueviolet', '#8A2BE2'], + ['rgb(255, 0, 185)', '#FF00B9'], + ['hsl(155, 100%, 50%)', '#00FF95'], + ['#355E3B', '#355E3B'] + ]); - w.setBackgroundColor('rgb(255, 0, 185)'); - expect(w.getBackgroundColor()).to.equal('#FF00B9'); + for (const [color, hex] of colors) { + w.setBackgroundColor(color); + expect(w.getBackgroundColor()).to.equal(hex); + } + }); - w.setBackgroundColor('rgba(245, 40, 145, 0.8)'); - expect(w.getBackgroundColor()).to.equal('#F52891'); + it('can set the background color with transparency', async () => { + w.destroy(); + w = new BrowserWindow({}); - w.setBackgroundColor('hsl(155, 100%, 50%)'); - expect(w.getBackgroundColor()).to.equal('#00FF95'); + await w.loadURL('about:blank'); + + const colors = new Map([ + ['hsl(155, 100%, 50%)', '#00FF95'], + ['rgba(245, 40, 145, 0.8)', '#F52891'], + ['#1D1F21d9', '#1F21D9'] + ]); + + for (const [color, hex] of colors) { + w.setBackgroundColor(color); + expect(w.getBackgroundColor()).to.equal(hex); + } }); });