Don't bother calling SelectorMatches in Has*DependentStyle if the selector

won't affect our change bitfield.  Bug 319097, r+sr=dbaron
This commit is contained in:
bzbarsky%mit.edu 2005-12-05 18:59:54 +00:00
parent 6a0407face
commit 9dc7327649

View File

@ -3503,12 +3503,16 @@ PR_STATIC_CALLBACK(PRBool) StateEnumFunc(void* aSelector, void* aData)
StateRuleProcessorData *data = enumData->data;
nsCSSSelector* selector = NS_STATIC_CAST(nsCSSSelector*, aSelector);
if (SelectorMatches(*data, selector, data->mStateMask, nsnull) &&
nsReStyleHint possibleChange = IsSiblingOperator(selector->mOperator) ?
eReStyle_LaterSiblings : eReStyle_Self;
// If enumData->change already includes all the bits of possibleChange, don't
// bother calling SelectorMatches, since even if it returns false
// enumData->change won't change.
if ((possibleChange & ~(enumData->change)) &&
SelectorMatches(*data, selector, data->mStateMask, nsnull) &&
SelectorMatchesTree(*data, selector->mNext)) {
if (IsSiblingOperator(selector->mOperator))
enumData->change = nsReStyleHint(enumData->change | eReStyle_LaterSiblings);
else
enumData->change = nsReStyleHint(enumData->change | eReStyle_Self);
enumData->change = nsReStyleHint(enumData->change | possibleChange);
}
return PR_TRUE;
@ -3553,12 +3557,16 @@ PR_STATIC_CALLBACK(PRBool) AttributeEnumFunc(void* aSelector, void* aData)
AttributeRuleProcessorData *data = enumData->data;
nsCSSSelector* selector = NS_STATIC_CAST(nsCSSSelector*, aSelector);
if (SelectorMatches(*data, selector, 0, data->mAttribute) &&
nsReStyleHint possibleChange = IsSiblingOperator(selector->mOperator) ?
eReStyle_LaterSiblings : eReStyle_Self;
// If enumData->change already includes all the bits of possibleChange, don't
// bother calling SelectorMatches, since even if it returns false
// enumData->change won't change.
if ((possibleChange & ~(enumData->change)) &&
SelectorMatches(*data, selector, 0, data->mAttribute) &&
SelectorMatchesTree(*data, selector->mNext)) {
if (IsSiblingOperator(selector->mOperator))
enumData->change = nsReStyleHint(enumData->change | eReStyle_LaterSiblings);
else
enumData->change = nsReStyleHint(enumData->change | eReStyle_Self);
enumData->change = nsReStyleHint(enumData->change | possibleChange);
}
return PR_TRUE;
@ -3584,6 +3592,8 @@ nsCSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData
data.change = nsReStyleHint(data.change | eReStyle_Self);
}
// XXX What about XLinks?
// XXXbz now that :link and :visited are also states, do we need a
// similar optimization in HasStateDependentStyle?
RuleCascadeData* cascade = GetRuleCascade(aData->mPresContext);