Bug 1331322 - Allow tagging of pseudo-implementing native anonymous content with the pseudo type at creation time

* Stop using a node bit for HasExplicitBaseURI
* Move MAY_HAVE_CLASS to mBoolFlags
* Add a flag to indicate that a node is native anonymous content
* Allow tagging of pseudo-implementing native anonymous content with the pseudo type at creation time, and eliminate explicit style contexts in nsIAnonymousContentCreator::ContentInfo

Tag #1375
This commit is contained in:
Matt A. Tobin 2020-04-16 16:37:28 -04:00 committed by Roy Tam
commit b723a5c8c4
25 changed files with 267 additions and 128 deletions

View file

@ -8905,6 +8905,8 @@ GetIBSplitSiblingForAnonymousBlock(const nsIFrame* aFrame)
*
* Also skip anonymous scrolled-content parents; inherit directly from the
* outer scroll frame.
*
* Also skip NAC parents if the child frame is NAC.
*/
static nsIFrame*
GetCorrectedParent(const nsIFrame* aFrame)
@ -8930,6 +8932,31 @@ GetCorrectedParent(const nsIFrame* aFrame)
if (pseudo == nsCSSAnonBoxes::tableWrapper) {
pseudo = aFrame->PrincipalChildList().FirstChild()->StyleContext()->GetPseudo();
}
// Prevent NAC from inheriting NAC. This partially duplicates the logic
// implemented in nsCSSFrameConstructor::AddFCItemsForAnonymousContent, and is
// necessary so that restyle inherits style contexts in the same way as the
// initial styling performed in frame construction.
//
// It would be nice to put it in CorrectStyleParentFrame and therefore share
// it, but that would lose the information of whether the _child_ is NAC,
// since CorrectStyleParentFrame only knows about the prospective _parent_.
// This duplication and complexity will go away when we fully switch to the
// Servo style system, where all this can be handled much more naturally.
//
// We need to take special care not to disrupt the style inheritance of frames
// whose content is NAC but who implement a pseudo (like an anonymous
// box, or a non-NAC-backed pseudo like ::first-line) that does not match the
// one that the NAC implements, if any.
nsIContent* content = aFrame->GetContent();
Element* element = content->IsElement() ? content->AsElement() : nullptr;
if (element && element->IsNativeAnonymous() &&
element->GetPseudoElementType() == aFrame->StyleContext()->GetPseudoType()) {
while (parent->GetContent() && parent->GetContent()->IsNativeAnonymous()) {
parent = parent->GetParent();
}
}
return nsFrame::CorrectStyleParentFrame(parent, pseudo);
}
@ -9000,6 +9027,9 @@ nsFrame::DoGetParentStyleContext(nsIFrame** aProviderFrame) const
{
*aProviderFrame = nullptr;
nsFrameManager* fm = PresContext()->FrameManager();
// Handle display:contents and the root frame, when there's no parent frame
// to inherit from.
if (MOZ_LIKELY(mContent)) {
nsIContent* parentContent = mContent->GetFlattenedTreeParent();
if (MOZ_LIKELY(parentContent)) {