Index: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
index 397db5b47fab88bc1d0e205023d0501ffaa2033b..4e2f8bd9d9600cbac80259571414731a9a5e130b 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
@@ -23,6 +23,9 @@ static void recordSelectorStats(const CSSParserContext& context, const CSSSelect |
case CSSSelector::PseudoUnresolved: |
feature = UseCounter::CSSSelectorPseudoUnresolved; |
break; |
+ case CSSSelector::PseudoSlotted: |
+ feature = UseCounter::CSSSelectorPseudoSlotted; |
+ break; |
case CSSSelector::PseudoContent: |
feature = UseCounter::CSSSelectorPseudoContent; |
break; |
@@ -384,6 +387,19 @@ PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumePseudo(CSSParserTokenRan |
selector->adoptSelectorVector(selectorVector); |
return selector.release(); |
} |
+ case CSSSelector::PseudoSlotted: |
+ { |
+ DisallowPseudoElementsScope scope(this); |
+ |
+ OwnPtr<CSSParserSelector> innerSelector = consumeCompoundSelector(block); |
+ block.consumeWhitespace(); |
+ if (!innerSelector || !block.atEnd() || !RuntimeEnabledFeatures::shadowDOMV1Enabled()) |
+ return nullptr; |
+ Vector<OwnPtr<CSSParserSelector>> selectorVector; |
+ selectorVector.append(innerSelector.release()); |
+ selector->adoptSelectorVector(selectorVector); |
+ return selector.release(); |
+ } |
case CSSSelector::PseudoLang: |
{ |
// FIXME: CSS Selectors Level 4 allows :lang(*-foo) |
@@ -620,7 +636,11 @@ PassOwnPtr<CSSParserSelector> CSSSelectorParser::splitCompoundAtImplicitShadowCr |
// the selector parser as a single compound selector. |
// |
// Example: input#x::-webkit-clear-button -> [ ::-webkit-clear-button, input, #x ] |
- |
+ // |
+ // Likewise, ::slotted() pseudo element has an implicit ShadowSlot combinator to its left |
+ // for finding matching slot element in other TreeScope. |
+ // |
+ // Example: slot[name=foo]::slotted(div) -> [ div, slot, [name=foo] ] |
CSSParserSelector* splitAfter = compoundSelector.get(); |
while (splitAfter->tagHistory() && !splitAfter->tagHistory()->needsImplicitShadowCrossingCombinatorForMatching()) |
@@ -630,7 +650,7 @@ PassOwnPtr<CSSParserSelector> CSSSelectorParser::splitCompoundAtImplicitShadowCr |
return compoundSelector; |
OwnPtr<CSSParserSelector> secondCompound = splitAfter->releaseTagHistory(); |
- secondCompound->appendTagHistory(CSSSelector::ShadowPseudo, compoundSelector); |
+ secondCompound->appendTagHistory(secondCompound->pseudoType() == CSSSelector::PseudoSlotted ? CSSSelector::ShadowSlot : CSSSelector::ShadowPseudo, compoundSelector); |
return secondCompound.release(); |
} |