Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (292581 => 292582)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2022-04-08 00:08:16 UTC (rev 292581)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2022-04-08 00:47:15 UTC (rev 292582)
@@ -1,3 +1,13 @@
+2022-04-07 Tim Nguyen <n...@apple.com>
+
+ [:has() pseudo-class] Support invalidation for :indeterminate pseudo class on <progress>
+ https://bugs.webkit.org/show_bug.cgi?id=238923
+
+ Reviewed by Antti Koivisto.
+
+ * web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has-expected.txt:
+ * web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has.html:
+
2022-04-07 Matteo Flores <matteo_flo...@apple.com>
REGRESSION(r291509): imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html is a constant text failure
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has-expected.txt (292581 => 292582)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has-expected.txt 2022-04-08 00:08:16 UTC (rev 292581)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has-expected.txt 2022-04-08 00:47:15 UTC (rev 292582)
@@ -1,6 +1,7 @@
Check me!
-PASS :checked & :indeterminate invalidation
+PASS :checked & :indeterminate invalidation on <input>
+PASS :indeterminate invalidation on <progress>
PASS :disabled invalidation
PASS :read-only invalidation
PASS :valid invalidation
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has.html (292581 => 292582)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has.html 2022-04-08 00:08:16 UTC (rev 292581)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has.html 2022-04-08 00:47:15 UTC (rev 292582)
@@ -15,6 +15,7 @@
.ancestor:has(#textinput:valid) { color: lightgreen }
.ancestor:has(#numberinput:out-of-range) { color: darkgreen }
.ancestor:has(#numberinput:required) { color: pink }
+ .ancestor:has(#progress:indeterminate) { color: orange }
</style>
<div id=subject class=ancestor>
<input type="checkbox" name="my-checkbox" id="checkme">
@@ -22,6 +23,7 @@
<input type="text" id="textinput" required>
<input id="radioinput" checked>
<input id="numberinput" type="number" min="1" max="10" value="5">
+ <progress id="progress" value="50" max="100"></progress>
</div>
<script>
test(function() {
@@ -47,10 +49,21 @@
checkme.checked = true;
assert_equals(getComputedStyle(subject).color, "rgb(0, 128, 0)",
"ancestor should be green");
- }, ":checked & :indeterminate invalidation");
+ }, ":checked & :indeterminate invalidation on <input>");
test(function() {
this.add_cleanup(() => {
+ progress.setAttribute("value", "50");
+ });
+ assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)",
+ "ancestor should be black");
+ progress.removeAttribute("value");
+ assert_equals(getComputedStyle(subject).color, "rgb(255, 165, 0)",
+ "ancestor should be orange");
+ }, ":indeterminate invalidation on <progress>");
+
+ test(function() {
+ this.add_cleanup(() => {
checkme.disabled = false;
});
assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)",
Modified: trunk/Source/WebCore/ChangeLog (292581 => 292582)
--- trunk/Source/WebCore/ChangeLog 2022-04-08 00:08:16 UTC (rev 292581)
+++ trunk/Source/WebCore/ChangeLog 2022-04-08 00:47:15 UTC (rev 292582)
@@ -1,3 +1,21 @@
+2022-04-07 Tim Nguyen <n...@apple.com>
+
+ [:has() pseudo-class] Support invalidation for :indeterminate pseudo class on <progress>
+ https://bugs.webkit.org/show_bug.cgi?id=238923
+
+ Reviewed by Antti Koivisto.
+
+ Test: imported/w3c/web-platform-tests/css/selectors/invalidation/input-pseudo-classes-in-has.html
+
+ * html/HTMLProgressElement.cpp:
+ (WebCore::HTMLProgressElement::HTMLProgressElement):
+ (WebCore::HTMLProgressElement::parseAttribute):
+ (WebCore::HTMLProgressElement::didAttachRenderers):
+ (WebCore::HTMLProgressElement::updateDeterminateState):
+ (WebCore::HTMLProgressElement::didElementStateChange):
+ (WebCore::HTMLProgressElement::isDeterminate const): Deleted.
+ * html/HTMLProgressElement.h:
+
2022-04-07 Nikolas Zimmermann <nzimmerm...@igalia.com>
Unify reference box / CTM computation in RenderLayer
Modified: trunk/Source/WebCore/html/HTMLProgressElement.cpp (292581 => 292582)
--- trunk/Source/WebCore/html/HTMLProgressElement.cpp 2022-04-08 00:08:16 UTC (rev 292581)
+++ trunk/Source/WebCore/html/HTMLProgressElement.cpp 2022-04-08 00:47:15 UTC (rev 292582)
@@ -25,6 +25,7 @@
#include "HTMLNames.h"
#include "HTMLParserIdioms.h"
#include "ProgressShadowElement.h"
+#include "PseudoClassChangeInvalidation.h"
#include "RenderProgress.h"
#include "ShadowRoot.h"
#include <wtf/IsoMallocInlines.h>
@@ -41,6 +42,7 @@
HTMLProgressElement::HTMLProgressElement(const QualifiedName& tagName, Document& document)
: LabelableElement(tagName, document)
, m_value(0)
+ , m_isDeterminate(false)
{
ASSERT(hasTagName(progressTag));
setHasCustomStyleResolveCallbacks();
@@ -77,9 +79,10 @@
void HTMLProgressElement::parseAttribute(const QualifiedName& name, const AtomString& value)
{
- if (name == valueAttr)
+ if (name == valueAttr) {
+ updateDeterminateState();
didElementStateChange();
- else if (name == maxAttr)
+ } else if (name == maxAttr)
didElementStateChange();
else
LabelableElement::parseAttribute(name, value);
@@ -87,8 +90,8 @@
void HTMLProgressElement::didAttachRenderers()
{
- if (RenderProgress* render = renderProgress())
- render->updateFromElement();
+ if (RenderProgress* renderer = renderProgress())
+ renderer->updateFromElement();
}
double HTMLProgressElement::value() const
@@ -121,20 +124,20 @@
return value() / max();
}
-bool HTMLProgressElement::isDeterminate() const
+void HTMLProgressElement::updateDeterminateState()
{
- return hasAttributeWithoutSynchronization(valueAttr);
+ bool newIsDeterminate = hasAttributeWithoutSynchronization(valueAttr);
+ if (m_isDeterminate == newIsDeterminate)
+ return;
+ Style::PseudoClassChangeInvalidation styleInvalidation(*this, CSSSelector::PseudoClassIndeterminate, !newIsDeterminate);
+ m_isDeterminate = newIsDeterminate;
}
-
+
void HTMLProgressElement::didElementStateChange()
{
m_value->setWidthPercentage(position() * 100);
- if (RenderProgress* render = renderProgress()) {
- bool wasDeterminate = render->isDeterminate();
- render->updateFromElement();
- if (wasDeterminate != isDeterminate())
- invalidateStyleForSubtree();
- }
+ if (RenderProgress* renderer = renderProgress())
+ renderer->updateFromElement();
}
void HTMLProgressElement::didAddUserAgentShadowRoot(ShadowRoot& root)
Modified: trunk/Source/WebCore/html/HTMLProgressElement.h (292581 => 292582)
--- trunk/Source/WebCore/html/HTMLProgressElement.h 2022-04-08 00:08:16 UTC (rev 292581)
+++ trunk/Source/WebCore/html/HTMLProgressElement.h 2022-04-08 00:47:15 UTC (rev 292582)
@@ -58,13 +58,15 @@
void didAttachRenderers() final;
+ void updateDeterminateState();
void didElementStateChange();
void didAddUserAgentShadowRoot(ShadowRoot&) final;
- bool isDeterminate() const;
+ bool isDeterminate() const { return m_isDeterminate; };
bool canContainRangeEndPoint() const final { return false; }
ProgressValueElement* m_value;
+ bool m_isDeterminate { false };
};
} // namespace