зеркало из https://github.com/mozilla/gecko-dev.git
Give GetClasses a better signature. Bug 233636, r=sicking, sr=dbaron
This commit is contained in:
Родитель
9eaba6a76b
Коммит
655abf48ad
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче