Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 060793dcd5868ea0c16ad35818ba4ed8f2551d28
      
https://github.com/WebKit/WebKit/commit/060793dcd5868ea0c16ad35818ba4ed8f2551d28
  Author: Simon Fraser <simon.fra...@apple.com>
  Date:   2024-11-19 (Tue, 19 Nov 2024)

  Changed paths:
    M Source/WebCore/css/color/StyleColor.cpp
    M Source/WebCore/css/color/StyleColor.h
    M Source/WebCore/dom/Document.cpp
    M Source/WebCore/dom/Document.h
    M Source/WebCore/page/InteractionRegion.cpp
    M Source/WebCore/page/LocalFrameView.cpp
    M Source/WebCore/page/LocalFrameView.h
    M Source/WebCore/rendering/RenderBox.cpp
    M Source/WebCore/testing/Internals.cpp

  Log Message:
  -----------
  Switching light/dark modes doesn't update the base background color if the 
root has `color` set explicitly
https://bugs.webkit.org/show_bug.cgi?id=283140
rdar://139917332

Reviewed by Aditya Keerthi.

The base background color is hardcoded to use a system color,
CSSValueAppleSystemControlBackground, in LocalFrameView. "Dark mode", "elevated 
user
interface" and color scheme state feed into the computation of the color 
returned for
CSSValueAppleSystemControlBackground. However, when those states change, 
there's no
renderer that sees a change to the background-color style, so no clear code 
path that
results in `LocalFrameView::updateBaseBackgroundColor()` being called.

`RenderBox::styleDidChange()` does call 
`frameView().recalculateBaseBackgroundColor()`
when it sees a style change for the document element or body renderers, but on 
light/dark
mode switches, that is triggered by chance because the `color` property (which 
is
inherited) changes, and we get a RepaintForText diff. If the content sets an 
explicit
color on the root, as the test case does, then the bug occurs (or at least it 
will once
fixing bug 267252 means that we don't get spurious render style diffs.)

Fix by calling `updateBaseBackgroundColorIfNecessary()` in 
`Document::resolveStyle().`
This needs to happen after style update, and before layout, because the color 
feeds
into scrollbar colors and compositing, both of which are consulted during/after 
layout.
I also tried to make this a "once per rendering update" thing, but that would 
require
extra dirty state tracking, and `updateBaseBackgroundColorIfNecessary()` is 
almost
always cheap, so it didn't seem necessary.

I also tried putting the base background color into the Document's RenderStyle, 
but
then it can inherit onto the document element, which is web-exposed.

* Source/WebCore/css/color/StyleColor.cpp:
(WebCore::operator<<): Make StyleColorOptions dumpable.
* Source/WebCore/css/color/StyleColor.h:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::resolveStyle):
(WebCore::Document::processColorScheme): No need to call 
`recalculateBaseBackgroundColor()` here, since
it will be called on the next style update.
* Source/WebCore/dom/Document.h: Drive-by: m_allowsColorSchemeTransformations 
was unused; remove it.
* Source/WebCore/page/InteractionRegion.cpp:
(WebCore::interactionRegionForRenderedRegion): Remove a log from an earlier 
commit.
* Source/WebCore/page/LocalFrameView.cpp:
(WebCore::LocalFrameView::updateBaseBackgroundColorIfNecessary):
(WebCore::LocalFrameView::updateBackgroundRecursively):
(WebCore::LocalFrameView::recalculateBaseBackgroundColor): Deleted.
* Source/WebCore/page/LocalFrameView.h:
* Source/WebCore/rendering/RenderBox.cpp:
(WebCore::RenderBox::styleDidChange): No need to call 
`recalculateBaseBackgroundColor()` here.
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::setViewIsTransparent): call `setTransparent()`.
(WebCore::Internals::viewBaseBackgroundColor): Force a layout before getting 
the color.

Canonical link: https://commits.webkit.org/286833@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to