Bug 1931432: Fix up how :empty, :first-child and :last-child invalidation are skipped. r=firefox-style-system-reviewers,emilio
Previous go at optimizing in Bug 1896380 was not quite correct. For example, given `.anchor:has(:first-child)`, when `.anchor` has a new child inserted, we need to be able to invalidate (Which we did not). Thankfully, we can reason that the previously-optimized pseudo- classes, i.e. :empty, :first-child, :last-child, can be trivially rejected from activating the invalidation machinery by by examining its descendants/siblings - e.g. `:has(:first-child)` is irrelevant to elements we know aren't in the first sibling position. Differential Revision: https://phabricator.services.mozilla.com/D229670
This commit is contained in:
@@ -160,7 +160,7 @@ void RestyleManager::ContentAppended(nsIContent* aFirstNewContent) {
|
||||
PostRestyleEvent(element, RestyleHint::RestyleSubtree(),
|
||||
nsChangeHint(0));
|
||||
StyleSet()->MaybeInvalidateRelativeSelectorForNthEdgeDependency(
|
||||
*element);
|
||||
*element, StyleRelativeSelectorNthEdgeInvalidateFor::Last);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -218,7 +218,7 @@ void RestyleManager::MaybeRestyleForEdgeChildChange(nsINode* aContainer,
|
||||
PostRestyleEvent(element, RestyleHint::RestyleSubtree(),
|
||||
nsChangeHint(0));
|
||||
StyleSet()->MaybeInvalidateRelativeSelectorForNthEdgeDependency(
|
||||
*element);
|
||||
*element, StyleRelativeSelectorNthEdgeInvalidateFor::First);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -237,7 +237,7 @@ void RestyleManager::MaybeRestyleForEdgeChildChange(nsINode* aContainer,
|
||||
PostRestyleEvent(element, RestyleHint::RestyleSubtree(),
|
||||
nsChangeHint(0));
|
||||
StyleSet()->MaybeInvalidateRelativeSelectorForNthEdgeDependency(
|
||||
*element);
|
||||
*element, StyleRelativeSelectorNthEdgeInvalidateFor::Last);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -541,7 +541,7 @@ void RestyleManager::ContentWillBeRemoved(nsIContent* aOldChild) {
|
||||
PostRestyleEvent(element, RestyleHint::RestyleSubtree(),
|
||||
nsChangeHint(0));
|
||||
StyleSet()->MaybeInvalidateRelativeSelectorForNthEdgeDependency(
|
||||
*element);
|
||||
*element, StyleRelativeSelectorNthEdgeInvalidateFor::First);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -560,7 +560,7 @@ void RestyleManager::ContentWillBeRemoved(nsIContent* aOldChild) {
|
||||
PostRestyleEvent(element, RestyleHint::RestyleSubtree(),
|
||||
nsChangeHint(0));
|
||||
StyleSet()->MaybeInvalidateRelativeSelectorForNthEdgeDependency(
|
||||
*element);
|
||||
*element, StyleRelativeSelectorNthEdgeInvalidateFor::Last);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user