Title: [284865] trunk
Revision
284865
Author
an...@apple.com
Date
2021-10-26 07:55:58 -0700 (Tue, 26 Oct 2021)

Log Message

Fix ::part(foo):hover
https://bugs.webkit.org/show_bug.cgi?id=232301

Reviewed by Alan Bujtas.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html: Added.
* web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html: Added.
* web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt: Added.
* web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html: Added.
* web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html: Added.
* web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html: Added.
* web-platform-tests/css/css-shadow-parts/w3c-import.log:

Source/WebCore:

We fail to match on shadow tree border if the right side of ::part() has other selectors.

Tests: imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html

* css/CSSSelector.cpp:
(WebCore::CSSSelector::selectorText const):
* css/CSSSelector.h:

Add a new ShadowPartDescendant relation type that behaves like the existing ShadowDescendant relation
except it is only used for ::part.

* css/SelectorChecker.cpp:
(WebCore::SelectorChecker::matchRecursively const):

We can now identify the ::part case easily from the relation type.

(WebCore::canMatchHoverOrActiveInQuirksMode):
* css/SelectorFilter.cpp:
(WebCore::collectSelectorHashes):
* css/parser/CSSParserSelector.h:
(WebCore::CSSParserSelector::hasShadowDescendant const): Deleted.
* css/parser/CSSSelectorParser.cpp:
(WebCore::CSSSelectorParser::splitCompoundAtImplicitShadowCrossingCombinator):

Use ShadowPartDescendant as appropriate.

* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::fragmentRelationForSelectorRelation):
(WebCore::SelectorCompiler::constructFragmentsInternal):
* style/RuleFeature.cpp:
(WebCore::Style::RuleFeatureSet::computeNextMatchElement):

LayoutTests:

* TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (284864 => 284865)


--- trunk/LayoutTests/ChangeLog	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/ChangeLog	2021-10-26 14:55:58 UTC (rev 284865)
@@ -1,5 +1,14 @@
 2021-10-26  Antti Koivisto  <an...@apple.com>
 
+        Fix ::part(foo):hover
+        https://bugs.webkit.org/show_bug.cgi?id=232301
+
+        Reviewed by Alan Bujtas.
+
+        * TestExpectations:
+
+2021-10-26  Antti Koivisto  <an...@apple.com>
+
         [CSS Cascade Layers] Media queries should be able to affect layer order
         https://bugs.webkit.org/show_bug.cgi?id=232238
 

Modified: trunk/LayoutTests/TestExpectations (284864 => 284865)


--- trunk/LayoutTests/TestExpectations	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/TestExpectations	2021-10-26 14:55:58 UTC (rev 284865)
@@ -5191,3 +5191,5 @@
 
 # IPC test failing in Debug mode due to assert.
 [ Debug ] ipc/send-invalid-message.html [ Skip ]
+
+imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html [ ImageOnlyFailure ]

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (284864 => 284865)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-10-26 14:55:58 UTC (rev 284865)
@@ -1,5 +1,20 @@
 2021-10-26  Antti Koivisto  <an...@apple.com>
 
+        Fix ::part(foo):hover
+        https://bugs.webkit.org/show_bug.cgi?id=232301
+
+        Reviewed by Alan Bujtas.
+
+        * web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html: Added.
+        * web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html: Added.
+        * web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt: Added.
+        * web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html: Added.
+        * web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html: Added.
+        * web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html: Added.
+        * web-platform-tests/css/css-shadow-parts/w3c-import.log:
+
+2021-10-26  Antti Koivisto  <an...@apple.com>
+
         Serialize :part() argument as identifier
         https://bugs.webkit.org/show_bug.cgi?id=232297
 

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html (0 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html	2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<button style="color:green">Should be green on focus</button>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html (0 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html	2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>CSS Shadow Parts - Nested Pseudo Classes</title>
+<link rel="help" href="" >
+<link rel="help" href=""
+<link href="" rel="help">
+<link rel="match" href=""
+<script src=""
+<script src=""
+<script src=""
+<style>
+  :root { color: red; }
+  ::part(test):is(:focus) { color: green; }
+</style>
+<div id=host></div>
+<script>
+  const root = host.attachShadow({mode: 'closed'});
+  root.innerHTML = '<button part=test>Should be green on focus</button>';
+  const button = root.querySelector('button');
+  button.addEventListener('focus', takeScreenshot);
+  test_driver.bless('focus button', () => button.focus());
+</script>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt (0 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.txt	2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,3 @@
+
+PASS Invalidation of nested part on hover
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html (0 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html	2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,50 @@
+<!doctype html>
+<title>CSS Shadow Parts - Pseudo class and exported parts</title>
+<link rel="help" href="" >
+<link rel="help" href=""
+<link href="" rel="help">
+<link rel="match" href=""
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<style>
+/* NOTE: Even though it might be tempting to use :focus instead, because we
+   can more easily add that state programmatically, that'd defeat the point
+   of the test, since :focus / :focus-visible has default styles which
+   invalidate the element's style anyways */
+#host::part(a):hover {
+  background: blue;
+}
+</style>
+<div id="host"></div>
+<script>
+let host = document.querySelector('#host')
+host.attachShadow({mode: 'open'}).innerHTML = `<div part="b" exportparts="a"></div>`;
+
+let innerHost = host.shadowRoot.querySelector('div');
+innerHost.attachShadow({mode: 'open'}).innerHTML = `
+  <style>
+    div {
+      width: 100px;
+      height: 100px;
+      background: black;
+      color: white;
+    }
+  </style>
+  <div part="a">hover, the background should be blue</div>
+`;
+
+let part = innerHost.shadowRoot.querySelector("div");
+let t = async_test("Invalidation of nested part on hover");
+part.addEventListener("mouseover", t.step_func_done(function() {
+  assert_true(part.matches(":hover"), "Element should be hovered");
+  assert_equals(getComputedStyle(part).backgroundColor, "rgb(0, 0, 255)", "Hover style should apply");
+}));
+
+new test_driver.Actions()
+    .pointerMove(0, 0)
+    .pointerMove(50, 50)
+    .send();
+</script>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html (0 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html	2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,9 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<style>
+input {
+  border: 1px solid green;
+}
+</style>
+<input type=file part=input>
+<input type=text part=input placeholder=Foobar>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html (0 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html	2021-10-26 14:55:58 UTC (rev 284865)
@@ -0,0 +1,17 @@
+<!doctype html>
+<title>::part() doesn't incorrectly match pseudo-elements of the part</title>
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="match" href=""
+<style>
+#host::part(input) {
+  border: 1px solid green;
+}
+</style>
+<div id="host"></div>
+<script>
+  document.getElementById("host").attachShadow({ mode: "open" }).innerHTML = `
+    <input type=file part=input>
+    <input type=text part=input placeholder=Foobar>
+  `;
+</script>

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/w3c-import.log (284864 => 284865)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/w3c-import.log	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/w3c-import.log	2021-10-26 14:55:58 UTC (rev 284865)
@@ -26,6 +26,8 @@
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/host-stylesheet.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/idlharness.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/inner-host.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class-expected.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-nested-pseudo-class.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-placeholder-expected.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-placeholder.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/interaction-with-pseudo-elements.html
@@ -36,8 +38,12 @@
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-change-part-name.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-complex-selector-forward.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-complex-selector.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo-expected.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/multiple-parts.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-name-idl.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo-expected.html
+/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-nested-pseudo.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/precedence-part-vs-part.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/serialization.html
 /LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/simple-forward-shorthand.html

Modified: trunk/Source/WebCore/ChangeLog (284864 => 284865)


--- trunk/Source/WebCore/ChangeLog	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/ChangeLog	2021-10-26 14:55:58 UTC (rev 284865)
@@ -1,5 +1,44 @@
 2021-10-26  Antti Koivisto  <an...@apple.com>
 
+        Fix ::part(foo):hover
+        https://bugs.webkit.org/show_bug.cgi?id=232301
+
+        Reviewed by Alan Bujtas.
+
+        We fail to match on shadow tree border if the right side of ::part() has other selectors.
+
+        Tests: imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-part-pseudo.html
+
+        * css/CSSSelector.cpp:
+        (WebCore::CSSSelector::selectorText const):
+        * css/CSSSelector.h:
+
+        Add a new ShadowPartDescendant relation type that behaves like the existing ShadowDescendant relation
+        except it is only used for ::part.
+
+        * css/SelectorChecker.cpp:
+        (WebCore::SelectorChecker::matchRecursively const):
+
+        We can now identify the ::part case easily from the relation type.
+
+        (WebCore::canMatchHoverOrActiveInQuirksMode):
+        * css/SelectorFilter.cpp:
+        (WebCore::collectSelectorHashes):
+        * css/parser/CSSParserSelector.h:
+        (WebCore::CSSParserSelector::hasShadowDescendant const): Deleted.
+        * css/parser/CSSSelectorParser.cpp:
+        (WebCore::CSSSelectorParser::splitCompoundAtImplicitShadowCrossingCombinator):
+
+        Use ShadowPartDescendant as appropriate.
+
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::fragmentRelationForSelectorRelation):
+        (WebCore::SelectorCompiler::constructFragmentsInternal):
+        * style/RuleFeature.cpp:
+        (WebCore::Style::RuleFeatureSet::computeNextMatchElement):
+
+2021-10-26  Antti Koivisto  <an...@apple.com>
+
         Serialize :part() argument as identifier
         https://bugs.webkit.org/show_bug.cgi?id=232297
 

Modified: trunk/Source/WebCore/css/CSSSelector.cpp (284864 => 284865)


--- trunk/Source/WebCore/css/CSSSelector.cpp	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/CSSSelector.cpp	2021-10-26 14:55:58 UTC (rev 284865)
@@ -822,6 +822,7 @@
             FALLTHROUGH;
 #endif
         case CSSSelector::ShadowDescendant:
+        case CSSSelector::ShadowPartDescendant:
             builder.append(rightSide);
             return tagHistory->selectorText(builder.toString());
         }

Modified: trunk/Source/WebCore/css/CSSSelector.h (284864 => 284865)


--- trunk/Source/WebCore/css/CSSSelector.h	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/CSSSelector.h	2021-10-26 14:55:58 UTC (rev 284865)
@@ -86,7 +86,8 @@
             Child,
             DirectAdjacent,
             IndirectAdjacent,
-            ShadowDescendant
+            ShadowDescendant,
+            ShadowPartDescendant
         };
 
         enum PseudoClassType {

Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (284864 => 284865)


--- trunk/Source/WebCore/css/SelectorChecker.cpp	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp	2021-10-26 14:55:58 UTC (rev 284865)
@@ -77,7 +77,6 @@
     bool hasScrollbarPseudo { false };
     bool hasSelectionPseudo { false };
     bool mayMatchHostPseudoClass { false };
-
 };
 
 static inline void addStyleRelation(SelectorChecker::CheckingContext& checkingContext, const Element& element, Style::Relation::Type type, unsigned value = 1)
@@ -409,10 +408,10 @@
             return MatchResult::updateWithMatchType(result, matchType);
         }
     case CSSSelector::ShadowDescendant:
+    case CSSSelector::ShadowPartDescendant:
         {
             // When matching foo::part(bar) we skip directly to the tree of element 'foo'.
-            bool isPart = context.selector->match() == CSSSelector::PseudoElement && context.selector->pseudoElementType() == CSSSelector::PseudoElementPart;
-            auto* shadowHost = isPart ? checkingContext.shadowHostInPartRuleScope : context.element->shadowHost();
+            auto* shadowHost = relation == CSSSelector::ShadowPartDescendant ? checkingContext.shadowHostInPartRuleScope : context.element->shadowHost();
             if (!shadowHost)
                 return MatchResult::fails(Match::SelectorFailsCompletely);
             nextContext.element = shadowHost;
@@ -425,7 +424,6 @@
         }
     }
 
-
     ASSERT_NOT_REACHED();
     return MatchResult::fails(Match::SelectorFailsCompletely);
 }
@@ -599,7 +597,7 @@
         }
 
         auto relation = selector->relation();
-        if (relation == CSSSelector::ShadowDescendant)
+        if (relation == CSSSelector::ShadowDescendant || relation == CSSSelector::ShadowPartDescendant)
             return true;
 
         if (relation != CSSSelector::Subselector)

Modified: trunk/Source/WebCore/css/SelectorFilter.cpp (284864 => 284865)


--- trunk/Source/WebCore/css/SelectorFilter.cpp	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/SelectorFilter.cpp	2021-10-26 14:55:58 UTC (rev 284865)
@@ -194,6 +194,7 @@
         case CSSSelector::DirectAdjacent:
         case CSSSelector::IndirectAdjacent:
         case CSSSelector::ShadowDescendant:
+        case CSSSelector::ShadowPartDescendant:
             skipOverSubselectors = true;
             break;
         case CSSSelector::DescendantSpace:

Modified: trunk/Source/WebCore/css/parser/CSSParserSelector.h (284864 => 284865)


--- trunk/Source/WebCore/css/parser/CSSParserSelector.h	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/parser/CSSParserSelector.h	2021-10-26 14:55:58 UTC (rev 284865)
@@ -71,7 +71,6 @@
 
     bool isPseudoElementCueFunction() const;
 
-    bool hasShadowDescendant() const;
     bool matchesPseudoElement() const;
 
     bool isHostPseudoSelector() const;
@@ -96,11 +95,6 @@
     std::unique_ptr<CSSParserSelector> m_tagHistory;
 };
 
-inline bool CSSParserSelector::hasShadowDescendant() const
-{
-    return m_selector->relation() == CSSSelector::ShadowDescendant;
-}
-
 inline bool CSSParserSelector::needsImplicitShadowCombinatorForMatching() const
 {
     return match() == CSSSelector::PseudoElement

Modified: trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp (284864 => 284865)


--- trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp	2021-10-26 14:55:58 UTC (rev 284865)
@@ -1068,7 +1068,7 @@
     } else
         secondCompound = splitAfter->releaseTagHistory();
 
-    secondCompound->appendTagHistory(CSSSelector::ShadowDescendant, WTFMove(compoundSelector));
+    secondCompound->appendTagHistory(isPart ? CSSSelector::ShadowPartDescendant : CSSSelector::ShadowDescendant, WTFMove(compoundSelector));
     return secondCompound;
 }
 

Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (284864 => 284865)


--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2021-10-26 14:55:58 UTC (rev 284865)
@@ -500,6 +500,7 @@
         return FragmentRelation::IndirectAdjacent;
     case CSSSelector::Subselector:
     case CSSSelector::ShadowDescendant:
+    case CSSSelector::ShadowPartDescendant:
         ASSERT_NOT_REACHED();
     }
     ASSERT_NOT_REACHED();
@@ -1322,7 +1323,7 @@
         if (relation == CSSSelector::Subselector)
             continue;
 
-        if (relation == CSSSelector::ShadowDescendant && !selector->isLastInTagHistory())
+        if ((relation == CSSSelector::ShadowDescendant || relation == CSSSelector::ShadowPartDescendant) && !selector->isLastInTagHistory())
             return FunctionType::CannotCompile;
 
         if (relation == CSSSelector::DirectAdjacent || relation == CSSSelector::IndirectAdjacent) {

Modified: trunk/Source/WebCore/style/RuleFeature.cpp (284864 => 284865)


--- trunk/Source/WebCore/style/RuleFeature.cpp	2021-10-26 14:28:58 UTC (rev 284864)
+++ trunk/Source/WebCore/style/RuleFeature.cpp	2021-10-26 14:55:58 UTC (rev 284865)
@@ -84,6 +84,7 @@
                 return MatchElement::AnySibling;
             return matchElement == MatchElement::Subject ? MatchElement::DirectSibling : MatchElement::IndirectSibling;
         case CSSSelector::ShadowDescendant:
+        case CSSSelector::ShadowPartDescendant:
             return MatchElement::Host;
         };
     }
@@ -97,6 +98,7 @@
     case CSSSelector::DirectAdjacent:
         return matchElement == MatchElement::Parent ? MatchElement::ParentSibling : MatchElement::AncestorSibling;
     case CSSSelector::ShadowDescendant:
+    case CSSSelector::ShadowPartDescendant:
         return MatchElement::Host;
     };
     ASSERT_NOT_REACHED();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to