r=waterson
This commit is contained in:
kandrot%netscape.com 2000-09-15 06:52:17 +00:00
Родитель a0946c735c
Коммит 80cea30a82
13 изменённых файлов: 67 добавлений и 198 удалений

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

@ -58,8 +58,6 @@ static NS_DEFINE_CID(kCSSParserCID, NS_CSSPARSER_CID);
static NS_DEFINE_CID(kICSSParserIID, NS_ICSS_PARSER_IID);
const PRInt32 nsXULAttribute::kMaxAtomValueLength = 12;
//----------------------------------------------------------------------
//
// nsClassList
@ -209,8 +207,7 @@ nsXULAttribute::nsXULAttribute(nsIContent* aContent,
const nsAReadableString& aValue)
: mContent(aContent),
mScriptObject(nsnull),
mNodeInfo(aNodeInfo),
mValue(nsnull)
mNodeInfo(aNodeInfo)
{
NS_INIT_REFCNT();
@ -225,7 +222,7 @@ nsXULAttribute::nsXULAttribute(nsIContent* aContent,
nsXULAttribute::~nsXULAttribute()
{
NS_IF_RELEASE(mNodeInfo);
ReleaseValue();
mValue.ReleaseValue();
if (--gRefCnt == 0) {
NS_IF_RELEASE(kIdAtom);
@ -291,7 +288,7 @@ nsXULAttribute::GetNodeName(nsAWritableString& aNodeName)
NS_IMETHODIMP
nsXULAttribute::GetNodeValue(nsAWritableString& aNodeValue)
{
return GetValueInternal(aNodeValue);
return mValue.GetValue(aNodeValue);
}
NS_IMETHODIMP
@ -486,7 +483,7 @@ nsXULAttribute::GetSpecified(PRBool* aSpecified)
NS_IMETHODIMP
nsXULAttribute::GetValue(nsAWritableString& aValue)
{
return GetValueInternal(aValue);
return mValue.GetValue(aValue);
}
NS_IMETHODIMP
@ -557,52 +554,13 @@ nsXULAttribute::GetQualifiedName(nsAWritableString& aQualifiedName)
nsresult
nsXULAttribute::SetValueInternal(const nsAReadableString& aValue)
{
nsCOMPtr<nsIAtom> newAtom;
// Atomize the value if it is short, or if it is the 'id'
// attribute. We atomize the 'id' attribute to "prime" the global
// atom table: the style system frequently asks for it, and if the
// table is "unprimed" we see quite a bit of thrashing as the 'id'
// value is repeatedly added and then removed from the atom table.
if ((aValue.Length() <= kMaxAtomValueLength) || mNodeInfo->Equals(kIdAtom)) {
newAtom = getter_AddRefs( NS_NewAtom(aValue) );
}
if (mValue) {
// Release the old value
ReleaseValue();
}
// ...and set the new value
if (newAtom) {
NS_ADDREF((nsIAtom*)newAtom.get());
mValue = (void*)(PRWord(newAtom.get()) | kAtomType);
}
else {
PRUnichar* str = ToNewUnicode(aValue);
if (! str)
return NS_ERROR_OUT_OF_MEMORY;
mValue = str;
}
return NS_OK;
return mValue.SetValue( aValue, mNodeInfo->Equals(kIdAtom) );
}
nsresult
nsXULAttribute::GetValueAsAtom(nsIAtom** aResult)
{
if (! mValue) {
*aResult = nsnull;
}
else if (IsStringValue()) {
*aResult = NS_NewAtom((const PRUnichar*) mValue);
}
else {
*aResult = (nsIAtom*)(PRWord(mValue) & ~PRWord(kTypeMask));
NS_ADDREF(*aResult);
}
return NS_OK;
return mValue.GetValueAsAtom( aResult );
}

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

@ -37,6 +37,7 @@
#include "nsString.h"
#include "nsIAtom.h"
#include "nsVoidArray.h"
#include "nsXULAttributeValue.h"
class nsIURI;
class nsINodeInfo;
@ -153,45 +154,8 @@ protected:
void* mScriptObject; // The attribute's script object, if reified
nsINodeInfo* mNodeInfo; // The attribute name
void* mValue; // The attribute value; either an nsIAtom* or PRUnichar*,
nsXULAttributeValue mValue; // The attribute value; either an nsIAtom* or PRUnichar*,
// with the low-order bit tagging its type
static const PRInt32 kMaxAtomValueLength;
enum {
kTypeMask = 0x1,
kStringType = 0x0,
kAtomType = 0x1
};
PRBool IsStringValue() {
return (PRWord(mValue) & kTypeMask) == kStringType;
}
nsresult GetValueInternal(nsAWritableString& aResult) {
nsresult rv = NS_OK;
if (! mValue) {
aResult.Truncate();
}
else if (IsStringValue()) {
aResult.Assign((const PRUnichar*) mValue);
}
else {
nsIAtom* atom = (nsIAtom*)(PRWord(mValue) & ~PRWord(kTypeMask));
rv = atom->ToString(aResult);
}
return rv;
}
void ReleaseValue() {
if (IsStringValue()) {
nsMemory::Free(mValue);
}
else {
nsIAtom* atom = (nsIAtom*)(PRWord(mValue) & ~PRWord(kTypeMask));
NS_RELEASE(atom);
}
}
};

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

@ -458,8 +458,10 @@ nsXULElement::Create(nsXULPrototypeElement* aPrototype,
if (NS_FAILED(rv)) return rv;
if (found) {
nsAutoString valueStr;
attr->mValue.GetValue( valueStr );
XUL_PROTOTYPE_ATTRIBUTE_METER(gNumEventHandlers);
rv = element->AddScriptEventListener(name, attr->mValue, iid);
rv = element->AddScriptEventListener(name, valueStr, iid);
if (NS_FAILED(rv)) return rv;
}
@ -1927,9 +1929,9 @@ nsXULElement::GetScriptObject(nsIScriptContext* aContext, void** aScriptObject)
cssDecl->GetPropertyValue(behavior, value);
if (!value.IsEmpty()) {
// We have a binding that must be installed.
PRBool dummy;
PRBool dummy2;
xblService->LoadBindings(NS_STATIC_CAST(nsIStyledContent*, this), value, PR_FALSE,
getter_AddRefs(binding), &dummy);
getter_AddRefs(binding), &dummy2);
if (binding) {
binding->ExecuteAttachedHandler();
}
@ -2588,6 +2590,7 @@ nsXULElement::NormalizeAttributeString(const nsAReadableString& aStr,
count = mPrototype ? mPrototype->mNumAttributes : 0;
for (i = 0; i < count; i++) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]);
nsINodeInfo *ni = attr->mNodeInfo;
if (ni->QualifiedNameEquals(aStr)) {
aNodeInfo = ni;
@ -2833,10 +2836,11 @@ nsXULElement::GetAttribute(PRInt32 aNameSpaceID,
PRInt32 count = mPrototype->mNumAttributes;
for (PRInt32 i = 0; i < count; i++) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]);
nsINodeInfo *ni = attr->mNodeInfo;
if (ni->Equals(aName, aNameSpaceID)) {
ni->GetPrefixAtom(aPrefix);
aResult.Assign(attr->mValue);
attr->mValue.GetValue( aResult );
rv = aResult.Length() ? NS_CONTENT_ATTR_HAS_VALUE : NS_CONTENT_ATTR_NO_VALUE;
break;
}
@ -3029,6 +3033,7 @@ nsXULElement::GetAttributeNameAt(PRInt32 aIndex,
else if (mPrototype) {
if (aIndex >= 0 && aIndex < mPrototype->mNumAttributes) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[aIndex]);
attr->mNodeInfo->GetNamespaceID(aNameSpaceID);
attr->mNodeInfo->GetNameAtom(aName);
attr->mNodeInfo->GetPrefixAtom(aPrefix);
@ -3834,7 +3839,7 @@ nsXULElement::GetID(nsIAtom*& aResult) const
for (PRInt32 i = 0; i < count; i++) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]);
if (attr->mNodeInfo->Equals(nsXULAtoms::id, kNameSpaceID_None)) {
aResult = NS_NewAtom(attr->mValue);
attr->mValue.GetValueAsAtom( &aResult );
break;
}
}
@ -4330,13 +4335,15 @@ nsXULElement::EnsureSlots()
for (PRInt32 i = 0; i < proto->mNumAttributes; ++i) {
nsXULPrototypeAttribute* protoattr = &(proto->mAttributes[i]);
nsAutoString valueStr;
protoattr->mValue.GetValue( valueStr );
// Create a CBufDescriptor to avoid copying the attribute's
// value just to set it.
nsXULAttribute* attr;
rv = nsXULAttribute::Create(NS_STATIC_CAST(nsIStyledContent*, this),
protoattr->mNodeInfo,
protoattr->mValue,
valueStr,
&attr);
if (NS_FAILED(rv)) return rv;
@ -4414,7 +4421,7 @@ nsXULPrototypeElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName, nsAWri
{
for (PRInt32 i = 0; i < mNumAttributes; ++i) {
if (mAttributes[i].mNodeInfo->Equals(aName, aNameSpaceID)) {
aValue = mAttributes[i].mValue;
mAttributes[i].mValue.GetValue( aValue );
return aValue.Length() ? NS_CONTENT_ATTR_HAS_VALUE : NS_CONTENT_ATTR_NO_VALUE;
}

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

@ -61,6 +61,7 @@
#include "nsIBoxObject.h"
#include "nsXULAttributes.h"
#include "nsIChromeEventHandler.h"
#include "nsXULAttributeValue.h"
class nsISizeOfHandler;
@ -104,7 +105,7 @@ public:
~nsXULPrototypeAttribute();
nsCOMPtr<nsINodeInfo> mNodeInfo;
nsString mValue;
nsXULAttributeValue mValue;
void* mEventHandler;
#ifdef XUL_PROTOTYPE_ATTRIBUTE_METERING

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

@ -1265,7 +1265,7 @@ XULContentSinkImpl::AddAttributes(const nsIParserNode& aNode, nsXULPrototypeElem
*getter_AddRefs(attrs->mNodeInfo));
NS_ENSURE_TRUE(attrs->mNodeInfo, NS_ERROR_FAILURE);
attrs->mValue = id;
attrs->mValue.SetValue( id );
++attrs;
}
@ -1291,9 +1291,11 @@ XULContentSinkImpl::AddAttributes(const nsIParserNode& aNode, nsXULPrototypeElem
continue;
}
attrs->mValue = aNode.GetValueAt(i);
nsAutoString valueStr;
valueStr = aNode.GetValueAt(i);
nsRDFParserUtils::StripAndConvert(attrs->mValue);
nsRDFParserUtils::StripAndConvert( valueStr );
attrs->mValue.SetValue( valueStr );
#ifdef PR_LOGGING
if (PR_LOG_TEST(gLog, PR_LOG_DEBUG)) {
@ -1303,7 +1305,7 @@ XULContentSinkImpl::AddAttributes(const nsIParserNode& aNode, nsXULPrototypeElem
extraWhiteSpace += " ";
nsCAutoString qnameC,valueC;
qnameC.AssignWithConversion(qname);
valueC.AssignWithConversion(attrs->mValue);
valueC.AssignWithConversion(valueStr);
PR_LOG(gLog, PR_LOG_DEBUG,
("xul: %.5d. %s %s=%s",
aNode.GetSourceLineNumber(),

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

@ -5796,9 +5796,11 @@ nsXULDocument::AddAttributes(nsXULPrototypeElement* aPrototype, nsIContent* aEle
for (PRInt32 i = 0; i < aPrototype->mNumAttributes; ++i) {
nsXULPrototypeAttribute* protoattr = &(aPrototype->mAttributes[i]);
nsAutoString valueStr;
protoattr->mValue.GetValue( valueStr );
rv = aElement->SetAttribute(protoattr->mNodeInfo,
protoattr->mValue,
valueStr,
PR_FALSE);
if (NS_FAILED(rv)) return rv;
}

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

@ -42,6 +42,7 @@ CPPSRCS = \
nsRuleNetwork.cpp \
nsXULAtoms.cpp \
nsXULElement.cpp \
nsXULAttributeValue.cpp \
nsXULAttributes.cpp \
nsXULContentSink.cpp \
nsXULContentUtils.cpp \

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

@ -58,8 +58,6 @@ static NS_DEFINE_CID(kCSSParserCID, NS_CSSPARSER_CID);
static NS_DEFINE_CID(kICSSParserIID, NS_ICSS_PARSER_IID);
const PRInt32 nsXULAttribute::kMaxAtomValueLength = 12;
//----------------------------------------------------------------------
//
// nsClassList
@ -209,8 +207,7 @@ nsXULAttribute::nsXULAttribute(nsIContent* aContent,
const nsAReadableString& aValue)
: mContent(aContent),
mScriptObject(nsnull),
mNodeInfo(aNodeInfo),
mValue(nsnull)
mNodeInfo(aNodeInfo)
{
NS_INIT_REFCNT();
@ -225,7 +222,7 @@ nsXULAttribute::nsXULAttribute(nsIContent* aContent,
nsXULAttribute::~nsXULAttribute()
{
NS_IF_RELEASE(mNodeInfo);
ReleaseValue();
mValue.ReleaseValue();
if (--gRefCnt == 0) {
NS_IF_RELEASE(kIdAtom);
@ -291,7 +288,7 @@ nsXULAttribute::GetNodeName(nsAWritableString& aNodeName)
NS_IMETHODIMP
nsXULAttribute::GetNodeValue(nsAWritableString& aNodeValue)
{
return GetValueInternal(aNodeValue);
return mValue.GetValue(aNodeValue);
}
NS_IMETHODIMP
@ -486,7 +483,7 @@ nsXULAttribute::GetSpecified(PRBool* aSpecified)
NS_IMETHODIMP
nsXULAttribute::GetValue(nsAWritableString& aValue)
{
return GetValueInternal(aValue);
return mValue.GetValue(aValue);
}
NS_IMETHODIMP
@ -557,52 +554,13 @@ nsXULAttribute::GetQualifiedName(nsAWritableString& aQualifiedName)
nsresult
nsXULAttribute::SetValueInternal(const nsAReadableString& aValue)
{
nsCOMPtr<nsIAtom> newAtom;
// Atomize the value if it is short, or if it is the 'id'
// attribute. We atomize the 'id' attribute to "prime" the global
// atom table: the style system frequently asks for it, and if the
// table is "unprimed" we see quite a bit of thrashing as the 'id'
// value is repeatedly added and then removed from the atom table.
if ((aValue.Length() <= kMaxAtomValueLength) || mNodeInfo->Equals(kIdAtom)) {
newAtom = getter_AddRefs( NS_NewAtom(aValue) );
}
if (mValue) {
// Release the old value
ReleaseValue();
}
// ...and set the new value
if (newAtom) {
NS_ADDREF((nsIAtom*)newAtom.get());
mValue = (void*)(PRWord(newAtom.get()) | kAtomType);
}
else {
PRUnichar* str = ToNewUnicode(aValue);
if (! str)
return NS_ERROR_OUT_OF_MEMORY;
mValue = str;
}
return NS_OK;
return mValue.SetValue( aValue, mNodeInfo->Equals(kIdAtom) );
}
nsresult
nsXULAttribute::GetValueAsAtom(nsIAtom** aResult)
{
if (! mValue) {
*aResult = nsnull;
}
else if (IsStringValue()) {
*aResult = NS_NewAtom((const PRUnichar*) mValue);
}
else {
*aResult = (nsIAtom*)(PRWord(mValue) & ~PRWord(kTypeMask));
NS_ADDREF(*aResult);
}
return NS_OK;
return mValue.GetValueAsAtom( aResult );
}

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

@ -37,6 +37,7 @@
#include "nsString.h"
#include "nsIAtom.h"
#include "nsVoidArray.h"
#include "nsXULAttributeValue.h"
class nsIURI;
class nsINodeInfo;
@ -153,45 +154,8 @@ protected:
void* mScriptObject; // The attribute's script object, if reified
nsINodeInfo* mNodeInfo; // The attribute name
void* mValue; // The attribute value; either an nsIAtom* or PRUnichar*,
nsXULAttributeValue mValue; // The attribute value; either an nsIAtom* or PRUnichar*,
// with the low-order bit tagging its type
static const PRInt32 kMaxAtomValueLength;
enum {
kTypeMask = 0x1,
kStringType = 0x0,
kAtomType = 0x1
};
PRBool IsStringValue() {
return (PRWord(mValue) & kTypeMask) == kStringType;
}
nsresult GetValueInternal(nsAWritableString& aResult) {
nsresult rv = NS_OK;
if (! mValue) {
aResult.Truncate();
}
else if (IsStringValue()) {
aResult.Assign((const PRUnichar*) mValue);
}
else {
nsIAtom* atom = (nsIAtom*)(PRWord(mValue) & ~PRWord(kTypeMask));
rv = atom->ToString(aResult);
}
return rv;
}
void ReleaseValue() {
if (IsStringValue()) {
nsMemory::Free(mValue);
}
else {
nsIAtom* atom = (nsIAtom*)(PRWord(mValue) & ~PRWord(kTypeMask));
NS_RELEASE(atom);
}
}
};

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

@ -1265,7 +1265,7 @@ XULContentSinkImpl::AddAttributes(const nsIParserNode& aNode, nsXULPrototypeElem
*getter_AddRefs(attrs->mNodeInfo));
NS_ENSURE_TRUE(attrs->mNodeInfo, NS_ERROR_FAILURE);
attrs->mValue = id;
attrs->mValue.SetValue( id );
++attrs;
}
@ -1291,9 +1291,11 @@ XULContentSinkImpl::AddAttributes(const nsIParserNode& aNode, nsXULPrototypeElem
continue;
}
attrs->mValue = aNode.GetValueAt(i);
nsAutoString valueStr;
valueStr = aNode.GetValueAt(i);
nsRDFParserUtils::StripAndConvert(attrs->mValue);
nsRDFParserUtils::StripAndConvert( valueStr );
attrs->mValue.SetValue( valueStr );
#ifdef PR_LOGGING
if (PR_LOG_TEST(gLog, PR_LOG_DEBUG)) {
@ -1303,7 +1305,7 @@ XULContentSinkImpl::AddAttributes(const nsIParserNode& aNode, nsXULPrototypeElem
extraWhiteSpace += " ";
nsCAutoString qnameC,valueC;
qnameC.AssignWithConversion(qname);
valueC.AssignWithConversion(attrs->mValue);
valueC.AssignWithConversion(valueStr);
PR_LOG(gLog, PR_LOG_DEBUG,
("xul: %.5d. %s %s=%s",
aNode.GetSourceLineNumber(),

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

@ -5796,9 +5796,11 @@ nsXULDocument::AddAttributes(nsXULPrototypeElement* aPrototype, nsIContent* aEle
for (PRInt32 i = 0; i < aPrototype->mNumAttributes; ++i) {
nsXULPrototypeAttribute* protoattr = &(aPrototype->mAttributes[i]);
nsAutoString valueStr;
protoattr->mValue.GetValue( valueStr );
rv = aElement->SetAttribute(protoattr->mNodeInfo,
protoattr->mValue,
valueStr,
PR_FALSE);
if (NS_FAILED(rv)) return rv;
}

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

@ -458,8 +458,10 @@ nsXULElement::Create(nsXULPrototypeElement* aPrototype,
if (NS_FAILED(rv)) return rv;
if (found) {
nsAutoString valueStr;
attr->mValue.GetValue( valueStr );
XUL_PROTOTYPE_ATTRIBUTE_METER(gNumEventHandlers);
rv = element->AddScriptEventListener(name, attr->mValue, iid);
rv = element->AddScriptEventListener(name, valueStr, iid);
if (NS_FAILED(rv)) return rv;
}
@ -1927,9 +1929,9 @@ nsXULElement::GetScriptObject(nsIScriptContext* aContext, void** aScriptObject)
cssDecl->GetPropertyValue(behavior, value);
if (!value.IsEmpty()) {
// We have a binding that must be installed.
PRBool dummy;
PRBool dummy2;
xblService->LoadBindings(NS_STATIC_CAST(nsIStyledContent*, this), value, PR_FALSE,
getter_AddRefs(binding), &dummy);
getter_AddRefs(binding), &dummy2);
if (binding) {
binding->ExecuteAttachedHandler();
}
@ -2588,6 +2590,7 @@ nsXULElement::NormalizeAttributeString(const nsAReadableString& aStr,
count = mPrototype ? mPrototype->mNumAttributes : 0;
for (i = 0; i < count; i++) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]);
nsINodeInfo *ni = attr->mNodeInfo;
if (ni->QualifiedNameEquals(aStr)) {
aNodeInfo = ni;
@ -2833,10 +2836,11 @@ nsXULElement::GetAttribute(PRInt32 aNameSpaceID,
PRInt32 count = mPrototype->mNumAttributes;
for (PRInt32 i = 0; i < count; i++) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]);
nsINodeInfo *ni = attr->mNodeInfo;
if (ni->Equals(aName, aNameSpaceID)) {
ni->GetPrefixAtom(aPrefix);
aResult.Assign(attr->mValue);
attr->mValue.GetValue( aResult );
rv = aResult.Length() ? NS_CONTENT_ATTR_HAS_VALUE : NS_CONTENT_ATTR_NO_VALUE;
break;
}
@ -3029,6 +3033,7 @@ nsXULElement::GetAttributeNameAt(PRInt32 aIndex,
else if (mPrototype) {
if (aIndex >= 0 && aIndex < mPrototype->mNumAttributes) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[aIndex]);
attr->mNodeInfo->GetNamespaceID(aNameSpaceID);
attr->mNodeInfo->GetNameAtom(aName);
attr->mNodeInfo->GetPrefixAtom(aPrefix);
@ -3834,7 +3839,7 @@ nsXULElement::GetID(nsIAtom*& aResult) const
for (PRInt32 i = 0; i < count; i++) {
nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]);
if (attr->mNodeInfo->Equals(nsXULAtoms::id, kNameSpaceID_None)) {
aResult = NS_NewAtom(attr->mValue);
attr->mValue.GetValueAsAtom( &aResult );
break;
}
}
@ -4330,13 +4335,15 @@ nsXULElement::EnsureSlots()
for (PRInt32 i = 0; i < proto->mNumAttributes; ++i) {
nsXULPrototypeAttribute* protoattr = &(proto->mAttributes[i]);
nsAutoString valueStr;
protoattr->mValue.GetValue( valueStr );
// Create a CBufDescriptor to avoid copying the attribute's
// value just to set it.
nsXULAttribute* attr;
rv = nsXULAttribute::Create(NS_STATIC_CAST(nsIStyledContent*, this),
protoattr->mNodeInfo,
protoattr->mValue,
valueStr,
&attr);
if (NS_FAILED(rv)) return rv;
@ -4414,7 +4421,7 @@ nsXULPrototypeElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom* aName, nsAWri
{
for (PRInt32 i = 0; i < mNumAttributes; ++i) {
if (mAttributes[i].mNodeInfo->Equals(aName, aNameSpaceID)) {
aValue = mAttributes[i].mValue;
mAttributes[i].mValue.GetValue( aValue );
return aValue.Length() ? NS_CONTENT_ATTR_HAS_VALUE : NS_CONTENT_ATTR_NO_VALUE;
}

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

@ -61,6 +61,7 @@
#include "nsIBoxObject.h"
#include "nsXULAttributes.h"
#include "nsIChromeEventHandler.h"
#include "nsXULAttributeValue.h"
class nsISizeOfHandler;
@ -104,7 +105,7 @@ public:
~nsXULPrototypeAttribute();
nsCOMPtr<nsINodeInfo> mNodeInfo;
nsString mValue;
nsXULAttributeValue mValue;
void* mEventHandler;
#ifdef XUL_PROTOTYPE_ATTRIBUTE_METERING