Backing out fix to bug 162572 to see if it fixes btek pageload numbers

This commit is contained in:
jkeiser%netscape.com 2002-09-16 19:45:59 +00:00
Родитель b3fdb4c8db
Коммит ac086155e9
6 изменённых файлов: 452 добавлений и 944 удалений

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

@ -42,60 +42,94 @@
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
#include "nsCRT.h"
#include "nsMemory.h"
nsHTMLValue::nsHTMLValue(nsHTMLUnit aUnit)
: mUnit(aUnit), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(aUnit)
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_NOSTORE, "not a valueless unit");
if (GetUnitClass() != HTMLUNIT_NOSTORE) {
NS_ASSERTION((aUnit <= eHTMLUnit_Empty), "not a valueless unit");
if (aUnit > eHTMLUnit_Empty) {
mUnit = eHTMLUnit_Null;
}
mValue.mString = nsnull;
}
nsHTMLValue::nsHTMLValue(PRInt32 aValue, nsHTMLUnit aUnit)
: mUnit(aUnit), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(aUnit)
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_INTEGER ||
GetUnitClass() == HTMLUNIT_PIXEL, "unit not an integer unit");
if (GetUnitClass() == HTMLUNIT_INTEGER ||
GetUnitClass() == HTMLUNIT_PIXEL) {
NS_ASSERTION((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit) ||
(eHTMLUnit_Pixel == aUnit), "not an integer value");
if ((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit) ||
(eHTMLUnit_Pixel == aUnit)) {
mValue.mInt = aValue;
} else {
}
else {
mUnit = eHTMLUnit_Null;
mValue.mString = nsnull;
mValue.mInt = 0;
}
}
nsHTMLValue::nsHTMLValue(float aValue)
: mUnit(eHTMLUnit_Percent), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(eHTMLUnit_Percent)
{
mValue.mFloat = aValue;
}
nsHTMLValue::nsHTMLValue(const nsAString& aValue, nsHTMLUnit aUnit)
: mUnit(aUnit), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(aUnit)
{
SetStringValueInternal(aValue, aUnit);
NS_ASSERTION((eHTMLUnit_String == aUnit) ||
(eHTMLUnit_ColorName == aUnit), "not a string value");
if ((eHTMLUnit_String == aUnit) ||
(eHTMLUnit_ColorName == aUnit)) {
mValue.mString = ToNewUnicode(aValue);
}
else {
mUnit = eHTMLUnit_Null;
mValue.mInt = 0;
}
}
nsHTMLValue::nsHTMLValue(nsISupports* aValue)
: mUnit(eHTMLUnit_ISupports), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(eHTMLUnit_ISupports)
{
mValue.mISupports = aValue;
NS_IF_ADDREF(mValue.mISupports);
}
nsHTMLValue::nsHTMLValue(nscolor aValue)
: mUnit(eHTMLUnit_Color), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(eHTMLUnit_Color)
{
mValue.mColor = aValue;
}
nsHTMLValue::nsHTMLValue(const nsHTMLValue& aCopy)
: mUnit(aCopy.mUnit)
{
InitializeFrom(aCopy);
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != aCopy.mValue.mString) {
mValue.mString = nsCRT::strdup(aCopy.mValue.mString);
}
else {
mValue.mString = nsnull;
}
}
else if (eHTMLUnit_ISupports == mUnit) {
mValue.mISupports = aCopy.mValue.mISupports;
NS_IF_ADDREF(mValue.mISupports);
}
else if (eHTMLUnit_Color == mUnit){
mValue.mColor = aCopy.mValue.mColor;
}
else if (eHTMLUnit_Percent == mUnit) {
mValue.mFloat = aCopy.mValue.mFloat;
}
else {
mValue.mInt = aCopy.mValue.mInt;
}
}
nsHTMLValue::~nsHTMLValue(void)
@ -106,81 +140,79 @@ nsHTMLValue::~nsHTMLValue(void)
nsHTMLValue& nsHTMLValue::operator=(const nsHTMLValue& aCopy)
{
Reset();
InitializeFrom(aCopy);
mUnit = aCopy.mUnit;
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != aCopy.mValue.mString) {
mValue.mString = nsCRT::strdup(aCopy.mValue.mString);
}
}
else if (eHTMLUnit_ISupports == mUnit) {
mValue.mISupports = aCopy.mValue.mISupports;
NS_IF_ADDREF(mValue.mISupports);
}
else if (eHTMLUnit_Color == mUnit){
mValue.mColor = aCopy.mValue.mColor;
}
else if (eHTMLUnit_Percent == mUnit) {
mValue.mFloat = aCopy.mValue.mFloat;
}
else {
mValue.mInt = aCopy.mValue.mInt;
}
return *this;
}
PRBool nsHTMLValue::operator==(const nsHTMLValue& aOther) const
{
if (mUnit != aOther.mUnit) {
return PR_FALSE;
}
// Call GetUnit() so that we turn StringWithLength into String
PRUint32 unitClass = GetUnitClass();
switch (unitClass) {
case HTMLUNIT_NOSTORE:
return PR_TRUE;
case HTMLUNIT_STRING:
if (mValue.mString && aOther.mValue.mString) {
return GetDependentString().Equals(aOther.GetDependentString(),
nsCaseInsensitiveStringComparator());
if (mUnit == aOther.mUnit) {
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull == mValue.mString) {
if (nsnull == aOther.mValue.mString) {
return PR_TRUE;
}
}
else if (nsnull != aOther.mValue.mString) {
return nsDependentString(mValue.mString).Equals(nsDependentString(aOther.mValue.mString),
nsCaseInsensitiveStringComparator());
}
}
else if (eHTMLUnit_ISupports == mUnit) {
return PRBool(mValue.mISupports == aOther.mValue.mISupports);
}
else if (eHTMLUnit_Color == mUnit){
return PRBool(mValue.mColor == aOther.mValue.mColor);
}
else if (eHTMLUnit_Percent == mUnit) {
return PRBool(mValue.mFloat == aOther.mValue.mFloat);
}
else {
return PRBool(mValue.mInt == aOther.mValue.mInt);
}
// One of them is null. An == check will see if they are both null.
return mValue.mString == aOther.mValue.mString;
case HTMLUNIT_INTEGER:
case HTMLUNIT_PIXEL:
return mValue.mInt == aOther.mValue.mInt;
case HTMLUNIT_COLOR:
return mValue.mColor == aOther.mValue.mColor;
case HTMLUNIT_ISUPPORTS:
return mValue.mISupports == aOther.mValue.mISupports;
case HTMLUNIT_PERCENT:
return mValue.mFloat == aOther.mValue.mFloat;
default:
NS_WARNING("Unknown unit");
return PR_TRUE;
}
return PR_FALSE;
}
PRUint32 nsHTMLValue::HashValue(void) const
{
PRUint32 retval;
if (GetUnitClass() == HTMLUNIT_STRING) {
if (mStorageFlags & HTMLSTORAGE_STRWITHLEN) {
retval = mValue.mString ? nsCheapStringBufferUtils::HashCode(mValue.mString)
: 0;
} else {
retval = mValue.mString ? nsCRT::HashCode(mValue.mString) : 0;
}
} else {
retval = mValue.mInt;
}
return retval ^ PRUint32(mUnit);
return PRUint32(mUnit) ^
((((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) &&
(nsnull != mValue.mString)) ?
nsCRT::HashCode(mValue.mString) :
mValue.mInt);
}
void nsHTMLValue::Reset(void)
{
if (GetUnitClass() == HTMLUNIT_STRING) {
if (mValue.mString) {
if (mStorageFlags & HTMLSTORAGE_STRWITHLEN) {
nsCheapStringBufferUtils::Free(mValue.mString);
} else {
nsMemory::Free(mValue.mString);
}
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != mValue.mString) {
nsCRT::free(mValue.mString);
}
}
else if (mUnit == eHTMLUnit_ISupports) {
else if (eHTMLUnit_ISupports == mUnit) {
NS_IF_RELEASE(mValue.mISupports);
}
mUnit = eHTMLUnit_Null;
mStorageFlags = 0;
mValue.mString = nsnull;
}
@ -188,12 +220,14 @@ void nsHTMLValue::Reset(void)
void nsHTMLValue::SetIntValue(PRInt32 aValue, nsHTMLUnit aUnit)
{
Reset();
mUnit = aUnit;
NS_ASSERTION(GetUnitClass() == HTMLUNIT_INTEGER, "not an int value");
if (GetUnitClass() == HTMLUNIT_INTEGER) {
NS_ASSERTION((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit), "not an int value");
if ((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit)) {
mUnit = aUnit;
mValue.mInt = aValue;
} else {
mUnit = eHTMLUnit_Null;
}
}
@ -211,50 +245,14 @@ void nsHTMLValue::SetPercentValue(float aValue)
mValue.mFloat = aValue;
}
static inline PRBool
ShouldStoreLength(const nsAString& aStr, PRUint32 aLen)
{
// Always remember the length of the string if the length is greater than 30
if (aLen > 30) {
return PR_TRUE;
}
// Obviously never remember the length of the string if it is empty :)
if (aLen == 0) {
return PR_FALSE;
}
// Remember the length of the string if it has embedded nulls
nsAString::const_iterator begin, end;
return FindCharInReadable('\0', aStr.BeginReading(begin),
aStr.EndReading(end));
}
void nsHTMLValue::SetStringValueInternal(const nsAString& aValue,
nsHTMLUnit aUnit)
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING, "unit not a string unit!");
if (GetUnitClass() == HTMLUNIT_STRING) {
// Remember the length of the string if necessary
PRUint32 len = aValue.Length();
if (ShouldStoreLength(aValue, len)) {
mStorageFlags = HTMLSTORAGE_STRWITHLEN;
nsCheapStringBufferUtils::CopyToBuffer(mValue.mString, aValue, len);
return;
}
// Else just store as a normal string
mValue.mString = ToNewUnicode(aValue);
} else {
mUnit = eHTMLUnit_Null;
mValue.mString = nsnull;
}
}
void nsHTMLValue::SetStringValue(const nsAString& aValue,
nsHTMLUnit aUnit)
{
Reset();
mUnit = aUnit;
SetStringValueInternal(aValue, aUnit);
if ((eHTMLUnit_String == aUnit) || (eHTMLUnit_ColorName == aUnit)) {
mUnit = aUnit;
mValue.mString = ToNewUnicode(aValue);
}
}
void nsHTMLValue::SetISupportsValue(nsISupports* aValue)
@ -281,72 +279,64 @@ void nsHTMLValue::SetEmptyValue(void)
#ifdef DEBUG
void nsHTMLValue::AppendToString(nsAString& aBuffer) const
{
switch (GetUnitClass()) {
case HTMLUNIT_NOSTORE:
break;
case HTMLUNIT_STRING:
if (mValue.mString) {
aBuffer.Append(PRUnichar('"'));
aBuffer.Append(GetDependentString());
aBuffer.Append(PRUnichar('"'));
} else {
aBuffer.Append(NS_LITERAL_STRING("null str"));
}
break;
case HTMLUNIT_INTEGER:
case HTMLUNIT_PIXEL:
{
nsAutoString intStr;
intStr.AppendInt(mValue.mInt, 10);
intStr.Append(NS_LITERAL_STRING("[0x"));
intStr.AppendInt(mValue.mInt, 16);
intStr.Append(PRUnichar(']'));
aBuffer.Append(intStr);
}
break;
case HTMLUNIT_COLOR:
{
nsAutoString intStr;
intStr.Append(NS_LITERAL_STRING("(0x"));
intStr.AppendInt(NS_GET_R(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_G(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_B(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_A(mValue.mColor), 16);
intStr.Append(PRUnichar(')'));
aBuffer.Append(intStr);
}
break;
case HTMLUNIT_ISUPPORTS:
{
aBuffer.Append(NS_LITERAL_STRING("0x"));
nsAutoString intStr;
intStr.AppendInt(NS_PTR_TO_INT32(mValue.mISupports), 16);
aBuffer.Append(intStr);
}
break;
case HTMLUNIT_PERCENT:
{
nsAutoString floatStr;
floatStr.AppendFloat(mValue.mFloat * 100.0f);
aBuffer.Append(floatStr);
}
break;
default:
NS_ERROR("Unknown HTMLValue type!");
if (eHTMLUnit_Null == mUnit) {
return;
}
if (eHTMLUnit_Empty == mUnit) {
}
else if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != mValue.mString) {
aBuffer.Append(PRUnichar('"'));
aBuffer.Append(mValue.mString);
aBuffer.Append(PRUnichar('"'));
}
else {
aBuffer.Append(NS_LITERAL_STRING("null str"));
}
}
else if (eHTMLUnit_ISupports == mUnit) {
aBuffer.Append(NS_LITERAL_STRING("0x"));
nsAutoString intStr;
intStr.AppendInt(NS_PTR_TO_INT32(mValue.mISupports), 16);
aBuffer.Append(intStr);
}
else if (eHTMLUnit_Color == mUnit){
nsAutoString intStr;
intStr.Append(NS_LITERAL_STRING("(0x"));
intStr.AppendInt(NS_GET_R(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_G(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_B(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_A(mValue.mColor), 16);
intStr.Append(PRUnichar(')'));
aBuffer.Append(intStr);
}
else if (eHTMLUnit_Percent == mUnit) {
nsAutoString floatStr;
floatStr.AppendFloat(mValue.mFloat * 100.0f);
aBuffer.Append(floatStr);
}
else {
nsAutoString intStr;
intStr.AppendInt(mValue.mInt, 10);
intStr.Append(NS_LITERAL_STRING("[0x"));
intStr.AppendInt(mValue.mInt, 16);
intStr.Append(PRUnichar(']'));
aBuffer.Append(intStr);
}
//
// Append the type name for types that are ambiguous
//
switch (mUnit) {
case eHTMLUnit_Null: aBuffer.Append(NS_LITERAL_STRING("null")); break;
case eHTMLUnit_Empty: aBuffer.Append(NS_LITERAL_STRING("empty")); break;
case eHTMLUnit_Null: break;
case eHTMLUnit_Empty: break;
case eHTMLUnit_String: break;
case eHTMLUnit_ColorName: break;
case eHTMLUnit_ISupports: aBuffer.Append(NS_LITERAL_STRING("ptr")); break;
case eHTMLUnit_Integer: break;
case eHTMLUnit_Enumerated: aBuffer.Append(NS_LITERAL_STRING("enum")); break;
case eHTMLUnit_Proportional: aBuffer.Append(NS_LITERAL_STRING("*")); break;
case eHTMLUnit_Color: aBuffer.Append(NS_LITERAL_STRING("rbga")); break;
@ -356,49 +346,3 @@ void nsHTMLValue::AppendToString(nsAString& aBuffer) const
aBuffer.Append(PRUnichar(' '));
}
#endif // DEBUG
void
nsHTMLValue::InitializeFrom(const nsHTMLValue& aCopy)
{
mUnit = aCopy.mUnit;
mStorageFlags = aCopy.mStorageFlags;
switch (GetUnitClass()) {
case HTMLUNIT_NOSTORE:
mValue.mString = nsnull;
break;
case HTMLUNIT_STRING:
if (aCopy.mValue.mString) {
if (aCopy.mStorageFlags & HTMLSTORAGE_STRWITHLEN) {
// Clone the string = (PRUint32) + PRUnichar*len
nsCheapStringBufferUtils::Clone(mValue.mString, aCopy.mValue.mString);
} else {
mValue.mString = ToNewUnicode(nsDependentString(aCopy.mValue.mString));
}
} else {
mValue.mString = nsnull;
}
break;
case HTMLUNIT_INTEGER:
case HTMLUNIT_PIXEL:
mValue.mInt = aCopy.mValue.mInt;
break;
case HTMLUNIT_COLOR:
mValue.mColor = aCopy.mValue.mColor;
break;
case HTMLUNIT_ISUPPORTS:
mValue.mISupports = aCopy.mValue.mISupports;
NS_IF_ADDREF(mValue.mISupports);
break;
case HTMLUNIT_PERCENT:
mValue.mFloat = aCopy.mValue.mFloat;
break;
default:
NS_ERROR("Unknown HTMLValue type!");
}
}

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

@ -43,130 +43,20 @@
#include "nsString.h"
#include "nsISupports.h"
#include "nsReadableUtils.h"
#include "nsCRT.h"
class nsCheapStringBufferUtils {
public:
/**
* Get the string pointer
* @param aBuf the buffer
* @return a pointer to the string
*/
static const PRUnichar* StrPtr(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return (const PRUnichar*)( ((const char*)aBuf) + sizeof(PRUint32) );
}
static PRUnichar* StrPtr(PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return (PRUnichar*)( ((char*)aBuf) + sizeof(PRUint32) );
}
/**
* Get the string length
* @param aBuf the buffer
* @return the string length
*/
static PRUint32 Length(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return *((PRUint32*)aBuf);
}
/**
* Get a DependentString from a buffer
*
* @param aBuf the buffer to get string from
* @return a DependentString representing this string
*/
static nsDependentSingleFragmentSubstring GetDependentString(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
const PRUnichar* buf = StrPtr(aBuf);
return Substring(buf, buf + Length(aBuf));
}
/**
* Construct from an AString
* @param aBuf the buffer to copy to
* @param aStr the string to construct from
* @param aLen the length of the string (passed for efficiency)
*/
static void CopyToBuffer(PRUnichar*& aBuf, const nsAString& aStr, PRUint32 aLen) {
NS_ASSERTION(aStr.Length() == aLen, "Wrong length passed in!");
aBuf = (PRUnichar*)nsMemory::Alloc(sizeof(PRUint32) +
aLen * sizeof(PRUnichar));
*((PRUint32*)aBuf) = aLen;
CopyUnicodeTo(aStr, 0, StrPtr(aBuf), aLen);
}
/**
* Construct from another nsCheapStringBuffer
* @param aBuf the buffer to put into
* @param aSrc the buffer to construct from
*/
static void Clone(PRUnichar*& aBuf, const PRUnichar* aSrc) {
NS_ASSERTION(aSrc, "Cannot work on null buffer!");
aBuf = (PRUnichar*)nsMemory::Clone(aSrc, sizeof(PRUint32) +
Length(aSrc) * sizeof(PRUnichar));
}
/**
* Free the memory for the buf
* @param aBuf the buffer to free
*/
static void Free(PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
nsMemory::Free(aBuf);
}
/**
* Get a hashcode for the buffer
* @param aBuf the buffer
* @return the hashcode
*/
static PRUint32 HashCode(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return nsCRT::BufferHashCode((char*)StrPtr(aBuf),
Length(aBuf)*sizeof(PRUnichar));
}
};
//
// nsHTMLUnit is two bytes: the class of type, and a specifier to distinguish
// between different things stored as the same type. Doing
// mUnit & HTMLUNIT_CLASS_MASK should give you the class of type.
//
#define HTMLUNIT_NOSTORE 0x0000
#define HTMLUNIT_STRING 0x0100
#define HTMLUNIT_INTEGER 0x0200
#define HTMLUNIT_PIXEL 0x0400
#define HTMLUNIT_COLOR 0x0800
#define HTMLUNIT_ISUPPORTS 0x1000
#define HTMLUNIT_PERCENT 0x2000
#define HTMLUNIT_CLASS_MASK 0xff00
enum nsHTMLUnit {
// null, value is not specified: 0x0000
eHTMLUnit_Null = HTMLUNIT_NOSTORE,
// empty, value is not specified: 0x0001
eHTMLUnit_Empty = HTMLUNIT_NOSTORE | 1,
eHTMLUnit_Null = 0, // (n/a) null unit, value is not specified
eHTMLUnit_Empty = 1, // (n/a) empty unit, value is not specified
eHTMLUnit_String = 10, // (nsString) a string value
eHTMLUnit_ISupports = 20, // (nsISupports*) a ref counted interface
eHTMLUnit_Integer = 50, // (int) simple value
eHTMLUnit_Enumerated = 51, // (int) value has enumerated meaning
eHTMLUnit_Proportional = 52, // (int) value is a relative proportion of some whole
eHTMLUnit_Color = 80, // (color) an RGBA value
eHTMLUnit_ColorName = 81, // (nsString/color) a color name value
eHTMLUnit_Percent = 90, // (float) 1.0 == 100%) value is percentage of something
// a string value
eHTMLUnit_String = HTMLUNIT_STRING,
// a color name value
eHTMLUnit_ColorName = HTMLUNIT_STRING | 1,
// a simple int value
eHTMLUnit_Integer = HTMLUNIT_INTEGER,
// value has enumerated meaning
eHTMLUnit_Enumerated = HTMLUNIT_INTEGER | 1,
// value is a relative proportion of some whole
eHTMLUnit_Proportional = HTMLUNIT_INTEGER | 2,
// screen pixels (screen relative measure)
eHTMLUnit_Pixel = HTMLUNIT_PIXEL,
// an RGBA value
eHTMLUnit_Color = HTMLUNIT_COLOR,
// (nsISupports*) a ref counted interface
eHTMLUnit_ISupports = HTMLUNIT_ISUPPORTS,
// (1.0 == 100%) value is percentage of something
eHTMLUnit_Percent = HTMLUNIT_PERCENT
// Screen relative measure
eHTMLUnit_Pixel = 600 // (int) screen pixels
};
/**
@ -191,22 +81,14 @@ public:
PRBool operator!=(const nsHTMLValue& aOther) const;
PRUint32 HashValue(void) const;
/**
* Get the unit of this HTMLValue
* @return the unit of this HTMLValue
*/
nsHTMLUnit GetUnit(void) const { return (nsHTMLUnit)mUnit; }
PRInt32 GetIntValue(void) const;
PRInt32 GetPixelValue(void) const;
float GetPercentValue(void) const;
nsHTMLUnit GetUnit(void) const { return mUnit; }
PRInt32 GetIntValue(void) const;
PRInt32 GetPixelValue(void) const;
float GetPercentValue(void) const;
nsAString& GetStringValue(nsAString& aBuffer) const;
nsISupports* GetISupportsValue(void) const;
nscolor GetColorValue(void) const;
nsISupports* GetISupportsValue(void) const;
nscolor GetColorValue(void) const;
/**
* Reset the string to null type, freeing things in the process if necessary.
*/
void Reset(void);
void SetIntValue(PRInt32 aValue, nsHTMLUnit aUnit);
void SetPixelValue(PRInt32 aValue);
@ -221,98 +103,34 @@ public:
#endif
protected:
/**
* The unit of the value
* @see nsHTMLUnit
*/
PRUint16 mUnit;
/** Flags indicating specifics of the storage format (HTMLSTORAGE_*) */
PRUint16 mStorageFlags;
/**
* The actual value. Please to not be adding more-than-4-byte things to this
* union.
*/
nsHTMLUnit mUnit;
union {
/** Int. */
PRInt32 mInt;
/** Float. */
float mFloat;
/**
* String. Depending on mStorageFlags & HTMLSTORAGE_STRWITHLEN, this may be
* stored with the first 4 bytes being the length (this is done for
* embedded nulls and long strings).
*/
PRUnichar* mString;
/** ISupports. Strong reference. */
nsISupports* mISupports;
/** Color. */
nscolor mColor;
} mValue;
private:
/**
* Copy into this HTMLValue from aCopy. Please be aware that if this is an
* existing HTMLValue and you do not call Reset(), this will leak.
* @param aCopy the value to copy
*/
void InitializeFrom(const nsHTMLValue& aCopy);
/**
* Helper to set string value (checks for embedded nulls or length); verifies
* that aUnit is a string type as well.
* @param aValue the value to set
* @param aUnit the unit to set
*/
void SetStringValueInternal(const nsAString& aValue, nsHTMLUnit aUnit);
/**
* Get a DependentString from mValue.mString (if the string is stored with
* length, passes that information to the DependentString). Do not call this
* if mValue.mString is null.
*
* @return a DependentString representing this string
*/
nsDependentSingleFragmentSubstring GetDependentString() const;
/**
* Get the unit class (HTMLUNIT_*)
* @return the unit class
*/
PRUint32 GetUnitClass() const { return mUnit & HTMLUNIT_CLASS_MASK; }
} mValue;
};
/** Indicates that a string is stored as an nsCheapStringBuffer */
#define HTMLSTORAGE_NORMAL 0
#define HTMLSTORAGE_STRWITHLEN 1
inline nsDependentSingleFragmentSubstring nsHTMLValue::GetDependentString() const
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING,
"Some dork called GetDependentString() on a non-string!");
NS_ASSERTION(mValue.mString, "buffer is null! This is bad.");
// If it is stored in string-with-length format, use the length properly
return (mStorageFlags & HTMLSTORAGE_STRWITHLEN) ?
nsCheapStringBufferUtils::GetDependentString(mValue.mString) :
Substring(mValue.mString,
mValue.mString
+ nsCharTraits<PRUnichar>::length(mValue.mString));
}
inline PRInt32 nsHTMLValue::GetIntValue(void) const
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING ||
GetUnitClass() == HTMLUNIT_INTEGER,
"not an int value");
PRUint32 unitClass = GetUnitClass();
if (unitClass == HTMLUNIT_INTEGER) {
NS_ASSERTION((mUnit == eHTMLUnit_String) ||
(mUnit == eHTMLUnit_Integer) ||
(mUnit == eHTMLUnit_Enumerated) ||
(mUnit == eHTMLUnit_Proportional), "not an int value");
if ((mUnit == eHTMLUnit_Integer) ||
(mUnit == eHTMLUnit_Enumerated) ||
(mUnit == eHTMLUnit_Proportional)) {
return mValue.mInt;
}
if (unitClass == HTMLUNIT_STRING) {
else if (mUnit == eHTMLUnit_String) {
if (mValue.mString) {
PRInt32 err=0;
// XXX this copies. new string APIs will make this better, right?
nsAutoString str(GetDependentString());
nsAutoString str(mValue.mString); // XXX copy. new string APIs will make this better, right?
return str.ToInteger(&err);
}
}
return 0;
}
@ -336,12 +154,12 @@ inline float nsHTMLValue::GetPercentValue(void) const
inline nsAString& nsHTMLValue::GetStringValue(nsAString& aBuffer) const
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING || mUnit == eHTMLUnit_Null,
"not a string value");
if (GetUnitClass() == HTMLUNIT_STRING && mValue.mString) {
aBuffer = GetDependentString();
} else {
aBuffer.Truncate();
NS_ASSERTION((mUnit == eHTMLUnit_String) || (mUnit == eHTMLUnit_ColorName) ||
(mUnit == eHTMLUnit_Null), "not a string value");
aBuffer.SetLength(0);
if (((mUnit == eHTMLUnit_String) || (mUnit == eHTMLUnit_ColorName)) &&
(nsnull != mValue.mString)) {
aBuffer.Append(mValue.mString);
}
return aBuffer;
}

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

@ -43,130 +43,20 @@
#include "nsString.h"
#include "nsISupports.h"
#include "nsReadableUtils.h"
#include "nsCRT.h"
class nsCheapStringBufferUtils {
public:
/**
* Get the string pointer
* @param aBuf the buffer
* @return a pointer to the string
*/
static const PRUnichar* StrPtr(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return (const PRUnichar*)( ((const char*)aBuf) + sizeof(PRUint32) );
}
static PRUnichar* StrPtr(PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return (PRUnichar*)( ((char*)aBuf) + sizeof(PRUint32) );
}
/**
* Get the string length
* @param aBuf the buffer
* @return the string length
*/
static PRUint32 Length(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return *((PRUint32*)aBuf);
}
/**
* Get a DependentString from a buffer
*
* @param aBuf the buffer to get string from
* @return a DependentString representing this string
*/
static nsDependentSingleFragmentSubstring GetDependentString(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
const PRUnichar* buf = StrPtr(aBuf);
return Substring(buf, buf + Length(aBuf));
}
/**
* Construct from an AString
* @param aBuf the buffer to copy to
* @param aStr the string to construct from
* @param aLen the length of the string (passed for efficiency)
*/
static void CopyToBuffer(PRUnichar*& aBuf, const nsAString& aStr, PRUint32 aLen) {
NS_ASSERTION(aStr.Length() == aLen, "Wrong length passed in!");
aBuf = (PRUnichar*)nsMemory::Alloc(sizeof(PRUint32) +
aLen * sizeof(PRUnichar));
*((PRUint32*)aBuf) = aLen;
CopyUnicodeTo(aStr, 0, StrPtr(aBuf), aLen);
}
/**
* Construct from another nsCheapStringBuffer
* @param aBuf the buffer to put into
* @param aSrc the buffer to construct from
*/
static void Clone(PRUnichar*& aBuf, const PRUnichar* aSrc) {
NS_ASSERTION(aSrc, "Cannot work on null buffer!");
aBuf = (PRUnichar*)nsMemory::Clone(aSrc, sizeof(PRUint32) +
Length(aSrc) * sizeof(PRUnichar));
}
/**
* Free the memory for the buf
* @param aBuf the buffer to free
*/
static void Free(PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
nsMemory::Free(aBuf);
}
/**
* Get a hashcode for the buffer
* @param aBuf the buffer
* @return the hashcode
*/
static PRUint32 HashCode(const PRUnichar* aBuf) {
NS_ASSERTION(aBuf, "Cannot work on null buffer!");
return nsCRT::BufferHashCode((char*)StrPtr(aBuf),
Length(aBuf)*sizeof(PRUnichar));
}
};
//
// nsHTMLUnit is two bytes: the class of type, and a specifier to distinguish
// between different things stored as the same type. Doing
// mUnit & HTMLUNIT_CLASS_MASK should give you the class of type.
//
#define HTMLUNIT_NOSTORE 0x0000
#define HTMLUNIT_STRING 0x0100
#define HTMLUNIT_INTEGER 0x0200
#define HTMLUNIT_PIXEL 0x0400
#define HTMLUNIT_COLOR 0x0800
#define HTMLUNIT_ISUPPORTS 0x1000
#define HTMLUNIT_PERCENT 0x2000
#define HTMLUNIT_CLASS_MASK 0xff00
enum nsHTMLUnit {
// null, value is not specified: 0x0000
eHTMLUnit_Null = HTMLUNIT_NOSTORE,
// empty, value is not specified: 0x0001
eHTMLUnit_Empty = HTMLUNIT_NOSTORE | 1,
eHTMLUnit_Null = 0, // (n/a) null unit, value is not specified
eHTMLUnit_Empty = 1, // (n/a) empty unit, value is not specified
eHTMLUnit_String = 10, // (nsString) a string value
eHTMLUnit_ISupports = 20, // (nsISupports*) a ref counted interface
eHTMLUnit_Integer = 50, // (int) simple value
eHTMLUnit_Enumerated = 51, // (int) value has enumerated meaning
eHTMLUnit_Proportional = 52, // (int) value is a relative proportion of some whole
eHTMLUnit_Color = 80, // (color) an RGBA value
eHTMLUnit_ColorName = 81, // (nsString/color) a color name value
eHTMLUnit_Percent = 90, // (float) 1.0 == 100%) value is percentage of something
// a string value
eHTMLUnit_String = HTMLUNIT_STRING,
// a color name value
eHTMLUnit_ColorName = HTMLUNIT_STRING | 1,
// a simple int value
eHTMLUnit_Integer = HTMLUNIT_INTEGER,
// value has enumerated meaning
eHTMLUnit_Enumerated = HTMLUNIT_INTEGER | 1,
// value is a relative proportion of some whole
eHTMLUnit_Proportional = HTMLUNIT_INTEGER | 2,
// screen pixels (screen relative measure)
eHTMLUnit_Pixel = HTMLUNIT_PIXEL,
// an RGBA value
eHTMLUnit_Color = HTMLUNIT_COLOR,
// (nsISupports*) a ref counted interface
eHTMLUnit_ISupports = HTMLUNIT_ISUPPORTS,
// (1.0 == 100%) value is percentage of something
eHTMLUnit_Percent = HTMLUNIT_PERCENT
// Screen relative measure
eHTMLUnit_Pixel = 600 // (int) screen pixels
};
/**
@ -191,22 +81,14 @@ public:
PRBool operator!=(const nsHTMLValue& aOther) const;
PRUint32 HashValue(void) const;
/**
* Get the unit of this HTMLValue
* @return the unit of this HTMLValue
*/
nsHTMLUnit GetUnit(void) const { return (nsHTMLUnit)mUnit; }
PRInt32 GetIntValue(void) const;
PRInt32 GetPixelValue(void) const;
float GetPercentValue(void) const;
nsHTMLUnit GetUnit(void) const { return mUnit; }
PRInt32 GetIntValue(void) const;
PRInt32 GetPixelValue(void) const;
float GetPercentValue(void) const;
nsAString& GetStringValue(nsAString& aBuffer) const;
nsISupports* GetISupportsValue(void) const;
nscolor GetColorValue(void) const;
nsISupports* GetISupportsValue(void) const;
nscolor GetColorValue(void) const;
/**
* Reset the string to null type, freeing things in the process if necessary.
*/
void Reset(void);
void SetIntValue(PRInt32 aValue, nsHTMLUnit aUnit);
void SetPixelValue(PRInt32 aValue);
@ -221,98 +103,34 @@ public:
#endif
protected:
/**
* The unit of the value
* @see nsHTMLUnit
*/
PRUint16 mUnit;
/** Flags indicating specifics of the storage format (HTMLSTORAGE_*) */
PRUint16 mStorageFlags;
/**
* The actual value. Please to not be adding more-than-4-byte things to this
* union.
*/
nsHTMLUnit mUnit;
union {
/** Int. */
PRInt32 mInt;
/** Float. */
float mFloat;
/**
* String. Depending on mStorageFlags & HTMLSTORAGE_STRWITHLEN, this may be
* stored with the first 4 bytes being the length (this is done for
* embedded nulls and long strings).
*/
PRUnichar* mString;
/** ISupports. Strong reference. */
nsISupports* mISupports;
/** Color. */
nscolor mColor;
} mValue;
private:
/**
* Copy into this HTMLValue from aCopy. Please be aware that if this is an
* existing HTMLValue and you do not call Reset(), this will leak.
* @param aCopy the value to copy
*/
void InitializeFrom(const nsHTMLValue& aCopy);
/**
* Helper to set string value (checks for embedded nulls or length); verifies
* that aUnit is a string type as well.
* @param aValue the value to set
* @param aUnit the unit to set
*/
void SetStringValueInternal(const nsAString& aValue, nsHTMLUnit aUnit);
/**
* Get a DependentString from mValue.mString (if the string is stored with
* length, passes that information to the DependentString). Do not call this
* if mValue.mString is null.
*
* @return a DependentString representing this string
*/
nsDependentSingleFragmentSubstring GetDependentString() const;
/**
* Get the unit class (HTMLUNIT_*)
* @return the unit class
*/
PRUint32 GetUnitClass() const { return mUnit & HTMLUNIT_CLASS_MASK; }
} mValue;
};
/** Indicates that a string is stored as an nsCheapStringBuffer */
#define HTMLSTORAGE_NORMAL 0
#define HTMLSTORAGE_STRWITHLEN 1
inline nsDependentSingleFragmentSubstring nsHTMLValue::GetDependentString() const
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING,
"Some dork called GetDependentString() on a non-string!");
NS_ASSERTION(mValue.mString, "buffer is null! This is bad.");
// If it is stored in string-with-length format, use the length properly
return (mStorageFlags & HTMLSTORAGE_STRWITHLEN) ?
nsCheapStringBufferUtils::GetDependentString(mValue.mString) :
Substring(mValue.mString,
mValue.mString
+ nsCharTraits<PRUnichar>::length(mValue.mString));
}
inline PRInt32 nsHTMLValue::GetIntValue(void) const
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING ||
GetUnitClass() == HTMLUNIT_INTEGER,
"not an int value");
PRUint32 unitClass = GetUnitClass();
if (unitClass == HTMLUNIT_INTEGER) {
NS_ASSERTION((mUnit == eHTMLUnit_String) ||
(mUnit == eHTMLUnit_Integer) ||
(mUnit == eHTMLUnit_Enumerated) ||
(mUnit == eHTMLUnit_Proportional), "not an int value");
if ((mUnit == eHTMLUnit_Integer) ||
(mUnit == eHTMLUnit_Enumerated) ||
(mUnit == eHTMLUnit_Proportional)) {
return mValue.mInt;
}
if (unitClass == HTMLUNIT_STRING) {
else if (mUnit == eHTMLUnit_String) {
if (mValue.mString) {
PRInt32 err=0;
// XXX this copies. new string APIs will make this better, right?
nsAutoString str(GetDependentString());
nsAutoString str(mValue.mString); // XXX copy. new string APIs will make this better, right?
return str.ToInteger(&err);
}
}
return 0;
}
@ -336,12 +154,12 @@ inline float nsHTMLValue::GetPercentValue(void) const
inline nsAString& nsHTMLValue::GetStringValue(nsAString& aBuffer) const
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING || mUnit == eHTMLUnit_Null,
"not a string value");
if (GetUnitClass() == HTMLUNIT_STRING && mValue.mString) {
aBuffer = GetDependentString();
} else {
aBuffer.Truncate();
NS_ASSERTION((mUnit == eHTMLUnit_String) || (mUnit == eHTMLUnit_ColorName) ||
(mUnit == eHTMLUnit_Null), "not a string value");
aBuffer.SetLength(0);
if (((mUnit == eHTMLUnit_String) || (mUnit == eHTMLUnit_ColorName)) &&
(nsnull != mValue.mString)) {
aBuffer.Append(mValue.mString);
}
return aBuffer;
}

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

@ -42,60 +42,94 @@
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
#include "nsCRT.h"
#include "nsMemory.h"
nsHTMLValue::nsHTMLValue(nsHTMLUnit aUnit)
: mUnit(aUnit), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(aUnit)
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_NOSTORE, "not a valueless unit");
if (GetUnitClass() != HTMLUNIT_NOSTORE) {
NS_ASSERTION((aUnit <= eHTMLUnit_Empty), "not a valueless unit");
if (aUnit > eHTMLUnit_Empty) {
mUnit = eHTMLUnit_Null;
}
mValue.mString = nsnull;
}
nsHTMLValue::nsHTMLValue(PRInt32 aValue, nsHTMLUnit aUnit)
: mUnit(aUnit), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(aUnit)
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_INTEGER ||
GetUnitClass() == HTMLUNIT_PIXEL, "unit not an integer unit");
if (GetUnitClass() == HTMLUNIT_INTEGER ||
GetUnitClass() == HTMLUNIT_PIXEL) {
NS_ASSERTION((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit) ||
(eHTMLUnit_Pixel == aUnit), "not an integer value");
if ((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit) ||
(eHTMLUnit_Pixel == aUnit)) {
mValue.mInt = aValue;
} else {
}
else {
mUnit = eHTMLUnit_Null;
mValue.mString = nsnull;
mValue.mInt = 0;
}
}
nsHTMLValue::nsHTMLValue(float aValue)
: mUnit(eHTMLUnit_Percent), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(eHTMLUnit_Percent)
{
mValue.mFloat = aValue;
}
nsHTMLValue::nsHTMLValue(const nsAString& aValue, nsHTMLUnit aUnit)
: mUnit(aUnit), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(aUnit)
{
SetStringValueInternal(aValue, aUnit);
NS_ASSERTION((eHTMLUnit_String == aUnit) ||
(eHTMLUnit_ColorName == aUnit), "not a string value");
if ((eHTMLUnit_String == aUnit) ||
(eHTMLUnit_ColorName == aUnit)) {
mValue.mString = ToNewUnicode(aValue);
}
else {
mUnit = eHTMLUnit_Null;
mValue.mInt = 0;
}
}
nsHTMLValue::nsHTMLValue(nsISupports* aValue)
: mUnit(eHTMLUnit_ISupports), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(eHTMLUnit_ISupports)
{
mValue.mISupports = aValue;
NS_IF_ADDREF(mValue.mISupports);
}
nsHTMLValue::nsHTMLValue(nscolor aValue)
: mUnit(eHTMLUnit_Color), mStorageFlags(HTMLSTORAGE_NORMAL)
: mUnit(eHTMLUnit_Color)
{
mValue.mColor = aValue;
}
nsHTMLValue::nsHTMLValue(const nsHTMLValue& aCopy)
: mUnit(aCopy.mUnit)
{
InitializeFrom(aCopy);
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != aCopy.mValue.mString) {
mValue.mString = nsCRT::strdup(aCopy.mValue.mString);
}
else {
mValue.mString = nsnull;
}
}
else if (eHTMLUnit_ISupports == mUnit) {
mValue.mISupports = aCopy.mValue.mISupports;
NS_IF_ADDREF(mValue.mISupports);
}
else if (eHTMLUnit_Color == mUnit){
mValue.mColor = aCopy.mValue.mColor;
}
else if (eHTMLUnit_Percent == mUnit) {
mValue.mFloat = aCopy.mValue.mFloat;
}
else {
mValue.mInt = aCopy.mValue.mInt;
}
}
nsHTMLValue::~nsHTMLValue(void)
@ -106,81 +140,79 @@ nsHTMLValue::~nsHTMLValue(void)
nsHTMLValue& nsHTMLValue::operator=(const nsHTMLValue& aCopy)
{
Reset();
InitializeFrom(aCopy);
mUnit = aCopy.mUnit;
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != aCopy.mValue.mString) {
mValue.mString = nsCRT::strdup(aCopy.mValue.mString);
}
}
else if (eHTMLUnit_ISupports == mUnit) {
mValue.mISupports = aCopy.mValue.mISupports;
NS_IF_ADDREF(mValue.mISupports);
}
else if (eHTMLUnit_Color == mUnit){
mValue.mColor = aCopy.mValue.mColor;
}
else if (eHTMLUnit_Percent == mUnit) {
mValue.mFloat = aCopy.mValue.mFloat;
}
else {
mValue.mInt = aCopy.mValue.mInt;
}
return *this;
}
PRBool nsHTMLValue::operator==(const nsHTMLValue& aOther) const
{
if (mUnit != aOther.mUnit) {
return PR_FALSE;
}
// Call GetUnit() so that we turn StringWithLength into String
PRUint32 unitClass = GetUnitClass();
switch (unitClass) {
case HTMLUNIT_NOSTORE:
return PR_TRUE;
case HTMLUNIT_STRING:
if (mValue.mString && aOther.mValue.mString) {
return GetDependentString().Equals(aOther.GetDependentString(),
nsCaseInsensitiveStringComparator());
if (mUnit == aOther.mUnit) {
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull == mValue.mString) {
if (nsnull == aOther.mValue.mString) {
return PR_TRUE;
}
}
else if (nsnull != aOther.mValue.mString) {
return nsDependentString(mValue.mString).Equals(nsDependentString(aOther.mValue.mString),
nsCaseInsensitiveStringComparator());
}
}
else if (eHTMLUnit_ISupports == mUnit) {
return PRBool(mValue.mISupports == aOther.mValue.mISupports);
}
else if (eHTMLUnit_Color == mUnit){
return PRBool(mValue.mColor == aOther.mValue.mColor);
}
else if (eHTMLUnit_Percent == mUnit) {
return PRBool(mValue.mFloat == aOther.mValue.mFloat);
}
else {
return PRBool(mValue.mInt == aOther.mValue.mInt);
}
// One of them is null. An == check will see if they are both null.
return mValue.mString == aOther.mValue.mString;
case HTMLUNIT_INTEGER:
case HTMLUNIT_PIXEL:
return mValue.mInt == aOther.mValue.mInt;
case HTMLUNIT_COLOR:
return mValue.mColor == aOther.mValue.mColor;
case HTMLUNIT_ISUPPORTS:
return mValue.mISupports == aOther.mValue.mISupports;
case HTMLUNIT_PERCENT:
return mValue.mFloat == aOther.mValue.mFloat;
default:
NS_WARNING("Unknown unit");
return PR_TRUE;
}
return PR_FALSE;
}
PRUint32 nsHTMLValue::HashValue(void) const
{
PRUint32 retval;
if (GetUnitClass() == HTMLUNIT_STRING) {
if (mStorageFlags & HTMLSTORAGE_STRWITHLEN) {
retval = mValue.mString ? nsCheapStringBufferUtils::HashCode(mValue.mString)
: 0;
} else {
retval = mValue.mString ? nsCRT::HashCode(mValue.mString) : 0;
}
} else {
retval = mValue.mInt;
}
return retval ^ PRUint32(mUnit);
return PRUint32(mUnit) ^
((((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) &&
(nsnull != mValue.mString)) ?
nsCRT::HashCode(mValue.mString) :
mValue.mInt);
}
void nsHTMLValue::Reset(void)
{
if (GetUnitClass() == HTMLUNIT_STRING) {
if (mValue.mString) {
if (mStorageFlags & HTMLSTORAGE_STRWITHLEN) {
nsCheapStringBufferUtils::Free(mValue.mString);
} else {
nsMemory::Free(mValue.mString);
}
if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != mValue.mString) {
nsCRT::free(mValue.mString);
}
}
else if (mUnit == eHTMLUnit_ISupports) {
else if (eHTMLUnit_ISupports == mUnit) {
NS_IF_RELEASE(mValue.mISupports);
}
mUnit = eHTMLUnit_Null;
mStorageFlags = 0;
mValue.mString = nsnull;
}
@ -188,12 +220,14 @@ void nsHTMLValue::Reset(void)
void nsHTMLValue::SetIntValue(PRInt32 aValue, nsHTMLUnit aUnit)
{
Reset();
mUnit = aUnit;
NS_ASSERTION(GetUnitClass() == HTMLUNIT_INTEGER, "not an int value");
if (GetUnitClass() == HTMLUNIT_INTEGER) {
NS_ASSERTION((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit), "not an int value");
if ((eHTMLUnit_Integer == aUnit) ||
(eHTMLUnit_Enumerated == aUnit) ||
(eHTMLUnit_Proportional == aUnit)) {
mUnit = aUnit;
mValue.mInt = aValue;
} else {
mUnit = eHTMLUnit_Null;
}
}
@ -211,50 +245,14 @@ void nsHTMLValue::SetPercentValue(float aValue)
mValue.mFloat = aValue;
}
static inline PRBool
ShouldStoreLength(const nsAString& aStr, PRUint32 aLen)
{
// Always remember the length of the string if the length is greater than 30
if (aLen > 30) {
return PR_TRUE;
}
// Obviously never remember the length of the string if it is empty :)
if (aLen == 0) {
return PR_FALSE;
}
// Remember the length of the string if it has embedded nulls
nsAString::const_iterator begin, end;
return FindCharInReadable('\0', aStr.BeginReading(begin),
aStr.EndReading(end));
}
void nsHTMLValue::SetStringValueInternal(const nsAString& aValue,
nsHTMLUnit aUnit)
{
NS_ASSERTION(GetUnitClass() == HTMLUNIT_STRING, "unit not a string unit!");
if (GetUnitClass() == HTMLUNIT_STRING) {
// Remember the length of the string if necessary
PRUint32 len = aValue.Length();
if (ShouldStoreLength(aValue, len)) {
mStorageFlags = HTMLSTORAGE_STRWITHLEN;
nsCheapStringBufferUtils::CopyToBuffer(mValue.mString, aValue, len);
return;
}
// Else just store as a normal string
mValue.mString = ToNewUnicode(aValue);
} else {
mUnit = eHTMLUnit_Null;
mValue.mString = nsnull;
}
}
void nsHTMLValue::SetStringValue(const nsAString& aValue,
nsHTMLUnit aUnit)
{
Reset();
mUnit = aUnit;
SetStringValueInternal(aValue, aUnit);
if ((eHTMLUnit_String == aUnit) || (eHTMLUnit_ColorName == aUnit)) {
mUnit = aUnit;
mValue.mString = ToNewUnicode(aValue);
}
}
void nsHTMLValue::SetISupportsValue(nsISupports* aValue)
@ -281,72 +279,64 @@ void nsHTMLValue::SetEmptyValue(void)
#ifdef DEBUG
void nsHTMLValue::AppendToString(nsAString& aBuffer) const
{
switch (GetUnitClass()) {
case HTMLUNIT_NOSTORE:
break;
case HTMLUNIT_STRING:
if (mValue.mString) {
aBuffer.Append(PRUnichar('"'));
aBuffer.Append(GetDependentString());
aBuffer.Append(PRUnichar('"'));
} else {
aBuffer.Append(NS_LITERAL_STRING("null str"));
}
break;
case HTMLUNIT_INTEGER:
case HTMLUNIT_PIXEL:
{
nsAutoString intStr;
intStr.AppendInt(mValue.mInt, 10);
intStr.Append(NS_LITERAL_STRING("[0x"));
intStr.AppendInt(mValue.mInt, 16);
intStr.Append(PRUnichar(']'));
aBuffer.Append(intStr);
}
break;
case HTMLUNIT_COLOR:
{
nsAutoString intStr;
intStr.Append(NS_LITERAL_STRING("(0x"));
intStr.AppendInt(NS_GET_R(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_G(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_B(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_A(mValue.mColor), 16);
intStr.Append(PRUnichar(')'));
aBuffer.Append(intStr);
}
break;
case HTMLUNIT_ISUPPORTS:
{
aBuffer.Append(NS_LITERAL_STRING("0x"));
nsAutoString intStr;
intStr.AppendInt(NS_PTR_TO_INT32(mValue.mISupports), 16);
aBuffer.Append(intStr);
}
break;
case HTMLUNIT_PERCENT:
{
nsAutoString floatStr;
floatStr.AppendFloat(mValue.mFloat * 100.0f);
aBuffer.Append(floatStr);
}
break;
default:
NS_ERROR("Unknown HTMLValue type!");
if (eHTMLUnit_Null == mUnit) {
return;
}
if (eHTMLUnit_Empty == mUnit) {
}
else if ((eHTMLUnit_String == mUnit) || (eHTMLUnit_ColorName == mUnit)) {
if (nsnull != mValue.mString) {
aBuffer.Append(PRUnichar('"'));
aBuffer.Append(mValue.mString);
aBuffer.Append(PRUnichar('"'));
}
else {
aBuffer.Append(NS_LITERAL_STRING("null str"));
}
}
else if (eHTMLUnit_ISupports == mUnit) {
aBuffer.Append(NS_LITERAL_STRING("0x"));
nsAutoString intStr;
intStr.AppendInt(NS_PTR_TO_INT32(mValue.mISupports), 16);
aBuffer.Append(intStr);
}
else if (eHTMLUnit_Color == mUnit){
nsAutoString intStr;
intStr.Append(NS_LITERAL_STRING("(0x"));
intStr.AppendInt(NS_GET_R(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_G(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_B(mValue.mColor), 16);
intStr.Append(NS_LITERAL_STRING(" 0x"));
intStr.AppendInt(NS_GET_A(mValue.mColor), 16);
intStr.Append(PRUnichar(')'));
aBuffer.Append(intStr);
}
else if (eHTMLUnit_Percent == mUnit) {
nsAutoString floatStr;
floatStr.AppendFloat(mValue.mFloat * 100.0f);
aBuffer.Append(floatStr);
}
else {
nsAutoString intStr;
intStr.AppendInt(mValue.mInt, 10);
intStr.Append(NS_LITERAL_STRING("[0x"));
intStr.AppendInt(mValue.mInt, 16);
intStr.Append(PRUnichar(']'));
aBuffer.Append(intStr);
}
//
// Append the type name for types that are ambiguous
//
switch (mUnit) {
case eHTMLUnit_Null: aBuffer.Append(NS_LITERAL_STRING("null")); break;
case eHTMLUnit_Empty: aBuffer.Append(NS_LITERAL_STRING("empty")); break;
case eHTMLUnit_Null: break;
case eHTMLUnit_Empty: break;
case eHTMLUnit_String: break;
case eHTMLUnit_ColorName: break;
case eHTMLUnit_ISupports: aBuffer.Append(NS_LITERAL_STRING("ptr")); break;
case eHTMLUnit_Integer: break;
case eHTMLUnit_Enumerated: aBuffer.Append(NS_LITERAL_STRING("enum")); break;
case eHTMLUnit_Proportional: aBuffer.Append(NS_LITERAL_STRING("*")); break;
case eHTMLUnit_Color: aBuffer.Append(NS_LITERAL_STRING("rbga")); break;
@ -356,49 +346,3 @@ void nsHTMLValue::AppendToString(nsAString& aBuffer) const
aBuffer.Append(PRUnichar(' '));
}
#endif // DEBUG
void
nsHTMLValue::InitializeFrom(const nsHTMLValue& aCopy)
{
mUnit = aCopy.mUnit;
mStorageFlags = aCopy.mStorageFlags;
switch (GetUnitClass()) {
case HTMLUNIT_NOSTORE:
mValue.mString = nsnull;
break;
case HTMLUNIT_STRING:
if (aCopy.mValue.mString) {
if (aCopy.mStorageFlags & HTMLSTORAGE_STRWITHLEN) {
// Clone the string = (PRUint32) + PRUnichar*len
nsCheapStringBufferUtils::Clone(mValue.mString, aCopy.mValue.mString);
} else {
mValue.mString = ToNewUnicode(nsDependentString(aCopy.mValue.mString));
}
} else {
mValue.mString = nsnull;
}
break;
case HTMLUNIT_INTEGER:
case HTMLUNIT_PIXEL:
mValue.mInt = aCopy.mValue.mInt;
break;
case HTMLUNIT_COLOR:
mValue.mColor = aCopy.mValue.mColor;
break;
case HTMLUNIT_ISUPPORTS:
mValue.mISupports = aCopy.mValue.mISupports;
NS_IF_ADDREF(mValue.mISupports);
break;
case HTMLUNIT_PERCENT:
mValue.mFloat = aCopy.mValue.mFloat;
break;
default:
NS_ERROR("Unknown HTMLValue type!");
}
}

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

@ -1649,47 +1649,39 @@ nsCSSFrameConstructor::CreateInputFrame(nsIPresShell *aPresShell,
nsIFrame *&aFrame,
nsIStyleContext *aStyleContext)
{
nsCOMPtr<nsIFormControl> control = do_QueryInterface(aContent);
NS_ASSERTION(control, "input is not an nsIFormControl!");
PRInt32 type;
control->GetType(&type);
switch (type) {
case NS_FORM_INPUT_SUBMIT:
case NS_FORM_INPUT_RESET:
case NS_FORM_INPUT_BUTTON:
// Figure out which type of input frame to create
nsAutoString val;
if (NS_OK == aContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::type, val)) {
if (val.EqualsIgnoreCase("submit") ||
val.EqualsIgnoreCase("reset") ||
val.EqualsIgnoreCase("button")) {
if (UseXBLForms())
return NS_OK;
return ConstructButtonControlFrame(aPresShell, aPresContext, aFrame);
case NS_FORM_INPUT_CHECKBOX:
}
else if (val.EqualsIgnoreCase("checkbox")) {
if (UseXBLForms())
return NS_OK;
return ConstructCheckboxControlFrame(aPresShell, aPresContext, aFrame, aContent, aStyleContext);
case NS_FORM_INPUT_RADIO:
}
else if (val.EqualsIgnoreCase("file")) {
return NS_NewFileControlFrame(aPresShell, &aFrame);
}
else if (val.EqualsIgnoreCase("hidden")) {
return NS_OK;
}
else if (val.EqualsIgnoreCase("image")) {
return NS_NewImageControlFrame(aPresShell, &aFrame);
}
else if (val.EqualsIgnoreCase("radio")) {
if (UseXBLForms())
return NS_OK;
return ConstructRadioControlFrame(aPresShell, aPresContext, aFrame, aContent, aStyleContext);
case NS_FORM_INPUT_FILE:
return NS_NewFileControlFrame(aPresShell, &aFrame);
case NS_FORM_INPUT_HIDDEN:
return NS_OK;
case NS_FORM_INPUT_IMAGE:
return NS_NewImageControlFrame(aPresShell, &aFrame);
case NS_FORM_INPUT_TEXT:
case NS_FORM_INPUT_PASSWORD:
return ConstructTextControlFrame(aPresShell, aPresContext,
aFrame, aContent);
default:
NS_ASSERTION(0, "Unknown input type!");
return NS_ERROR_INVALID_ARG;
}
}
// "password", "text", and all others
return ConstructTextControlFrame(aPresShell, aPresContext, aFrame, aContent);
}
static PRBool

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

@ -1649,47 +1649,39 @@ nsCSSFrameConstructor::CreateInputFrame(nsIPresShell *aPresShell,
nsIFrame *&aFrame,
nsIStyleContext *aStyleContext)
{
nsCOMPtr<nsIFormControl> control = do_QueryInterface(aContent);
NS_ASSERTION(control, "input is not an nsIFormControl!");
PRInt32 type;
control->GetType(&type);
switch (type) {
case NS_FORM_INPUT_SUBMIT:
case NS_FORM_INPUT_RESET:
case NS_FORM_INPUT_BUTTON:
// Figure out which type of input frame to create
nsAutoString val;
if (NS_OK == aContent->GetAttr(kNameSpaceID_None, nsHTMLAtoms::type, val)) {
if (val.EqualsIgnoreCase("submit") ||
val.EqualsIgnoreCase("reset") ||
val.EqualsIgnoreCase("button")) {
if (UseXBLForms())
return NS_OK;
return ConstructButtonControlFrame(aPresShell, aPresContext, aFrame);
case NS_FORM_INPUT_CHECKBOX:
}
else if (val.EqualsIgnoreCase("checkbox")) {
if (UseXBLForms())
return NS_OK;
return ConstructCheckboxControlFrame(aPresShell, aPresContext, aFrame, aContent, aStyleContext);
case NS_FORM_INPUT_RADIO:
}
else if (val.EqualsIgnoreCase("file")) {
return NS_NewFileControlFrame(aPresShell, &aFrame);
}
else if (val.EqualsIgnoreCase("hidden")) {
return NS_OK;
}
else if (val.EqualsIgnoreCase("image")) {
return NS_NewImageControlFrame(aPresShell, &aFrame);
}
else if (val.EqualsIgnoreCase("radio")) {
if (UseXBLForms())
return NS_OK;
return ConstructRadioControlFrame(aPresShell, aPresContext, aFrame, aContent, aStyleContext);
case NS_FORM_INPUT_FILE:
return NS_NewFileControlFrame(aPresShell, &aFrame);
case NS_FORM_INPUT_HIDDEN:
return NS_OK;
case NS_FORM_INPUT_IMAGE:
return NS_NewImageControlFrame(aPresShell, &aFrame);
case NS_FORM_INPUT_TEXT:
case NS_FORM_INPUT_PASSWORD:
return ConstructTextControlFrame(aPresShell, aPresContext,
aFrame, aContent);
default:
NS_ASSERTION(0, "Unknown input type!");
return NS_ERROR_INVALID_ARG;
}
}
// "password", "text", and all others
return ConstructTextControlFrame(aPresShell, aPresContext, aFrame, aContent);
}
static PRBool