electron [Feature Request]: 'did-change-color-scheme' event on webcontents

6tdlim6h  于 4个月前  发布在  Electron
关注(0)|答案(2)|浏览(52)

预检清单

问题描述

浏览器目前支持通过设置 color-scheme 元标签或在 :root 元素上定义 color-scheme css属性来触发暗黑模式渲染。当将其设置为 dark 时,浏览器将自动在 webcontents 后面渲染暗黑色背景,并更改文本颜色。
要查看此操作的效果,请参阅此演示页面:https://color-scheme-demo.glitch.me/(警告:这将每三秒从亮变暗)以及相应的解释性文章:https://web.dev/color-scheme/
Electron 中的常规浏览器窗口将在背景颜色和文本颜色方面切换,但其他 webcontents(如 webviews 中的那些)则不会。当颜色方案设置为暗黑时,这会导致白色文本在白色(透明)背景上渲染。
您可以使用 JS 读取 color-scheme 元标签并检查 color-scheme 是否已定义 CSS 属性,然后手动在 webview 后面设置背景颜色。这将起作用一次,但颜色方案值可以在任何时候更新而无需额外信号,这可能会使 webviews 难以阅读。

注意 这是与 prefers-color-scheme 不同的一个特性。那表示用户的偏好,而 color-scheme 表示网站是否支持暗黑、亮色或两者都支持。

建议的解决方案

在 color-scheme 更改时调用 webContents 上的事件,类似于我们已经拥有的 did-change-theme-color 事件。

考虑过的其他替代方案

  1. 注入 JavaScript 侦听器以观察 CSSStyleSheet 和 DOM 树。
  2. Chrome 本身会强制在 iframes 上设置暗黑色背景(参见下面的示例3)。我们也可以为 webviews 做到这一点。

其他信息

  1. 将上述演示页面设置为 BrowserWindow 的 webContents:https://gist.github.com/5244ed27b3fdb152ea4d8087362c2066 注意背景发生了变化。
  2. 将上述演示页面设置为 Webview 的 webContents:https://gist.github.com/5bb84a61cd87c3809d28fbf61b8714b9 注意虽然文本颜色发生了变化,但背景颜色没有改变。
  3. 在 Codepen 中设置上述演示页面为 iframe:https://codepen.io/Kilian/pen/xxpNvEb 注意在 Chromium 中,iframe 的背景会更新。
chhkpiq4

chhkpiq41#

这可能是解决#40207的方法。

anauzrmj

anauzrmj2#

看起来当颜色方案改变时,唯一始终被调用的函数是:https://github.com/chromium/chromium/blob/c603521f5e5260a573e9c20f01c4bd470e0833d7/third_party/blink/renderer/core/css/style_engine.cc#L3862C70-L3862C70 (或者它调用的函数)

相关问题