Bug 1330843 - Allow JS to create NAC pseudo-elements

Tag #1375
This commit is contained in:
Matt A. Tobin 2020-04-17 05:01:17 -04:00 • committed by Roy Tam
commit c37b4d0c63
8 changed files with 115 additions and 4 deletions

View file

@ -1062,6 +1062,25 @@ ElementForStyleContext(nsIContent* aParentContent,
return f->GetContent()->AsElement();
}
Element* frameElement = aFrame->GetContent()->AsElement();
if (frameElement->IsNativeAnonymous() &&
nsCSSPseudoElements::PseudoElementIsJSCreatedNAC(aPseudoType)) {
// NAC-implemented pseudos use the closest non-NAC element as their
// element to inherit from.
//
// FIXME(heycam): In theory we shouldn't need to limit this only to
// JS-created pseudo-implementing NAC, as all pseudo-implementing
// should use the closest non-native anonymous ancestor element as
// its originating element. But removing that part of the condition
// reveals some bugs in style resultion with display:contents and
// XBL. See bug 1345809.
Element* originatingElement =
nsContentUtils::GetClosestNonNativeAnonymousAncestor(frameElement);
if (originatingElement) {
return originatingElement;
}
}
if (aParentContent) {
return aParentContent->AsElement();
}

View file

@ -5041,8 +5041,19 @@ nsCSSFrameConstructor::ResolveStyleContext(nsStyleContext* aParentStyleContext,
aParentStyleContext);
}
} else {
MOZ_ASSERT(aOriginatingElementOrNull);
MOZ_ASSERT(aContent->IsInNativeAnonymousSubtree());
if (!aOriginatingElementOrNull) {
// For pseudo-implementing NAC created by JS using the ChromeOnly
// document.createElement(..., { pseudo: ... }) API, we find the
// originating element by lookup the tree until we find a non-NAC
// ancestor. (These are the correct semantics for C++-generated pseudo-
// implementing NAC as well, but for those cases we already have a
// correct originating element passed in.)
MOZ_ASSERT(nsCSSPseudoElements::PseudoElementIsJSCreatedNAC(pseudoType));
aOriginatingElementOrNull =
nsContentUtils::GetClosestNonNativeAnonymousAncestor(aContent->AsElement());
}
MOZ_ASSERT(aOriginatingElementOrNull);
result = styleSet->ResolvePseudoElementStyle(aOriginatingElementOrNull,
pseudoType,
aParentStyleContext,