<picture> container doesn't update when prefers-color-scheme media query changes
https://bugs.webkit.org/show_bug.cgi?id=190913
rdar://problem/45608456
Reviewed by Dean Jackson.
Source/WebCore:
Test: css-dark-mode/prefers-color-scheme-picture-element.html
* css/MediaQueryEvaluator.cpp:
(WebCore::isAppearanceDependent): Added.
(WebCore::MediaQueryEvaluator::evaluate const): Keep track of appearanceDependentResults.
* css/MediaQueryEvaluator.h:
* css/StyleResolver.cpp:
(WebCore::StyleResolver::addAppearanceDependentMediaQueryResult): Added.
(WebCore::StyleResolver::hasMediaQueriesAffectedByAppearanceChange const): Added.
* css/StyleResolver.h:
(WebCore::StyleResolver::hasAppearanceDependentMediaQueries const): Added.
* dom/Document.cpp:
(WebCore::Document::evaluateMediaQueryList): Call checkAppearanceDependentPictures.
(WebCore::Document::checkAppearanceDependentPictures): Added.
(WebCore::Document::addAppearanceDependentPicture): Added.
(WebCore::Document::removeAppearanceDependentPicture): Added.
* dom/Document.h:
* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::bestFitSourceFromPictureElement): Call addAppearanceDependentPicture.
* html/HTMLPictureElement.cpp:
(WebCore::HTMLPictureElement::~HTMLPictureElement): Call removeAppearanceDependentPicture.
(WebCore::HTMLPictureElement::didMoveToNewDocument): Ditto.
(WebCore::HTMLPictureElement::appearanceChangeAffectedPicture const): Added.
* html/HTMLPictureElement.h:
* page/Page.cpp:
(WebCore::Page::appearanceDidChange): Added.
(WebCore::Page::setUseSystemAppearance): Call appearanceDidChange.
(WebCore::Page::setUseDarkAppearance): Call appearanceDidChange.
* page/Page.h:
* style/StyleScope.cpp:
(WebCore::Style::Scope::evaluateMediaQueriesForAppearanceChange): Added.
* style/StyleScope.h:
LayoutTests:
* css-dark-mode/prefers-color-scheme-picture-element-expected.txt: Added.
* css-dark-mode/prefers-color-scheme-picture-element.html: Added.
* platform/mac-highsierra/css-dark-mode/prefers-color-scheme-picture-element-expected.txt: Added.
* platform/mac-sierra/css-dark-mode/prefers-color-scheme-picture-element-expected.txt: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@237878 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/html/HTMLPictureElement.cpp b/Source/WebCore/html/HTMLPictureElement.cpp
index aa2aad6..0046d19 100644
--- a/Source/WebCore/html/HTMLPictureElement.cpp
+++ b/Source/WebCore/html/HTMLPictureElement.cpp
@@ -45,11 +45,13 @@
HTMLPictureElement::~HTMLPictureElement()
{
document().removeViewportDependentPicture(*this);
+ document().removeAppearanceDependentPicture(*this);
}
void HTMLPictureElement::didMoveToNewDocument(Document& oldDocument, Document& newDocument)
{
oldDocument.removeViewportDependentPicture(*this);
+ oldDocument.removeAppearanceDependentPicture(*this);
HTMLElement::didMoveToNewDocument(oldDocument, newDocument);
sourcesChanged();
}
@@ -77,6 +79,18 @@
return false;
}
+bool HTMLPictureElement::appearanceChangeAffectedPicture() const
+{
+ auto documentElement = makeRefPtr(document().documentElement());
+ MediaQueryEvaluator evaluator { document().printing() ? "print" : "screen", document(), documentElement ? documentElement->computedStyle() : nullptr };
+ for (auto& result : m_appearanceDependentMediaQueryResults) {
+ LOG(MediaQueries, "HTMLPictureElement %p appearanceChangeAffectedPicture evaluating media queries", this);
+ if (evaluator.evaluate(result.expression) != result.result)
+ return true;
+ }
+ return false;
+}
+
#if USE(SYSTEM_PREVIEW)
bool HTMLPictureElement::isSystemPreviewImage() const
{