Fix HasAttributeDependentStyle to not assume that class and ID attributes are

named "class" and "id".  Bug 240766, r+sr=dbaron


git-svn-id: svn://10.0.0.236/trunk@155242 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bzbarsky%mit.edu 2004-04-20 19:48:20 +00:00
parent 811e223ae1
commit 5b2a6da9da
2 changed files with 40 additions and 18 deletions

View File

@ -690,6 +690,8 @@ struct RuleCascadeData {
}
RuleHash mRuleHash;
nsVoidArray mStateSelectors;
nsVoidArray mClassSelectors;
nsVoidArray mIDSelectors;
PLDHashTable mAttributeSelectors; // nsIAtom* -> nsVoidArray*
// Looks up or creates the appropriate list in |mAttributeSelectors|.
@ -4084,6 +4086,14 @@ CSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
// we have a hashtable with a per-attribute list.
if (cascade) {
if (aData->mAttribute == aData->mContent->GetIDAttributeName()) {
cascade->mIDSelectors.EnumerateForwards(AttributeEnumFunc, &data);
}
if (aData->mAttribute == aData->mContent->GetClassAttributeName()) {
cascade->mClassSelectors.EnumerateForwards(AttributeEnumFunc, &data);
}
AttributeSelectorEntry *entry = NS_STATIC_CAST(AttributeSelectorEntry*,
PL_DHashTableOperate(&cascade->mAttributeSelectors, aData->mAttribute,
PL_DHASH_LOOKUP));
@ -4139,6 +4149,9 @@ AddRule(void* aRuleInfo, void* aCascade)
cascade->mRuleHash.PrependRule(ruleInfo);
nsVoidArray* stateArray = &cascade->mStateSelectors;
nsVoidArray* classArray = &cascade->mClassSelectors;
nsVoidArray* idArray = &cascade->mIDSelectors;
for (nsCSSSelector* selector = ruleInfo->mSelector;
selector; selector = selector->mNext) {
// It's worth noting that this loop over negations isn't quite
@ -4155,19 +4168,17 @@ AddRule(void* aRuleInfo, void* aCascade)
if (IsStateSelector(*negation))
stateArray->AppendElement(selector);
// Build mAttributeSelectors.
// Build mIDSelectors
if (negation->mIDList) {
nsVoidArray *array = cascade->AttributeListFor(nsHTMLAtoms::id);
if (!array)
return PR_FALSE;
array->AppendElement(selector);
idArray->AppendElement(selector);
}
// Build mClassSelectors
if (negation->mClassList) {
nsVoidArray *array = cascade->AttributeListFor(nsHTMLAtoms::kClass);
if (!array)
return PR_FALSE;
array->AppendElement(selector);
classArray->AppendElement(selector);
}
// Build mAttributeSelectors.
for (nsAttrSelector *attr = negation->mAttrList; attr;
attr = attr->mNext) {
nsVoidArray *array = cascade->AttributeListFor(attr->mAttr);

View File

@ -690,6 +690,8 @@ struct RuleCascadeData {
}
RuleHash mRuleHash;
nsVoidArray mStateSelectors;
nsVoidArray mClassSelectors;
nsVoidArray mIDSelectors;
PLDHashTable mAttributeSelectors; // nsIAtom* -> nsVoidArray*
// Looks up or creates the appropriate list in |mAttributeSelectors|.
@ -4084,6 +4086,14 @@ CSSRuleProcessor::HasAttributeDependentStyle(AttributeRuleProcessorData* aData,
// we have a hashtable with a per-attribute list.
if (cascade) {
if (aData->mAttribute == aData->mContent->GetIDAttributeName()) {
cascade->mIDSelectors.EnumerateForwards(AttributeEnumFunc, &data);
}
if (aData->mAttribute == aData->mContent->GetClassAttributeName()) {
cascade->mClassSelectors.EnumerateForwards(AttributeEnumFunc, &data);
}
AttributeSelectorEntry *entry = NS_STATIC_CAST(AttributeSelectorEntry*,
PL_DHashTableOperate(&cascade->mAttributeSelectors, aData->mAttribute,
PL_DHASH_LOOKUP));
@ -4139,6 +4149,9 @@ AddRule(void* aRuleInfo, void* aCascade)
cascade->mRuleHash.PrependRule(ruleInfo);
nsVoidArray* stateArray = &cascade->mStateSelectors;
nsVoidArray* classArray = &cascade->mClassSelectors;
nsVoidArray* idArray = &cascade->mIDSelectors;
for (nsCSSSelector* selector = ruleInfo->mSelector;
selector; selector = selector->mNext) {
// It's worth noting that this loop over negations isn't quite
@ -4155,19 +4168,17 @@ AddRule(void* aRuleInfo, void* aCascade)
if (IsStateSelector(*negation))
stateArray->AppendElement(selector);
// Build mAttributeSelectors.
// Build mIDSelectors
if (negation->mIDList) {
nsVoidArray *array = cascade->AttributeListFor(nsHTMLAtoms::id);
if (!array)
return PR_FALSE;
array->AppendElement(selector);
idArray->AppendElement(selector);
}
// Build mClassSelectors
if (negation->mClassList) {
nsVoidArray *array = cascade->AttributeListFor(nsHTMLAtoms::kClass);
if (!array)
return PR_FALSE;
array->AppendElement(selector);
classArray->AppendElement(selector);
}
// Build mAttributeSelectors.
for (nsAttrSelector *attr = negation->mAttrList; attr;
attr = attr->mNext) {
nsVoidArray *array = cascade->AttributeListFor(attr->mAttr);