electron/shell/browser/api/electron_api_native_theme.cc
trop[bot] f5617bbc6a
chore: bump chromium to 142.0.7417.0 (39-x-y) (#48363)
* chore: bump chromium in DEPS to 142.0.7401.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* 6911185: Reland "Send touch moves async immediately after scroll starts."

https://chromium-review.googlesource.com/c/chromium/src/+/6911185

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6906887: mac: click through content area in main window

https://chromium-review.googlesource.com/c/chromium/src/+/6906887

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6916667: Expose helper to eliminate duplicate recipes.

https://chromium-review.googlesource.com/c/chromium/src/+/6916667

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6909842: Switch LegacyRenderWidgetHostHWND from atlcrack.h to msg_util.h.

https://chromium-review.googlesource.com/c/chromium/src/+/6909842

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6884056: Remove the SecKeychain implementation for the Keychain interface

https://chromium-review.googlesource.com/c/chromium/src/+/6884056

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6904906: Remove `WTF::` in renderer/core/[p-x].*/

https://chromium-review.googlesource.com/c/chromium/src/+/6904906

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6556585: [persistent_cache]: PersistentCache for CodeCache

https://chromium-review.googlesource.com/c/chromium/src/+/6556585

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6904864: Layout: Support abort on the text placeholder layout

https://chromium-review.googlesource.com/c/chromium/src/+/6904864

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: fixup patch indices

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: bump chromium in DEPS to 142.0.7402.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* fixup! 6556585: [persistent_cache]: PersistentCache for CodeCache

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: fixup patch indices

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6905244: [api] Remove deprecated `GetIsolate`

https://chromium-review.googlesource.com/c/v8/v8/+/6905244

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6897694: Remove NativeTheme::UserHasContrastPreference().

https://chromium-review.googlesource.com/c/chromium/src/+/6897694

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6897477: Remove GetPlatformHighContrastColorScheme() and enum.

https://chromium-review.googlesource.com/c/chromium/src/+/6897477

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6918198: Reland "Rename display::Screen::GetScreen() to display::Screen::Get()"

https://chromium-review.googlesource.com/c/chromium/src/+/6918198

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6907147: [LNA] add use counter for websocket mixed-content issues

https://chromium-review.googlesource.com/c/chromium/src/+/6907147

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6914538: Replace WTF::String with blink::String

https://chromium-review.googlesource.com/c/website/+/6914538

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6892538: [video pip] Allow touchscreen users to toggle live caption

https://chromium-review.googlesource.com/c/chromium/src/+/6892538

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: fix patch

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: bump chromium in DEPS to 142.0.7403.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* build: remove ninja logs

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: fixup patch indices

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6920670: [PDF] Change pdf_extension_util to return dictionaries

https://chromium-review.googlesource.com/c/chromium/src/+/6920670

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6917864: Devirtualize and inline various NativeTheme getters.

https://chromium-review.googlesource.com/c/chromium/src/+/6917864

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6920873: [PDF] Simplify PDFDocumentHelperClient::OnSaveURL()

https://chromium-review.googlesource.com/c/chromium/src/+/6920873

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* build: don't kill blink/web_tests

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6923655: Roll libc++ from 954086abf121 to b87b2bb112f8 (4 revisions)

https://chromium-review.googlesource.com/c/chromium/src/+/6923655

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6905242: Reland "[CSP] Clarify report-only console messages."

https://chromium-review.googlesource.com/c/chromium/src/+/6905242

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* fixup! 6897694: Remove NativeTheme::UserHasContrastPreference().

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: bump chromium in DEPS to 142.0.7405.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* 6910012: [LNA] Enable LNA enforcement by default

https://chromium-review.googlesource.com/c/chromium/src/+/6910012

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6929444: Combine GetInstanceForXXX() implementations.

https://chromium-review.googlesource.com/c/chromium/src/+/6929444

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6927873: Rename native_widget_types.h -> native_ui_types.h

https://chromium-review.googlesource.com/c/chromium/src/+/6927873

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6853978: Init perfetto really early in WebView

https://chromium-review.googlesource.com/c/chromium/src/+/6853978

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6874886: Use only one picker observer to avoid getting duplicate notifications

https://chromium-review.googlesource.com/c/chromium/src/+/6874886

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: fixup patch indices

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* fix: Protocol complex inline dtor

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: bump chromium in DEPS to 142.0.7407.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: bump chromium in DEPS to 142.0.7409.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: bump chromium in DEPS to 142.0.7411.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: bump chromium in DEPS to 142.0.7413.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* fixup! 6905242: Reland "[CSP] Clarify report-only console messages."

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6927233: Remove NativeTheme "use dark colors" bit.

https://chromium-review.googlesource.com/c/chromium/src/+/6927233

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: fixup patch indices

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* 6899206: [PermissionOptions] Multi-state permission subscriptions & setting changes

https://chromium-review.googlesource.com/c/chromium/src/+/6899206

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* chore: bump chromium in DEPS to 142.0.7415.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* 6936895: [headless] Remove headless flag from views::Widget class

https://chromium-review.googlesource.com/c/chromium/src/+/6936895

We should probably followup on this to see if there is a way to do this without reverting this CL.

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* 6937023: Reland "Use new DBus type system in dbus_xdg::Request"

https://chromium-review.googlesource.com/c/chromium/src/+/6937023

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* chore: update patches

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* 6944749: Add GN visibility list to //components/os_crypt/sync

https://chromium-review.googlesource.com/c/chromium/src/+/6944749

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* Further replace sub_capture_target_version with CaptureVersion

https://chromium-review.googlesource.com/c/chromium/src/+/6935455

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* fixup for lint

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* chore: update filenames.libcxx.gni

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>

* chore: bump chromium in DEPS to 142.0.7417.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* 6944136: Reorder NativeTheme headers/.cc files.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6944136

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* 6939701: [DSSC][4] Make FSVCI objects aware of their capture-version-source

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6939701

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* 6944404: Remove extraneous callback call

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6944404

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* 6936124: [FPF-CI]: Introduce blink::NoiseToken for fingerprinting protection

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6936124

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* chore: update patches

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* fixup! 6927233: Remove NativeTheme "use dark colors" bit.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6927233

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* fixup! 6917864: Devirtualize and inline various NativeTheme getters.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6917864

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* 6937588: Add initial OsSettingsProvider object, supplying caret blink interval.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6937588

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* fixup! 6905242: Reland "[CSP] Clarify report-only console messages."

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6905242

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* 6907515: Replace SingletonHwndObserver with a CallbackList on SingletonHwnd.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6907515

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* 6910482: [Save to Drive] Implement retry functionality

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6910482

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* fixup! 6927233: Remove NativeTheme "use dark colors" bit.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/6927233

Co-authored-by: David Sanders <dsanders11@ucsbalum.com>

* Revert "build: remove ninja logs"

This reverts commit 72874740fdfca4101404ce7855e976791cfc79ef.

Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>

* test: fix flakey test picked from PR 48205

Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>

* chore: update patches

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>
2025-09-24 11:56:54 -04:00

210 lines
7 KiB
C++

// Copyright (c) 2019 Slack Technologies, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/browser/api/electron_api_native_theme.h"
#include <string>
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "shell/common/gin_converters/std_converter.h"
#include "shell/common/gin_helper/dictionary.h"
#include "shell/common/gin_helper/handle.h"
#include "shell/common/gin_helper/object_template_builder.h"
#include "shell/common/node_includes.h"
#include "ui/native_theme/native_theme.h"
namespace electron::api {
gin::DeprecatedWrapperInfo NativeTheme::kWrapperInfo = {
gin::kEmbedderNativeGin};
NativeTheme::NativeTheme(v8::Isolate* isolate,
ui::NativeTheme* ui_theme,
ui::NativeTheme* web_theme)
: ui_theme_(ui_theme), web_theme_(web_theme) {
ui_theme_->AddObserver(this);
#if BUILDFLAG(IS_WIN)
std::ignore = hkcu_themes_regkey_.Open(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Windows\\"
L"CurrentVersion\\Themes\\Personalize",
KEY_READ);
#endif
}
NativeTheme::~NativeTheme() {
ui_theme_->RemoveObserver(this);
}
void NativeTheme::OnNativeThemeUpdatedOnUI() {
#if BUILDFLAG(IS_WIN)
if (hkcu_themes_regkey_.Valid()) {
DWORD system_uses_light_theme = 1;
hkcu_themes_regkey_.ReadValueDW(L"SystemUsesLightTheme",
&system_uses_light_theme);
bool system_dark_mode_enabled = (system_uses_light_theme == 0);
should_use_dark_colors_for_system_integrated_ui_ =
std::make_optional<bool>(system_dark_mode_enabled);
}
#endif
Emit("updated");
}
void NativeTheme::OnNativeThemeUpdated(ui::NativeTheme* theme) {
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, base::BindOnce(&NativeTheme::OnNativeThemeUpdatedOnUI,
base::Unretained(this)));
}
void NativeTheme::SetThemeSource(ui::NativeTheme::ThemeSource override) {
ui_theme_->set_theme_source(override);
web_theme_->set_theme_source(override);
#if BUILDFLAG(IS_MAC)
// Update the macOS appearance setting for this new override value
UpdateMacOSAppearanceForOverrideValue(override);
#endif
// TODO(MarshallOfSound): Update all existing browsers windows to use GTK dark
// theme
}
ui::NativeTheme::ThemeSource NativeTheme::GetThemeSource() const {
return ui_theme_->theme_source();
}
bool NativeTheme::ShouldUseDarkColors() {
auto theme_source = GetThemeSource();
if (theme_source == ui::NativeTheme::ThemeSource::kForcedLight)
return false;
if (theme_source == ui::NativeTheme::ThemeSource::kForcedDark)
return true;
return ui_theme_->preferred_color_scheme() ==
ui::NativeTheme::PreferredColorScheme::kDark;
}
bool NativeTheme::ShouldUseHighContrastColors() {
return ui_theme_->preferred_contrast() ==
ui::NativeTheme::PreferredContrast::kMore;
}
bool NativeTheme::ShouldUseDarkColorsForSystemIntegratedUI() {
return should_use_dark_colors_for_system_integrated_ui_.value_or(
ShouldUseDarkColors());
}
bool NativeTheme::InForcedColorsMode() {
return ui_theme_->forced_colors();
}
bool NativeTheme::GetPrefersReducedTransparency() {
return ui_theme_->prefers_reduced_transparency();
}
#if BUILDFLAG(IS_MAC)
const CFStringRef WhiteOnBlack = CFSTR("whiteOnBlack");
const CFStringRef UniversalAccessDomain = CFSTR("com.apple.universalaccess");
#endif
// TODO(MarshallOfSound): Implement for Linux
bool NativeTheme::ShouldUseInvertedColorScheme() {
#if BUILDFLAG(IS_MAC)
CFPreferencesAppSynchronize(UniversalAccessDomain);
Boolean keyExistsAndHasValidFormat = false;
Boolean is_inverted = CFPreferencesGetAppBooleanValue(
WhiteOnBlack, UniversalAccessDomain, &keyExistsAndHasValidFormat);
if (!keyExistsAndHasValidFormat)
return false;
return is_inverted;
#else
return ui_theme_->forced_colors() &&
ui_theme_->preferred_color_scheme() ==
ui::NativeTheme::PreferredColorScheme::kDark;
#endif
}
// static
gin_helper::Handle<NativeTheme> NativeTheme::Create(v8::Isolate* isolate) {
ui::NativeTheme* ui_theme = ui::NativeTheme::GetInstanceForNativeUi();
ui::NativeTheme* web_theme = ui::NativeTheme::GetInstanceForWeb();
return gin_helper::CreateHandle(
isolate, new NativeTheme(isolate, ui_theme, web_theme));
}
gin::ObjectTemplateBuilder NativeTheme::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return gin_helper::EventEmitterMixin<NativeTheme>::GetObjectTemplateBuilder(
isolate)
.SetProperty("shouldUseDarkColors", &NativeTheme::ShouldUseDarkColors)
.SetProperty("themeSource", &NativeTheme::GetThemeSource,
&NativeTheme::SetThemeSource)
.SetProperty("shouldUseHighContrastColors",
&NativeTheme::ShouldUseHighContrastColors)
.SetProperty("shouldUseDarkColorsForSystemIntegratedUI",
&NativeTheme::ShouldUseDarkColorsForSystemIntegratedUI)
.SetProperty("shouldUseInvertedColorScheme",
&NativeTheme::ShouldUseInvertedColorScheme)
.SetProperty("inForcedColorsMode", &NativeTheme::InForcedColorsMode)
.SetProperty("prefersReducedTransparency",
&NativeTheme::GetPrefersReducedTransparency);
}
const char* NativeTheme::GetTypeName() {
return "NativeTheme";
}
} // namespace electron::api
namespace {
using electron::api::NativeTheme;
void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Value> unused,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* const isolate = electron::JavascriptEnvironment::GetIsolate();
gin::Dictionary dict{isolate, exports};
dict.Set("nativeTheme", NativeTheme::Create(isolate));
}
} // namespace
namespace gin {
v8::Local<v8::Value> Converter<ui::NativeTheme::ThemeSource>::ToV8(
v8::Isolate* isolate,
const ui::NativeTheme::ThemeSource& val) {
switch (val) {
case ui::NativeTheme::ThemeSource::kForcedDark:
return ConvertToV8(isolate, "dark");
case ui::NativeTheme::ThemeSource::kForcedLight:
return ConvertToV8(isolate, "light");
case ui::NativeTheme::ThemeSource::kSystem:
default:
return ConvertToV8(isolate, "system");
}
}
bool Converter<ui::NativeTheme::ThemeSource>::FromV8(
v8::Isolate* isolate,
v8::Local<v8::Value> val,
ui::NativeTheme::ThemeSource* out) {
std::string theme_source;
if (ConvertFromV8(isolate, val, &theme_source)) {
if (theme_source == "dark") {
*out = ui::NativeTheme::ThemeSource::kForcedDark;
} else if (theme_source == "light") {
*out = ui::NativeTheme::ThemeSource::kForcedLight;
} else if (theme_source == "system") {
*out = ui::NativeTheme::ThemeSource::kSystem;
} else {
return false;
}
return true;
}
return false;
}
} // namespace gin
NODE_LINKED_BINDING_CONTEXT_AWARE(electron_browser_native_theme, Initialize)