Give GetClasses a better signature. Bug 233636, r=sicking, sr=dbaron

This commit is contained in:
bzbarsky%mit.edu 2004-03-09 23:22:02 +00:00
Родитель 9eaba6a76b
Коммит 655abf48ad
12 изменённых файлов: 86 добавлений и 71 удалений

Просмотреть файл

@ -45,6 +45,7 @@ class nsString;
class nsICSSStyleRule;
class nsISupportsArray;
class nsRuleWalker;
class nsAttrValue;
// IID for the nsIStyledContent class
#define NS_ISTYLEDCONTENT_IID \
@ -61,7 +62,7 @@ public:
// corresponds to the attribute nsHTMLAtoms::kClass. If this becomes
// incorrect, then new methods need to be added here.
NS_IMETHOD GetID(nsIAtom** aResult) const = 0;
NS_IMETHOD GetClasses(nsVoidArray& aArray) const = 0;
virtual const nsAttrValue* GetClasses() const = 0;
NS_IMETHOD_(PRBool) HasClass(nsIAtom* aClass, PRBool aCaseSensitive) const = 0;
NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker) = 0;

Просмотреть файл

@ -474,6 +474,37 @@ nsAttrValue::GetColorValue(nscolor& aColor) const
return PR_TRUE;
}
PRInt32
nsAttrValue::GetAtomCount() const
{
ValueType type = Type();
if (type == eAtom) {
return 1;
}
if (type == eAtomArray) {
return GetAtomArrayValue()->Count();
}
return 0;
}
nsIAtom*
nsAttrValue::AtomAt(PRInt32 aIndex) const
{
NS_PRECONDITION(aIndex >= 0, "Index must not be negative");
NS_PRECONDITION(GetAtomCount() > aIndex, "aIndex out of range");
if (BaseType() == eAtomBase) {
return GetAtomValue();
}
NS_ASSERTION(Type() == eAtomArray, "GetAtomCount must be confused");
return GetAtomArrayValue()->ObjectAt(aIndex);
}
PRUint32
nsAttrValue::HashValue() const
{

Просмотреть файл

@ -124,6 +124,14 @@ public:
inline nsISVGValue* GetSVGValue() const;
#endif
// Methods to get access to atoms we may have
// Returns the number of atoms we have; 0 if we have none. It's OK
// to call this without checking the type first; it handles that.
PRInt32 GetAtomCount() const;
// Returns the atom at aIndex (0-based). Do not call this with
// aIndex >= GetAtomCount().
nsIAtom* AtomAt(PRInt32 aIndex) const;
PRUint32 HashValue() const;
PRBool Equals(const nsAttrValue& aOther) const;

Просмотреть файл

@ -2080,11 +2080,10 @@ nsGenericElement::GetID(nsIAtom** aResult) const
return NS_OK;
}
NS_IMETHODIMP
nsGenericElement::GetClasses(nsVoidArray& aArray) const
const nsAttrValue*
nsGenericElement::GetClasses() const
{
aArray.Clear();
return NS_OK;
return nsnull;
}
NS_IMETHODIMP_(PRBool)

Просмотреть файл

@ -422,7 +422,7 @@ public:
// nsIStyledContent interface methods
NS_IMETHOD GetID(nsIAtom** aResult) const;
NS_IMETHOD GetClasses(nsVoidArray& aArray) const;
virtual const nsAttrValue* GetClasses() const;
NS_IMETHOD_(PRBool) HasClass(nsIAtom* aClass, PRBool aCaseSensitive) const;
NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker);
NS_IMETHOD GetInlineStyleRule(nsICSSStyleRule** aStyleRule);

Просмотреть файл

@ -1810,28 +1810,10 @@ nsGenericHTMLElement::GetID(nsIAtom** aResult) const
return NS_OK;
}
nsresult
nsGenericHTMLElement::GetClasses(nsVoidArray& aArray) const
const nsAttrValue*
nsGenericHTMLElement::GetClasses() const
{
aArray.Clear();
const nsAttrValue* val = mAttrsAndChildren.GetAttr(nsHTMLAtoms::kClass);
if (val) {
if (val->Type() == nsAttrValue::eAtom) {
// NOTE atom is not addrefed
aArray.AppendElement(val->GetAtomValue());
}
else if (val->Type() == nsAttrValue::eAtomArray) {
nsCOMArray<nsIAtom>* array = val->GetAtomArrayValue();
PRInt32 i, count = array->Count();
for (i = 0; i < count; ++i) {
// NOTE atom is not addrefed
aArray.AppendElement(array->ObjectAt(i));
}
}
}
return NS_OK;
return mAttrsAndChildren.GetAttr(nsHTMLAtoms::kClass);
}
nsIAtom *

Просмотреть файл

@ -203,7 +203,7 @@ public:
// Implementation for nsIHTMLContent
NS_IMETHOD GetHTMLAttribute(nsIAtom* aAttribute, nsHTMLValue& aValue) const;
NS_IMETHOD GetID(nsIAtom** aResult) const;
NS_IMETHOD GetClasses(nsVoidArray& aArray) const;
virtual const nsAttrValue* GetClasses() const;
virtual nsIAtom *GetIDAttributeName() const;
virtual nsIAtom *GetClassAttributeName() const;
NS_IMETHOD_(PRBool) HasClass(nsIAtom* aClass, PRBool aCaseSensitive) const;

Просмотреть файл

@ -100,6 +100,7 @@
#include "nsContentUtils.h"
#include "nsIJSContextStack.h"
#include "nsIScriptSecurityManager.h"
#include "nsAttrValue.h"
struct RuleValue {
/**
@ -343,7 +344,7 @@ public:
~RuleHash();
void PrependRule(RuleValue *aRuleInfo);
void EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag, nsIAtom* aID,
const nsVoidArray& aClassList,
const nsAttrValue* aClassList,
RuleEnumFunc aFunc, void* aData);
void EnumerateTagRules(nsIAtom* aTag,
RuleEnumFunc aFunc, void* aData);
@ -531,10 +532,11 @@ void RuleHash::PrependRule(RuleValue *aRuleInfo)
#endif
void RuleHash::EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag,
nsIAtom* aID, const nsVoidArray& aClassList,
nsIAtom* aID, const nsAttrValue* aClassList,
RuleEnumFunc aFunc, void* aData)
{
PRInt32 classCount = aClassList.Count();
PRInt32 classCount = aClassList ? aClassList->GetAtomCount() : 0;
// assume 1 universal, tag, id, and namespace, rather than wasting
// time counting
PRInt32 testCount = classCount + 4;
@ -586,9 +588,9 @@ void RuleHash::EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag,
}
{ // extra scope to work around compiler bugs with |for| scoping.
for (PRInt32 index = 0; index < classCount; ++index) {
nsIAtom* classAtom = (nsIAtom*)aClassList.ElementAt(index);
RuleHashTableEntry *entry = NS_STATIC_CAST(RuleHashTableEntry*,
PL_DHashTableOperate(&mClassTable, classAtom, PL_DHASH_LOOKUP));
PL_DHashTableOperate(&mClassTable, aClassList->AtomAt(index),
PL_DHASH_LOOKUP));
if (PL_DHASH_ENTRY_IS_BUSY(entry)) {
RuleValue *value = entry->mRules;
mEnumList[valueCount++] = value;
@ -3895,13 +3897,17 @@ CSSRuleProcessor::RulesMatching(ElementRuleProcessorData *aData,
RuleCascadeData* cascade = GetRuleCascade(aData->mPresContext, aMedium);
if (cascade) {
nsAutoVoidArray classArray;
nsIStyledContent* styledContent = aData->mStyledContent;
const nsAttrValue* classes = nsnull;
if (styledContent)
styledContent->GetClasses(classArray);
cascade->mRuleHash.EnumerateAllRules(aData->mNameSpaceID, aData->mContentTag, aData->mContentID, classArray, ContentEnumFunc, aData);
classes = styledContent->GetClasses();
cascade->mRuleHash.EnumerateAllRules(aData->mNameSpaceID,
aData->mContentTag,
aData->mContentID,
classes,
ContentEnumFunc,
aData);
}
return NS_OK;
}

Просмотреть файл

@ -86,7 +86,7 @@ public:
// nsIStyledContent
NS_IMETHOD GetID(nsIAtom** aResult) const;
// NS_IMETHOD GetClasses(nsVoidArray& aArray) const;
// virtual const nsAttrValue* GetClasses() const;
// NS_IMETHOD HasClass(nsIAtom* aClass) const;
NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker);

Просмотреть файл

@ -3161,28 +3161,10 @@ nsXULElement::GetID(nsIAtom** aResult) const
return NS_OK;
}
NS_IMETHODIMP
nsXULElement::GetClasses(nsVoidArray& aArray) const
const nsAttrValue*
nsXULElement::GetClasses() const
{
aArray.Clear();
const nsAttrValue* val = FindLocalOrProtoAttr(kNameSpaceID_None, nsXULAtoms::clazz);
if (val) {
if (val->Type() == nsAttrValue::eAtom) {
// NOTE atom is not addrefed
aArray.AppendElement(val->GetAtomValue());
}
else if (val->Type() == nsAttrValue::eAtomArray) {
nsCOMArray<nsIAtom>* array = val->GetAtomArrayValue();
PRInt32 i, count = array->Count();
for (i = 0; i < count; ++i) {
// NOTE atom is not addrefed
aArray.AppendElement(array->ObjectAt(i));
}
}
}
return NS_OK;
return FindLocalOrProtoAttr(kNameSpaceID_None, nsXULAtoms::clazz);
}
NS_IMETHODIMP_(PRBool)

Просмотреть файл

@ -504,7 +504,7 @@ public:
// nsIStyledContent
NS_IMETHOD GetID(nsIAtom** aResult) const;
NS_IMETHOD GetClasses(nsVoidArray& aArray) const;
virtual const nsAttrValue* GetClasses() const;
NS_IMETHOD_(PRBool) HasClass(nsIAtom* aClass, PRBool aCaseSensitive) const;
NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker);

Просмотреть файл

@ -100,6 +100,7 @@
#include "nsContentUtils.h"
#include "nsIJSContextStack.h"
#include "nsIScriptSecurityManager.h"
#include "nsAttrValue.h"
struct RuleValue {
/**
@ -343,7 +344,7 @@ public:
~RuleHash();
void PrependRule(RuleValue *aRuleInfo);
void EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag, nsIAtom* aID,
const nsVoidArray& aClassList,
const nsAttrValue* aClassList,
RuleEnumFunc aFunc, void* aData);
void EnumerateTagRules(nsIAtom* aTag,
RuleEnumFunc aFunc, void* aData);
@ -531,10 +532,11 @@ void RuleHash::PrependRule(RuleValue *aRuleInfo)
#endif
void RuleHash::EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag,
nsIAtom* aID, const nsVoidArray& aClassList,
nsIAtom* aID, const nsAttrValue* aClassList,
RuleEnumFunc aFunc, void* aData)
{
PRInt32 classCount = aClassList.Count();
PRInt32 classCount = aClassList ? aClassList->GetAtomCount() : 0;
// assume 1 universal, tag, id, and namespace, rather than wasting
// time counting
PRInt32 testCount = classCount + 4;
@ -586,9 +588,9 @@ void RuleHash::EnumerateAllRules(PRInt32 aNameSpace, nsIAtom* aTag,
}
{ // extra scope to work around compiler bugs with |for| scoping.
for (PRInt32 index = 0; index < classCount; ++index) {
nsIAtom* classAtom = (nsIAtom*)aClassList.ElementAt(index);
RuleHashTableEntry *entry = NS_STATIC_CAST(RuleHashTableEntry*,
PL_DHashTableOperate(&mClassTable, classAtom, PL_DHASH_LOOKUP));
PL_DHashTableOperate(&mClassTable, aClassList->AtomAt(index),
PL_DHASH_LOOKUP));
if (PL_DHASH_ENTRY_IS_BUSY(entry)) {
RuleValue *value = entry->mRules;
mEnumList[valueCount++] = value;
@ -3895,13 +3897,17 @@ CSSRuleProcessor::RulesMatching(ElementRuleProcessorData *aData,
RuleCascadeData* cascade = GetRuleCascade(aData->mPresContext, aMedium);
if (cascade) {
nsAutoVoidArray classArray;
nsIStyledContent* styledContent = aData->mStyledContent;
const nsAttrValue* classes = nsnull;
if (styledContent)
styledContent->GetClasses(classArray);
cascade->mRuleHash.EnumerateAllRules(aData->mNameSpaceID, aData->mContentTag, aData->mContentID, classArray, ContentEnumFunc, aData);
classes = styledContent->GetClasses();
cascade->mRuleHash.EnumerateAllRules(aData->mNameSpaceID,
aData->mContentTag,
aData->mContentID,
classes,
ContentEnumFunc,
aData);
}
return NS_OK;
}