From 5b2a6da9dae5dee5cc0eff28ba3f6ddcbe2b8cb6 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Tue, 20 Apr 2004 19:48:20 +0000 Subject: [PATCH] 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 --- .../html/style/src/nsCSSStyleSheet.cpp | 29 +++++++++++++------ mozilla/layout/style/nsCSSStyleSheet.cpp | 29 +++++++++++++------ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp index 7ab4e3986b5..a657a69a62a 100644 --- a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp @@ -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); diff --git a/mozilla/layout/style/nsCSSStyleSheet.cpp b/mozilla/layout/style/nsCSSStyleSheet.cpp index 7ab4e3986b5..a657a69a62a 100644 --- a/mozilla/layout/style/nsCSSStyleSheet.cpp +++ b/mozilla/layout/style/nsCSSStyleSheet.cpp @@ -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);