Bug 1047928 patch 9 - Don't rerun selector matching for viewport units. r=bzbarsky
--- a/layout/base/nsPresContext.cpp
+++ b/layout/base/nsPresContext.cpp
@@ -1880,29 +1880,37 @@ nsPresContext::PostRebuildAllStyleDataEv
}
RestyleManager()->PostRebuildAllStyleDataEvent(aExtraHint, aRestyleHint);
}
void
nsPresContext::MediaFeatureValuesChanged(StyleRebuildType aShouldRebuild,
nsChangeHint aChangeHint)
{
- NS_ASSERTION(aShouldRebuild == eAlwaysRebuildStyle || aChangeHint == 0,
- "If you don't know if we need a rebuild, how can you provide a hint?");
-
mPendingMediaFeatureValuesChanged = false;
+ nsRestyleHint aRestyleHint = nsRestyleHint(0);
+
+ if (aShouldRebuild == eAlwaysRebuildStyle) {
+ // FIXME: Pass restyle hint from caller.
+ aRestyleHint |= eRestyle_Subtree;
+ }
+
// MediumFeaturesChanged updates the applied rules, so it always gets called.
- bool mediaFeaturesDidChange = mShell ? mShell->StyleSet()->MediumFeaturesChanged(this)
- : false;
-
- if (aShouldRebuild == eAlwaysRebuildStyle ||
- mediaFeaturesDidChange ||
- (mUsesViewportUnits && mPendingViewportChange)) {
- RebuildAllStyleData(aChangeHint, eRestyle_Subtree);
+ if (mShell && mShell->StyleSet()->MediumFeaturesChanged(this)) {
+ aRestyleHint |= eRestyle_Subtree;
+ }
+
+ if (mUsesViewportUnits && mPendingViewportChange) {
+ // Rebuild all style data without rerunning selector matching.
+ aRestyleHint |= eRestyle_ForceDescendants;
+ }
+
+ if (aRestyleHint || aChangeHint) {
+ RebuildAllStyleData(aChangeHint, aRestyleHint);
}
mPendingViewportChange = false;
if (mDocument->IsBeingUsedAsImage()) {
MOZ_ASSERT(PR_CLIST_IS_EMPTY(&mDOMMediaQueryLists));
return;
}