fix: default to system accent color on invalid user color (#47800)
fix: default to system accent color on invalid user color"
This commit is contained in:
parent
45899d1cd7
commit
e17cbc96e2
11 changed files with 38 additions and 41 deletions
|
@ -656,7 +656,7 @@ bool BaseWindow::IsTabletMode() const {
|
|||
}
|
||||
|
||||
void BaseWindow::SetBackgroundColor(const std::string& color_name) {
|
||||
SkColor color = ParseCSSColor(color_name);
|
||||
SkColor color = ParseCSSColor(color_name).value_or(SK_ColorWHITE);
|
||||
window_->SetBackgroundColor(color);
|
||||
}
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ void BrowserWindow::Blur() {
|
|||
|
||||
void BrowserWindow::SetBackgroundColor(const std::string& color_name) {
|
||||
BaseWindow::SetBackgroundColor(color_name);
|
||||
SkColor color = ParseCSSColor(color_name);
|
||||
SkColor color = ParseCSSColor(color_name).value_or(SK_ColorWHITE);
|
||||
if (api_web_contents_) {
|
||||
api_web_contents_->SetBackgroundColor(color);
|
||||
// Also update the web preferences object otherwise the view will be reset
|
||||
|
@ -242,7 +242,7 @@ void BrowserWindow::SetBackgroundColor(const std::string& color_name) {
|
|||
auto* web_preferences =
|
||||
WebContentsPreferences::From(api_web_contents_->web_contents());
|
||||
if (web_preferences) {
|
||||
web_preferences->SetBackgroundColor(ParseCSSColor(color_name));
|
||||
web_preferences->SetBackgroundColor(color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -864,9 +864,10 @@ WebContents::WebContents(v8::Isolate* isolate,
|
|||
// webPreferences does not have a transparent option, so if the window needs
|
||||
// to be transparent, that will be set at electron_api_browser_window.cc#L57
|
||||
// and we then need to pull it back out and check it here.
|
||||
std::string background_color;
|
||||
options.GetHidden(options::kBackgroundColor, &background_color);
|
||||
bool transparent = ParseCSSColor(background_color) == SK_ColorTRANSPARENT;
|
||||
std::string background_color_str;
|
||||
options.GetHidden(options::kBackgroundColor, &background_color_str);
|
||||
SkColor bc = ParseCSSColor(background_color_str).value_or(SK_ColorWHITE);
|
||||
bool transparent = bc == SK_ColorTRANSPARENT;
|
||||
|
||||
content::WebContents::CreateParams params(session->browser_context());
|
||||
auto* view = new OffScreenWebContentsView(
|
||||
|
|
|
@ -233,7 +233,7 @@ void NativeWindow::InitFromOptions(const gin_helper::Dictionary& options) {
|
|||
|
||||
SkColor background_color = SK_ColorWHITE;
|
||||
if (std::string color; options.Get(options::kBackgroundColor, &color)) {
|
||||
background_color = ParseCSSColor(color);
|
||||
background_color = ParseCSSColor(color).value_or(SK_ColorWHITE);
|
||||
} else if (IsTranslucent()) {
|
||||
background_color = SK_ColorTRANSPARENT;
|
||||
}
|
||||
|
|
|
@ -216,7 +216,9 @@ NativeWindowViews::NativeWindowViews(const gin_helper::Dictionary& options,
|
|||
overlay_symbol_color_ = color_utils::GetSysSkColor(COLOR_BTNTEXT);
|
||||
|
||||
if (std::string str; options.Get(options::kAccentColor, &str)) {
|
||||
accent_color_ = ParseCSSColor(str);
|
||||
std::optional<SkColor> parsed_color = ParseCSSColor(str);
|
||||
if (parsed_color.has_value())
|
||||
accent_color_ = parsed_color.value();
|
||||
} else if (bool flag; options.Get(options::kAccentColor, &flag)) {
|
||||
accent_color_ = flag;
|
||||
}
|
||||
|
|
|
@ -574,43 +574,36 @@ void NativeWindowViews::UpdateWindowAccentColor() {
|
|||
if (base::win::GetVersion() < base::win::Version::WIN11)
|
||||
return;
|
||||
|
||||
COLORREF border_color;
|
||||
std::optional<COLORREF> border_color;
|
||||
bool should_apply_accent = false;
|
||||
|
||||
if (std::holds_alternative<bool>(accent_color_)) {
|
||||
bool force_accent = std::get<bool>(accent_color_);
|
||||
if (!force_accent) {
|
||||
should_apply_accent = false;
|
||||
} else {
|
||||
std::optional<DWORD> accent_color = GetAccentColor();
|
||||
if (accent_color.has_value()) {
|
||||
border_color = RGB(GetRValue(accent_color.value()),
|
||||
GetGValue(accent_color.value()),
|
||||
GetBValue(accent_color.value()));
|
||||
should_apply_accent = true;
|
||||
}
|
||||
}
|
||||
} else if (std::holds_alternative<SkColor>(accent_color_)) {
|
||||
if (std::holds_alternative<SkColor>(accent_color_)) {
|
||||
// If the user has explicitly set an accent color, use it
|
||||
// regardless of whether the system accent color is enabled.
|
||||
SkColor color = std::get<SkColor>(accent_color_);
|
||||
border_color =
|
||||
RGB(SkColorGetR(color), SkColorGetG(color), SkColorGetB(color));
|
||||
should_apply_accent = true;
|
||||
} else if (std::holds_alternative<bool>(accent_color_)) {
|
||||
// Allow the user to optionally force system color on/off.
|
||||
should_apply_accent = std::get<bool>(accent_color_);
|
||||
} else if (std::holds_alternative<std::monostate>(accent_color_)) {
|
||||
if (IsAccentColorOnTitleBarsEnabled()) {
|
||||
std::optional<DWORD> accent_color = GetAccentColor();
|
||||
if (accent_color.has_value()) {
|
||||
border_color = RGB(GetRValue(accent_color.value()),
|
||||
GetGValue(accent_color.value()),
|
||||
GetBValue(accent_color.value()));
|
||||
should_apply_accent = true;
|
||||
}
|
||||
// If no explicit color was set, default to the system accent color.
|
||||
should_apply_accent = IsAccentColorOnTitleBarsEnabled();
|
||||
}
|
||||
|
||||
// Use system accent color as fallback if no explicit color was set.
|
||||
if (!border_color.has_value() && should_apply_accent) {
|
||||
std::optional<DWORD> system_accent_color = GetAccentColor();
|
||||
if (system_accent_color.has_value()) {
|
||||
border_color = RGB(GetRValue(system_accent_color.value()),
|
||||
GetGValue(system_accent_color.value()),
|
||||
GetBValue(system_accent_color.value()));
|
||||
}
|
||||
}
|
||||
|
||||
// Reset to default system colors when accent color should not be applied.
|
||||
if (!should_apply_accent)
|
||||
border_color = DWMWA_COLOR_DEFAULT;
|
||||
SetWindowBorderAndCaptionColor(GetAcceleratedWidget(), border_color);
|
||||
COLORREF final_color = border_color.value_or(DWMWA_COLOR_DEFAULT);
|
||||
SetWindowBorderAndCaptionColor(GetAcceleratedWidget(), final_color);
|
||||
}
|
||||
|
||||
void NativeWindowViews::ResetWindowControls() {
|
||||
|
|
|
@ -338,7 +338,7 @@ static NSString* const ImageScrubberItemIdentifier = @"scrubber.image.item";
|
|||
}
|
||||
|
||||
- (NSColor*)colorFromHexColorString:(const std::string&)colorString {
|
||||
SkColor color = electron::ParseCSSColor(colorString);
|
||||
SkColor color = electron::ParseCSSColor(colorString).value_or(SK_ColorWHITE);
|
||||
return skia::SkColorToDeviceNSColor(color);
|
||||
}
|
||||
|
||||
|
|
|
@ -215,7 +215,7 @@ void WebContentsPreferences::SetFromDictionary(
|
|||
}
|
||||
std::string background_color;
|
||||
if (web_preferences.GetHidden(options::kBackgroundColor, &background_color))
|
||||
background_color_ = ParseCSSColor(background_color);
|
||||
background_color_ = ParseCSSColor(background_color).value_or(SK_ColorWHITE);
|
||||
std::string safe_dialogs_message;
|
||||
if (web_preferences.Get("safeDialogsMessage", &safe_dialogs_message))
|
||||
safe_dialogs_message_ = safe_dialogs_message;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue