Index: Source/core/css/parser/BisonCSSParser-in.cpp |
diff --git a/Source/core/css/parser/BisonCSSParser-in.cpp b/Source/core/css/parser/BisonCSSParser-in.cpp |
index 23987f311bcaa9e955de34ca6c7b9888833feb79..3034a6f41cc3808e7ef4cc3b532b8c67cd87aec7 100644 |
--- a/Source/core/css/parser/BisonCSSParser-in.cpp |
+++ b/Source/core/css/parser/BisonCSSParser-in.cpp |
@@ -1921,6 +1921,9 @@ CSSParserSelector* BisonCSSParser::rewriteSpecifiersWithElementName(const Atomic |
if (specifiers->needsCrossingTreeScopeBoundary()) |
return rewriteSpecifiersWithElementNameForCustomPseudoElement(tag, elementName, specifiers, tagIsForNamespaceRule); |
+ if (specifiers->isContentPseudoElement()) |
+ return rewriteSpecifiersWithElementNameForContentPseudoElement(tag, elementName, specifiers, tagIsForNamespaceRule); |
+ |
// *:host never matches, so we can't discard the * otherwise we can't tell the |
// difference between *:host and just :host. |
if (tag == anyQName() && !specifiers->hasHostPseudoSelector()) |
@@ -1963,7 +1966,7 @@ CSSParserSelector* BisonCSSParser::rewriteSpecifiersWithElementNameForContentPse |
CSSParserSelector* history = specifiers; |
while (history->tagHistory()) { |
history = history->tagHistory(); |
- if (history->relationIsAffectedByPseudoContent()) |
+ if (history->isContentPseudoElement() || history->relationIsAffectedByPseudoContent()) |
last = history; |
} |
@@ -2016,11 +2019,19 @@ CSSParserSelector* BisonCSSParser::rewriteSpecifiers(CSSParserSelector* specifie |
newSpecifier->appendTagHistory(CSSSelector::ShadowPseudo, sinkFloatingSelector(specifiers)); |
return newSpecifier; |
} |
+ if (newSpecifier->isContentPseudoElement()) { |
+ newSpecifier->appendTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(specifiers)); |
+ return newSpecifier; |
+ } |
if (specifiers->needsCrossingTreeScopeBoundary()) { |
// Specifiers for unknown pseudo element go right behind it in the chain. |
specifiers->insertTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier), CSSSelector::ShadowPseudo); |
return specifiers; |
} |
+ if (specifiers->isContentPseudoElement()) { |
+ specifiers->insertTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier), CSSSelector::SubSelector); |
+ return specifiers; |
+ } |
specifiers->appendTagHistory(CSSSelector::SubSelector, sinkFloatingSelector(newSpecifier)); |
return specifiers; |
} |