diff --git a/content/html/style/src/nsCSSDeclaration.cpp b/content/html/style/src/nsCSSDeclaration.cpp
index 5cfeaef158d4..1d91f30f8907 100644
--- a/content/html/style/src/nsCSSDeclaration.cpp
+++ b/content/html/style/src/nsCSSDeclaration.cpp
@@ -268,118 +268,6 @@ nsCSSValue::~nsCSSValue(void)
Reset();
}
-// XXX shouldn't this get moved to color code?
-static const char* RGBToCSSString(nscolor aColor)
-{
- const char* result = nsnull;
-
- PRInt32 r = NS_GET_R(aColor);
- PRInt32 g = NS_GET_G(aColor);
- PRInt32 b = NS_GET_B(aColor);
-
- PRInt32 index = 0;
- PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
- CSSColorEntry* entry = nsnull;
-
- for (index = 0; index < count; index++)
- {
- entry = &css_rgb_table[index];
- if (entry->r == r)
- {
- if (entry->g == g && entry->b == b)
- {
- result = entry->name;
- break;
- }
- }
- else if (entry->r > r)
- {
- break;
- }
- }
- return result;
-}
-
-
-void
-nsCSSValue::ValueToString(nsString& aBuffer, const nsCSSValue& aValue,
- PRInt32 aPropID)
-{
- nsCSSUnit unit = aValue.GetUnit();
-
- if (eCSSUnit_Null == unit) {
- return;
- }
-
- if (eCSSUnit_String == unit) {
- nsAutoString buffer;
- aValue.GetStringValue(buffer);
- aBuffer.Append(buffer);
- }
- else if (eCSSUnit_Integer == unit) {
- aBuffer.Append(aValue.GetIntValue(), 10);
- }
- else if (eCSSUnit_Enumerated == unit) {
- const char* name = nsCSSProps::LookupProperty(aPropID, aValue.GetIntValue());
- if (name != nsnull) {
- aBuffer.Append(name);
- }
- }
- else if (eCSSUnit_Color == unit){
- nscolor color = aValue.GetColorValue();
- const char* name = RGBToCSSString(color);
-
- if (name != nsnull)
- aBuffer.Append(name);
- else
- {
- aBuffer.Append("rgb(");
- aBuffer.Append(NS_GET_R(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_G(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_B(color), 10);
- aBuffer.Append(')');
- }
- }
- else if (eCSSUnit_Percent == unit) {
- aBuffer.Append(aValue.GetPercentValue() * 100.0f);
- }
- else if (eCSSUnit_Percent < unit) { // length unit
- aBuffer.Append(aValue.GetFloatValue());
- }
-
- switch (unit) {
- case eCSSUnit_Null: break;
- case eCSSUnit_Auto: aBuffer.Append("auto"); break;
- case eCSSUnit_Inherit: aBuffer.Append("inherit"); break;
- case eCSSUnit_None: aBuffer.Append("none"); break;
- case eCSSUnit_Normal: aBuffer.Append("normal"); break;
- case eCSSUnit_String: break;
- case eCSSUnit_Integer: break;
- case eCSSUnit_Enumerated: break;
- case eCSSUnit_Color: break;
- case eCSSUnit_Percent: aBuffer.Append("%"); break;
- case eCSSUnit_Number: break;
- case eCSSUnit_Inch: aBuffer.Append("in"); break;
- case eCSSUnit_Foot: aBuffer.Append("ft"); break;
- case eCSSUnit_Mile: aBuffer.Append("mi"); break;
- case eCSSUnit_Millimeter: aBuffer.Append("mm"); break;
- case eCSSUnit_Centimeter: aBuffer.Append("cm"); break;
- case eCSSUnit_Meter: aBuffer.Append("m"); break;
- case eCSSUnit_Kilometer: aBuffer.Append("km"); break;
- case eCSSUnit_Point: aBuffer.Append("pt"); break;
- case eCSSUnit_Pica: aBuffer.Append("pc"); break;
- case eCSSUnit_Didot: aBuffer.Append("dt"); break;
- case eCSSUnit_Cicero: aBuffer.Append("cc"); break;
- case eCSSUnit_EM: aBuffer.Append("em"); break;
- case eCSSUnit_EN: aBuffer.Append("en"); break;
- case eCSSUnit_XHeight: aBuffer.Append("ex"); break;
- case eCSSUnit_CapHeight: aBuffer.Append("cap"); break;
- case eCSSUnit_Pixel: aBuffer.Append("px"); break;
- }
-}
-
nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy)
{
Reset();
@@ -901,6 +789,8 @@ public:
nsresult GetValue(const char* aProperty, nsCSSValue& aValue);
nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue);
+ nsresult GetValue(PRInt32 aProperty, nsString& aValue);
+ nsresult GetValue(const nsString& aProperty, nsString& aValue);
nsresult GetImportantValues(nsICSSDeclaration*& aResult);
nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant);
@@ -1461,6 +1351,10 @@ nsresult CSSDeclarationImpl::AppendValue(PRInt32 aProperty, const nsCSSValue& aV
mOrder->AppendElement((void*)aProperty);
}
}
+ if (nsnull != mImportant) { // remove from important
+ nsCSSValue null;
+ mImportant->AppendValue(aProperty, null);
+ }
}
return result;
}
@@ -2315,6 +2209,154 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue)
return result;
}
+
+// XXX shouldn't this get moved to color code?
+static const char* RGBToCSSString(nscolor aColor)
+{
+ const char* result = nsnull;
+
+ PRInt32 r = NS_GET_R(aColor);
+ PRInt32 g = NS_GET_G(aColor);
+ PRInt32 b = NS_GET_B(aColor);
+
+ PRInt32 index = 0;
+ PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
+ CSSColorEntry* entry = nsnull;
+
+ for (index = 0; index < count; index++)
+ {
+ entry = &css_rgb_table[index];
+ if (entry->r == r)
+ {
+ if (entry->g == g && entry->b == b)
+ {
+ result = entry->name;
+ break;
+ }
+ }
+ else if (entry->r > r)
+ {
+ break;
+ }
+ }
+ return result;
+}
+
+
+nsresult CSSDeclarationImpl::GetValue(const nsString& aProperty, nsString& aValue)
+{
+ char prop[50];
+ aProperty.ToCString(prop, sizeof(prop));
+ PRInt32 propID = nsCSSProps::LookupName(prop);
+ return GetValue(propID, aValue);
+}
+
+nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsString& aValue)
+{
+ nsCSSValue value;
+ GetValue(aProperty, value);
+
+ nsCSSUnit unit = value.GetUnit();
+
+ aValue.Truncate(0);
+
+ if (eCSSUnit_Null == unit) {
+ return NS_OK;
+ }
+
+ if (eCSSUnit_String == unit) {
+ nsAutoString buffer;
+ value.GetStringValue(buffer);
+ aValue.Append(buffer);
+ }
+ else if (eCSSUnit_Integer == unit) {
+ aValue.Append(value.GetIntValue(), 10);
+ }
+ else if (eCSSUnit_Enumerated == unit) {
+ if (PROP_TEXT_DECORATION == aProperty) {
+ PRInt32 intValue = value.GetIntValue();
+ if (NS_STYLE_TEXT_DECORATION_NONE != intValue) {
+ PRInt32 mask;
+ for (mask = NS_STYLE_TEXT_DECORATION_UNDERLINE;
+ mask <= NS_STYLE_TEXT_DECORATION_BLINK;
+ mask <<= 1) {
+ if ((mask & intValue) == mask) {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, mask));
+ intValue &= ~mask;
+ if (0 != intValue) { // more left
+ aValue.Append(' ');
+ }
+ }
+ }
+ }
+ else {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, NS_STYLE_TEXT_DECORATION_NONE));
+ }
+ }
+ else {
+ const char* name = nsCSSProps::LookupProperty(aProperty, value.GetIntValue());
+ if (name != nsnull) {
+ aValue.Append(name);
+ }
+ }
+ }
+ else if (eCSSUnit_Color == unit){
+ nscolor color = value.GetColorValue();
+ const char* name = RGBToCSSString(color);
+
+ if (name != nsnull)
+ aValue.Append(name);
+ else
+ {
+ aValue.Append("rgb(");
+ aValue.Append(NS_GET_R(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_G(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_B(color), 10);
+ aValue.Append(')');
+ }
+ }
+ else if (eCSSUnit_Percent == unit) {
+ aValue.Append(value.GetPercentValue() * 100.0f);
+ }
+ else if (eCSSUnit_Percent < unit) { // length unit
+ aValue.Append(value.GetFloatValue());
+ }
+
+ switch (unit) {
+ case eCSSUnit_Null: break;
+ case eCSSUnit_Auto: aValue.Append("auto"); break;
+ case eCSSUnit_Inherit: aValue.Append("inherit"); break;
+ case eCSSUnit_None: aValue.Append("none"); break;
+ case eCSSUnit_Normal: aValue.Append("normal"); break;
+ case eCSSUnit_String: break;
+ case eCSSUnit_Integer: break;
+ case eCSSUnit_Enumerated: break;
+ case eCSSUnit_Color: break;
+ case eCSSUnit_Percent: aValue.Append("%"); break;
+ case eCSSUnit_Number: break;
+ case eCSSUnit_Inch: aValue.Append("in"); break;
+ case eCSSUnit_Foot: aValue.Append("ft"); break;
+ case eCSSUnit_Mile: aValue.Append("mi"); break;
+ case eCSSUnit_Millimeter: aValue.Append("mm"); break;
+ case eCSSUnit_Centimeter: aValue.Append("cm"); break;
+ case eCSSUnit_Meter: aValue.Append("m"); break;
+ case eCSSUnit_Kilometer: aValue.Append("km"); break;
+ case eCSSUnit_Point: aValue.Append("pt"); break;
+ case eCSSUnit_Pica: aValue.Append("pc"); break;
+ case eCSSUnit_Didot: aValue.Append("dt"); break;
+ case eCSSUnit_Cicero: aValue.Append("cc"); break;
+ case eCSSUnit_EM: aValue.Append("em"); break;
+ case eCSSUnit_EN: aValue.Append("en"); break;
+ case eCSSUnit_XHeight: aValue.Append("ex"); break;
+ case eCSSUnit_CapHeight: aValue.Append("cap"); break;
+ case eCSSUnit_Pixel: aValue.Append("px"); break;
+ }
+
+ return NS_OK;
+}
+
nsresult CSSDeclarationImpl::GetImportantValues(nsICSSDeclaration*& aResult)
{
if (nsnull != mImportant) {
@@ -2356,28 +2398,15 @@ nsresult CSSDeclarationImpl::ToString(nsString& aString)
for (index = 0; index < count; index++) {
PRInt32 property = (PRInt32)mOrder->ElementAt(index);
if (0 <= property) {
- nsCSSValue value;
- PRBool important = PR_FALSE;
- // check for important value
- if (nsnull != mImportant) {
- mImportant->GetValue(property, value);
- if (eCSSUnit_Null != value.GetUnit()) {
- important = PR_TRUE;
- }
- else {
- GetValue(property, value);
- }
- }
- else {
- GetValue(property, value);
- }
aString.Append(nsCSSProps::kNameTable[property].name);
aString.Append(": ");
- nsCSSValue::ValueToString(aString, value, property);
- if (PR_TRUE == important) {
- aString.Append(" ! important");
+
+ nsAutoString value;
+ GetValue(property, value);
+ aString.Append(value);
+ if (index < count) {
+ aString.Append("; ");
}
- aString.Append("; ");
}
else { // is comment
aString.Append("/* ");
diff --git a/content/html/style/src/nsCSSStruct.cpp b/content/html/style/src/nsCSSStruct.cpp
index 5cfeaef158d4..1d91f30f8907 100644
--- a/content/html/style/src/nsCSSStruct.cpp
+++ b/content/html/style/src/nsCSSStruct.cpp
@@ -268,118 +268,6 @@ nsCSSValue::~nsCSSValue(void)
Reset();
}
-// XXX shouldn't this get moved to color code?
-static const char* RGBToCSSString(nscolor aColor)
-{
- const char* result = nsnull;
-
- PRInt32 r = NS_GET_R(aColor);
- PRInt32 g = NS_GET_G(aColor);
- PRInt32 b = NS_GET_B(aColor);
-
- PRInt32 index = 0;
- PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
- CSSColorEntry* entry = nsnull;
-
- for (index = 0; index < count; index++)
- {
- entry = &css_rgb_table[index];
- if (entry->r == r)
- {
- if (entry->g == g && entry->b == b)
- {
- result = entry->name;
- break;
- }
- }
- else if (entry->r > r)
- {
- break;
- }
- }
- return result;
-}
-
-
-void
-nsCSSValue::ValueToString(nsString& aBuffer, const nsCSSValue& aValue,
- PRInt32 aPropID)
-{
- nsCSSUnit unit = aValue.GetUnit();
-
- if (eCSSUnit_Null == unit) {
- return;
- }
-
- if (eCSSUnit_String == unit) {
- nsAutoString buffer;
- aValue.GetStringValue(buffer);
- aBuffer.Append(buffer);
- }
- else if (eCSSUnit_Integer == unit) {
- aBuffer.Append(aValue.GetIntValue(), 10);
- }
- else if (eCSSUnit_Enumerated == unit) {
- const char* name = nsCSSProps::LookupProperty(aPropID, aValue.GetIntValue());
- if (name != nsnull) {
- aBuffer.Append(name);
- }
- }
- else if (eCSSUnit_Color == unit){
- nscolor color = aValue.GetColorValue();
- const char* name = RGBToCSSString(color);
-
- if (name != nsnull)
- aBuffer.Append(name);
- else
- {
- aBuffer.Append("rgb(");
- aBuffer.Append(NS_GET_R(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_G(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_B(color), 10);
- aBuffer.Append(')');
- }
- }
- else if (eCSSUnit_Percent == unit) {
- aBuffer.Append(aValue.GetPercentValue() * 100.0f);
- }
- else if (eCSSUnit_Percent < unit) { // length unit
- aBuffer.Append(aValue.GetFloatValue());
- }
-
- switch (unit) {
- case eCSSUnit_Null: break;
- case eCSSUnit_Auto: aBuffer.Append("auto"); break;
- case eCSSUnit_Inherit: aBuffer.Append("inherit"); break;
- case eCSSUnit_None: aBuffer.Append("none"); break;
- case eCSSUnit_Normal: aBuffer.Append("normal"); break;
- case eCSSUnit_String: break;
- case eCSSUnit_Integer: break;
- case eCSSUnit_Enumerated: break;
- case eCSSUnit_Color: break;
- case eCSSUnit_Percent: aBuffer.Append("%"); break;
- case eCSSUnit_Number: break;
- case eCSSUnit_Inch: aBuffer.Append("in"); break;
- case eCSSUnit_Foot: aBuffer.Append("ft"); break;
- case eCSSUnit_Mile: aBuffer.Append("mi"); break;
- case eCSSUnit_Millimeter: aBuffer.Append("mm"); break;
- case eCSSUnit_Centimeter: aBuffer.Append("cm"); break;
- case eCSSUnit_Meter: aBuffer.Append("m"); break;
- case eCSSUnit_Kilometer: aBuffer.Append("km"); break;
- case eCSSUnit_Point: aBuffer.Append("pt"); break;
- case eCSSUnit_Pica: aBuffer.Append("pc"); break;
- case eCSSUnit_Didot: aBuffer.Append("dt"); break;
- case eCSSUnit_Cicero: aBuffer.Append("cc"); break;
- case eCSSUnit_EM: aBuffer.Append("em"); break;
- case eCSSUnit_EN: aBuffer.Append("en"); break;
- case eCSSUnit_XHeight: aBuffer.Append("ex"); break;
- case eCSSUnit_CapHeight: aBuffer.Append("cap"); break;
- case eCSSUnit_Pixel: aBuffer.Append("px"); break;
- }
-}
-
nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy)
{
Reset();
@@ -901,6 +789,8 @@ public:
nsresult GetValue(const char* aProperty, nsCSSValue& aValue);
nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue);
+ nsresult GetValue(PRInt32 aProperty, nsString& aValue);
+ nsresult GetValue(const nsString& aProperty, nsString& aValue);
nsresult GetImportantValues(nsICSSDeclaration*& aResult);
nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant);
@@ -1461,6 +1351,10 @@ nsresult CSSDeclarationImpl::AppendValue(PRInt32 aProperty, const nsCSSValue& aV
mOrder->AppendElement((void*)aProperty);
}
}
+ if (nsnull != mImportant) { // remove from important
+ nsCSSValue null;
+ mImportant->AppendValue(aProperty, null);
+ }
}
return result;
}
@@ -2315,6 +2209,154 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue)
return result;
}
+
+// XXX shouldn't this get moved to color code?
+static const char* RGBToCSSString(nscolor aColor)
+{
+ const char* result = nsnull;
+
+ PRInt32 r = NS_GET_R(aColor);
+ PRInt32 g = NS_GET_G(aColor);
+ PRInt32 b = NS_GET_B(aColor);
+
+ PRInt32 index = 0;
+ PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
+ CSSColorEntry* entry = nsnull;
+
+ for (index = 0; index < count; index++)
+ {
+ entry = &css_rgb_table[index];
+ if (entry->r == r)
+ {
+ if (entry->g == g && entry->b == b)
+ {
+ result = entry->name;
+ break;
+ }
+ }
+ else if (entry->r > r)
+ {
+ break;
+ }
+ }
+ return result;
+}
+
+
+nsresult CSSDeclarationImpl::GetValue(const nsString& aProperty, nsString& aValue)
+{
+ char prop[50];
+ aProperty.ToCString(prop, sizeof(prop));
+ PRInt32 propID = nsCSSProps::LookupName(prop);
+ return GetValue(propID, aValue);
+}
+
+nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsString& aValue)
+{
+ nsCSSValue value;
+ GetValue(aProperty, value);
+
+ nsCSSUnit unit = value.GetUnit();
+
+ aValue.Truncate(0);
+
+ if (eCSSUnit_Null == unit) {
+ return NS_OK;
+ }
+
+ if (eCSSUnit_String == unit) {
+ nsAutoString buffer;
+ value.GetStringValue(buffer);
+ aValue.Append(buffer);
+ }
+ else if (eCSSUnit_Integer == unit) {
+ aValue.Append(value.GetIntValue(), 10);
+ }
+ else if (eCSSUnit_Enumerated == unit) {
+ if (PROP_TEXT_DECORATION == aProperty) {
+ PRInt32 intValue = value.GetIntValue();
+ if (NS_STYLE_TEXT_DECORATION_NONE != intValue) {
+ PRInt32 mask;
+ for (mask = NS_STYLE_TEXT_DECORATION_UNDERLINE;
+ mask <= NS_STYLE_TEXT_DECORATION_BLINK;
+ mask <<= 1) {
+ if ((mask & intValue) == mask) {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, mask));
+ intValue &= ~mask;
+ if (0 != intValue) { // more left
+ aValue.Append(' ');
+ }
+ }
+ }
+ }
+ else {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, NS_STYLE_TEXT_DECORATION_NONE));
+ }
+ }
+ else {
+ const char* name = nsCSSProps::LookupProperty(aProperty, value.GetIntValue());
+ if (name != nsnull) {
+ aValue.Append(name);
+ }
+ }
+ }
+ else if (eCSSUnit_Color == unit){
+ nscolor color = value.GetColorValue();
+ const char* name = RGBToCSSString(color);
+
+ if (name != nsnull)
+ aValue.Append(name);
+ else
+ {
+ aValue.Append("rgb(");
+ aValue.Append(NS_GET_R(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_G(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_B(color), 10);
+ aValue.Append(')');
+ }
+ }
+ else if (eCSSUnit_Percent == unit) {
+ aValue.Append(value.GetPercentValue() * 100.0f);
+ }
+ else if (eCSSUnit_Percent < unit) { // length unit
+ aValue.Append(value.GetFloatValue());
+ }
+
+ switch (unit) {
+ case eCSSUnit_Null: break;
+ case eCSSUnit_Auto: aValue.Append("auto"); break;
+ case eCSSUnit_Inherit: aValue.Append("inherit"); break;
+ case eCSSUnit_None: aValue.Append("none"); break;
+ case eCSSUnit_Normal: aValue.Append("normal"); break;
+ case eCSSUnit_String: break;
+ case eCSSUnit_Integer: break;
+ case eCSSUnit_Enumerated: break;
+ case eCSSUnit_Color: break;
+ case eCSSUnit_Percent: aValue.Append("%"); break;
+ case eCSSUnit_Number: break;
+ case eCSSUnit_Inch: aValue.Append("in"); break;
+ case eCSSUnit_Foot: aValue.Append("ft"); break;
+ case eCSSUnit_Mile: aValue.Append("mi"); break;
+ case eCSSUnit_Millimeter: aValue.Append("mm"); break;
+ case eCSSUnit_Centimeter: aValue.Append("cm"); break;
+ case eCSSUnit_Meter: aValue.Append("m"); break;
+ case eCSSUnit_Kilometer: aValue.Append("km"); break;
+ case eCSSUnit_Point: aValue.Append("pt"); break;
+ case eCSSUnit_Pica: aValue.Append("pc"); break;
+ case eCSSUnit_Didot: aValue.Append("dt"); break;
+ case eCSSUnit_Cicero: aValue.Append("cc"); break;
+ case eCSSUnit_EM: aValue.Append("em"); break;
+ case eCSSUnit_EN: aValue.Append("en"); break;
+ case eCSSUnit_XHeight: aValue.Append("ex"); break;
+ case eCSSUnit_CapHeight: aValue.Append("cap"); break;
+ case eCSSUnit_Pixel: aValue.Append("px"); break;
+ }
+
+ return NS_OK;
+}
+
nsresult CSSDeclarationImpl::GetImportantValues(nsICSSDeclaration*& aResult)
{
if (nsnull != mImportant) {
@@ -2356,28 +2398,15 @@ nsresult CSSDeclarationImpl::ToString(nsString& aString)
for (index = 0; index < count; index++) {
PRInt32 property = (PRInt32)mOrder->ElementAt(index);
if (0 <= property) {
- nsCSSValue value;
- PRBool important = PR_FALSE;
- // check for important value
- if (nsnull != mImportant) {
- mImportant->GetValue(property, value);
- if (eCSSUnit_Null != value.GetUnit()) {
- important = PR_TRUE;
- }
- else {
- GetValue(property, value);
- }
- }
- else {
- GetValue(property, value);
- }
aString.Append(nsCSSProps::kNameTable[property].name);
aString.Append(": ");
- nsCSSValue::ValueToString(aString, value, property);
- if (PR_TRUE == important) {
- aString.Append(" ! important");
+
+ nsAutoString value;
+ GetValue(property, value);
+ aString.Append(value);
+ if (index < count) {
+ aString.Append("; ");
}
- aString.Append("; ");
}
else { // is comment
aString.Append("/* ");
diff --git a/content/html/style/src/nsICSSDeclaration.h b/content/html/style/src/nsICSSDeclaration.h
index 255b79939f53..238ec267f5cc 100644
--- a/content/html/style/src/nsICSSDeclaration.h
+++ b/content/html/style/src/nsICSSDeclaration.h
@@ -112,11 +112,7 @@ public:
void SetNoneValue(void);
void SetNormalValue(void);
- static void ValueToString(nsString& aBuffer,
- const nsCSSValue& aValue,
- PRInt32 aPropID = -1);
-
- // debugging methods
+ // debugging methods only
void AppendToString(nsString& aBuffer, PRInt32 aPropID = -1) const;
void ToString(nsString& aBuffer, PRInt32 aPropID = -1) const;
@@ -329,6 +325,9 @@ public:
virtual nsresult GetValue(const char* aProperty, nsCSSValue& aValue) = 0;
virtual nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue) = 0;
+ virtual nsresult GetValue(PRInt32 aProperty, nsString& aValue) = 0;
+ virtual nsresult GetValue(const nsString& aProperty, nsString& aValue) = 0;
+
virtual nsresult GetImportantValues(nsICSSDeclaration*& aResult) = 0;
virtual nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant) = 0;
diff --git a/layout/html/style/src/nsCSSDeclaration.cpp b/layout/html/style/src/nsCSSDeclaration.cpp
index 5cfeaef158d4..1d91f30f8907 100644
--- a/layout/html/style/src/nsCSSDeclaration.cpp
+++ b/layout/html/style/src/nsCSSDeclaration.cpp
@@ -268,118 +268,6 @@ nsCSSValue::~nsCSSValue(void)
Reset();
}
-// XXX shouldn't this get moved to color code?
-static const char* RGBToCSSString(nscolor aColor)
-{
- const char* result = nsnull;
-
- PRInt32 r = NS_GET_R(aColor);
- PRInt32 g = NS_GET_G(aColor);
- PRInt32 b = NS_GET_B(aColor);
-
- PRInt32 index = 0;
- PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
- CSSColorEntry* entry = nsnull;
-
- for (index = 0; index < count; index++)
- {
- entry = &css_rgb_table[index];
- if (entry->r == r)
- {
- if (entry->g == g && entry->b == b)
- {
- result = entry->name;
- break;
- }
- }
- else if (entry->r > r)
- {
- break;
- }
- }
- return result;
-}
-
-
-void
-nsCSSValue::ValueToString(nsString& aBuffer, const nsCSSValue& aValue,
- PRInt32 aPropID)
-{
- nsCSSUnit unit = aValue.GetUnit();
-
- if (eCSSUnit_Null == unit) {
- return;
- }
-
- if (eCSSUnit_String == unit) {
- nsAutoString buffer;
- aValue.GetStringValue(buffer);
- aBuffer.Append(buffer);
- }
- else if (eCSSUnit_Integer == unit) {
- aBuffer.Append(aValue.GetIntValue(), 10);
- }
- else if (eCSSUnit_Enumerated == unit) {
- const char* name = nsCSSProps::LookupProperty(aPropID, aValue.GetIntValue());
- if (name != nsnull) {
- aBuffer.Append(name);
- }
- }
- else if (eCSSUnit_Color == unit){
- nscolor color = aValue.GetColorValue();
- const char* name = RGBToCSSString(color);
-
- if (name != nsnull)
- aBuffer.Append(name);
- else
- {
- aBuffer.Append("rgb(");
- aBuffer.Append(NS_GET_R(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_G(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_B(color), 10);
- aBuffer.Append(')');
- }
- }
- else if (eCSSUnit_Percent == unit) {
- aBuffer.Append(aValue.GetPercentValue() * 100.0f);
- }
- else if (eCSSUnit_Percent < unit) { // length unit
- aBuffer.Append(aValue.GetFloatValue());
- }
-
- switch (unit) {
- case eCSSUnit_Null: break;
- case eCSSUnit_Auto: aBuffer.Append("auto"); break;
- case eCSSUnit_Inherit: aBuffer.Append("inherit"); break;
- case eCSSUnit_None: aBuffer.Append("none"); break;
- case eCSSUnit_Normal: aBuffer.Append("normal"); break;
- case eCSSUnit_String: break;
- case eCSSUnit_Integer: break;
- case eCSSUnit_Enumerated: break;
- case eCSSUnit_Color: break;
- case eCSSUnit_Percent: aBuffer.Append("%"); break;
- case eCSSUnit_Number: break;
- case eCSSUnit_Inch: aBuffer.Append("in"); break;
- case eCSSUnit_Foot: aBuffer.Append("ft"); break;
- case eCSSUnit_Mile: aBuffer.Append("mi"); break;
- case eCSSUnit_Millimeter: aBuffer.Append("mm"); break;
- case eCSSUnit_Centimeter: aBuffer.Append("cm"); break;
- case eCSSUnit_Meter: aBuffer.Append("m"); break;
- case eCSSUnit_Kilometer: aBuffer.Append("km"); break;
- case eCSSUnit_Point: aBuffer.Append("pt"); break;
- case eCSSUnit_Pica: aBuffer.Append("pc"); break;
- case eCSSUnit_Didot: aBuffer.Append("dt"); break;
- case eCSSUnit_Cicero: aBuffer.Append("cc"); break;
- case eCSSUnit_EM: aBuffer.Append("em"); break;
- case eCSSUnit_EN: aBuffer.Append("en"); break;
- case eCSSUnit_XHeight: aBuffer.Append("ex"); break;
- case eCSSUnit_CapHeight: aBuffer.Append("cap"); break;
- case eCSSUnit_Pixel: aBuffer.Append("px"); break;
- }
-}
-
nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy)
{
Reset();
@@ -901,6 +789,8 @@ public:
nsresult GetValue(const char* aProperty, nsCSSValue& aValue);
nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue);
+ nsresult GetValue(PRInt32 aProperty, nsString& aValue);
+ nsresult GetValue(const nsString& aProperty, nsString& aValue);
nsresult GetImportantValues(nsICSSDeclaration*& aResult);
nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant);
@@ -1461,6 +1351,10 @@ nsresult CSSDeclarationImpl::AppendValue(PRInt32 aProperty, const nsCSSValue& aV
mOrder->AppendElement((void*)aProperty);
}
}
+ if (nsnull != mImportant) { // remove from important
+ nsCSSValue null;
+ mImportant->AppendValue(aProperty, null);
+ }
}
return result;
}
@@ -2315,6 +2209,154 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue)
return result;
}
+
+// XXX shouldn't this get moved to color code?
+static const char* RGBToCSSString(nscolor aColor)
+{
+ const char* result = nsnull;
+
+ PRInt32 r = NS_GET_R(aColor);
+ PRInt32 g = NS_GET_G(aColor);
+ PRInt32 b = NS_GET_B(aColor);
+
+ PRInt32 index = 0;
+ PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
+ CSSColorEntry* entry = nsnull;
+
+ for (index = 0; index < count; index++)
+ {
+ entry = &css_rgb_table[index];
+ if (entry->r == r)
+ {
+ if (entry->g == g && entry->b == b)
+ {
+ result = entry->name;
+ break;
+ }
+ }
+ else if (entry->r > r)
+ {
+ break;
+ }
+ }
+ return result;
+}
+
+
+nsresult CSSDeclarationImpl::GetValue(const nsString& aProperty, nsString& aValue)
+{
+ char prop[50];
+ aProperty.ToCString(prop, sizeof(prop));
+ PRInt32 propID = nsCSSProps::LookupName(prop);
+ return GetValue(propID, aValue);
+}
+
+nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsString& aValue)
+{
+ nsCSSValue value;
+ GetValue(aProperty, value);
+
+ nsCSSUnit unit = value.GetUnit();
+
+ aValue.Truncate(0);
+
+ if (eCSSUnit_Null == unit) {
+ return NS_OK;
+ }
+
+ if (eCSSUnit_String == unit) {
+ nsAutoString buffer;
+ value.GetStringValue(buffer);
+ aValue.Append(buffer);
+ }
+ else if (eCSSUnit_Integer == unit) {
+ aValue.Append(value.GetIntValue(), 10);
+ }
+ else if (eCSSUnit_Enumerated == unit) {
+ if (PROP_TEXT_DECORATION == aProperty) {
+ PRInt32 intValue = value.GetIntValue();
+ if (NS_STYLE_TEXT_DECORATION_NONE != intValue) {
+ PRInt32 mask;
+ for (mask = NS_STYLE_TEXT_DECORATION_UNDERLINE;
+ mask <= NS_STYLE_TEXT_DECORATION_BLINK;
+ mask <<= 1) {
+ if ((mask & intValue) == mask) {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, mask));
+ intValue &= ~mask;
+ if (0 != intValue) { // more left
+ aValue.Append(' ');
+ }
+ }
+ }
+ }
+ else {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, NS_STYLE_TEXT_DECORATION_NONE));
+ }
+ }
+ else {
+ const char* name = nsCSSProps::LookupProperty(aProperty, value.GetIntValue());
+ if (name != nsnull) {
+ aValue.Append(name);
+ }
+ }
+ }
+ else if (eCSSUnit_Color == unit){
+ nscolor color = value.GetColorValue();
+ const char* name = RGBToCSSString(color);
+
+ if (name != nsnull)
+ aValue.Append(name);
+ else
+ {
+ aValue.Append("rgb(");
+ aValue.Append(NS_GET_R(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_G(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_B(color), 10);
+ aValue.Append(')');
+ }
+ }
+ else if (eCSSUnit_Percent == unit) {
+ aValue.Append(value.GetPercentValue() * 100.0f);
+ }
+ else if (eCSSUnit_Percent < unit) { // length unit
+ aValue.Append(value.GetFloatValue());
+ }
+
+ switch (unit) {
+ case eCSSUnit_Null: break;
+ case eCSSUnit_Auto: aValue.Append("auto"); break;
+ case eCSSUnit_Inherit: aValue.Append("inherit"); break;
+ case eCSSUnit_None: aValue.Append("none"); break;
+ case eCSSUnit_Normal: aValue.Append("normal"); break;
+ case eCSSUnit_String: break;
+ case eCSSUnit_Integer: break;
+ case eCSSUnit_Enumerated: break;
+ case eCSSUnit_Color: break;
+ case eCSSUnit_Percent: aValue.Append("%"); break;
+ case eCSSUnit_Number: break;
+ case eCSSUnit_Inch: aValue.Append("in"); break;
+ case eCSSUnit_Foot: aValue.Append("ft"); break;
+ case eCSSUnit_Mile: aValue.Append("mi"); break;
+ case eCSSUnit_Millimeter: aValue.Append("mm"); break;
+ case eCSSUnit_Centimeter: aValue.Append("cm"); break;
+ case eCSSUnit_Meter: aValue.Append("m"); break;
+ case eCSSUnit_Kilometer: aValue.Append("km"); break;
+ case eCSSUnit_Point: aValue.Append("pt"); break;
+ case eCSSUnit_Pica: aValue.Append("pc"); break;
+ case eCSSUnit_Didot: aValue.Append("dt"); break;
+ case eCSSUnit_Cicero: aValue.Append("cc"); break;
+ case eCSSUnit_EM: aValue.Append("em"); break;
+ case eCSSUnit_EN: aValue.Append("en"); break;
+ case eCSSUnit_XHeight: aValue.Append("ex"); break;
+ case eCSSUnit_CapHeight: aValue.Append("cap"); break;
+ case eCSSUnit_Pixel: aValue.Append("px"); break;
+ }
+
+ return NS_OK;
+}
+
nsresult CSSDeclarationImpl::GetImportantValues(nsICSSDeclaration*& aResult)
{
if (nsnull != mImportant) {
@@ -2356,28 +2398,15 @@ nsresult CSSDeclarationImpl::ToString(nsString& aString)
for (index = 0; index < count; index++) {
PRInt32 property = (PRInt32)mOrder->ElementAt(index);
if (0 <= property) {
- nsCSSValue value;
- PRBool important = PR_FALSE;
- // check for important value
- if (nsnull != mImportant) {
- mImportant->GetValue(property, value);
- if (eCSSUnit_Null != value.GetUnit()) {
- important = PR_TRUE;
- }
- else {
- GetValue(property, value);
- }
- }
- else {
- GetValue(property, value);
- }
aString.Append(nsCSSProps::kNameTable[property].name);
aString.Append(": ");
- nsCSSValue::ValueToString(aString, value, property);
- if (PR_TRUE == important) {
- aString.Append(" ! important");
+
+ nsAutoString value;
+ GetValue(property, value);
+ aString.Append(value);
+ if (index < count) {
+ aString.Append("; ");
}
- aString.Append("; ");
}
else { // is comment
aString.Append("/* ");
diff --git a/layout/html/style/src/nsICSSDeclaration.h b/layout/html/style/src/nsICSSDeclaration.h
index 255b79939f53..238ec267f5cc 100644
--- a/layout/html/style/src/nsICSSDeclaration.h
+++ b/layout/html/style/src/nsICSSDeclaration.h
@@ -112,11 +112,7 @@ public:
void SetNoneValue(void);
void SetNormalValue(void);
- static void ValueToString(nsString& aBuffer,
- const nsCSSValue& aValue,
- PRInt32 aPropID = -1);
-
- // debugging methods
+ // debugging methods only
void AppendToString(nsString& aBuffer, PRInt32 aPropID = -1) const;
void ToString(nsString& aBuffer, PRInt32 aPropID = -1) const;
@@ -329,6 +325,9 @@ public:
virtual nsresult GetValue(const char* aProperty, nsCSSValue& aValue) = 0;
virtual nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue) = 0;
+ virtual nsresult GetValue(PRInt32 aProperty, nsString& aValue) = 0;
+ virtual nsresult GetValue(const nsString& aProperty, nsString& aValue) = 0;
+
virtual nsresult GetImportantValues(nsICSSDeclaration*& aResult) = 0;
virtual nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant) = 0;
diff --git a/layout/style/nsCSSDeclaration.cpp b/layout/style/nsCSSDeclaration.cpp
index 5cfeaef158d4..1d91f30f8907 100644
--- a/layout/style/nsCSSDeclaration.cpp
+++ b/layout/style/nsCSSDeclaration.cpp
@@ -268,118 +268,6 @@ nsCSSValue::~nsCSSValue(void)
Reset();
}
-// XXX shouldn't this get moved to color code?
-static const char* RGBToCSSString(nscolor aColor)
-{
- const char* result = nsnull;
-
- PRInt32 r = NS_GET_R(aColor);
- PRInt32 g = NS_GET_G(aColor);
- PRInt32 b = NS_GET_B(aColor);
-
- PRInt32 index = 0;
- PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
- CSSColorEntry* entry = nsnull;
-
- for (index = 0; index < count; index++)
- {
- entry = &css_rgb_table[index];
- if (entry->r == r)
- {
- if (entry->g == g && entry->b == b)
- {
- result = entry->name;
- break;
- }
- }
- else if (entry->r > r)
- {
- break;
- }
- }
- return result;
-}
-
-
-void
-nsCSSValue::ValueToString(nsString& aBuffer, const nsCSSValue& aValue,
- PRInt32 aPropID)
-{
- nsCSSUnit unit = aValue.GetUnit();
-
- if (eCSSUnit_Null == unit) {
- return;
- }
-
- if (eCSSUnit_String == unit) {
- nsAutoString buffer;
- aValue.GetStringValue(buffer);
- aBuffer.Append(buffer);
- }
- else if (eCSSUnit_Integer == unit) {
- aBuffer.Append(aValue.GetIntValue(), 10);
- }
- else if (eCSSUnit_Enumerated == unit) {
- const char* name = nsCSSProps::LookupProperty(aPropID, aValue.GetIntValue());
- if (name != nsnull) {
- aBuffer.Append(name);
- }
- }
- else if (eCSSUnit_Color == unit){
- nscolor color = aValue.GetColorValue();
- const char* name = RGBToCSSString(color);
-
- if (name != nsnull)
- aBuffer.Append(name);
- else
- {
- aBuffer.Append("rgb(");
- aBuffer.Append(NS_GET_R(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_G(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_B(color), 10);
- aBuffer.Append(')');
- }
- }
- else if (eCSSUnit_Percent == unit) {
- aBuffer.Append(aValue.GetPercentValue() * 100.0f);
- }
- else if (eCSSUnit_Percent < unit) { // length unit
- aBuffer.Append(aValue.GetFloatValue());
- }
-
- switch (unit) {
- case eCSSUnit_Null: break;
- case eCSSUnit_Auto: aBuffer.Append("auto"); break;
- case eCSSUnit_Inherit: aBuffer.Append("inherit"); break;
- case eCSSUnit_None: aBuffer.Append("none"); break;
- case eCSSUnit_Normal: aBuffer.Append("normal"); break;
- case eCSSUnit_String: break;
- case eCSSUnit_Integer: break;
- case eCSSUnit_Enumerated: break;
- case eCSSUnit_Color: break;
- case eCSSUnit_Percent: aBuffer.Append("%"); break;
- case eCSSUnit_Number: break;
- case eCSSUnit_Inch: aBuffer.Append("in"); break;
- case eCSSUnit_Foot: aBuffer.Append("ft"); break;
- case eCSSUnit_Mile: aBuffer.Append("mi"); break;
- case eCSSUnit_Millimeter: aBuffer.Append("mm"); break;
- case eCSSUnit_Centimeter: aBuffer.Append("cm"); break;
- case eCSSUnit_Meter: aBuffer.Append("m"); break;
- case eCSSUnit_Kilometer: aBuffer.Append("km"); break;
- case eCSSUnit_Point: aBuffer.Append("pt"); break;
- case eCSSUnit_Pica: aBuffer.Append("pc"); break;
- case eCSSUnit_Didot: aBuffer.Append("dt"); break;
- case eCSSUnit_Cicero: aBuffer.Append("cc"); break;
- case eCSSUnit_EM: aBuffer.Append("em"); break;
- case eCSSUnit_EN: aBuffer.Append("en"); break;
- case eCSSUnit_XHeight: aBuffer.Append("ex"); break;
- case eCSSUnit_CapHeight: aBuffer.Append("cap"); break;
- case eCSSUnit_Pixel: aBuffer.Append("px"); break;
- }
-}
-
nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy)
{
Reset();
@@ -901,6 +789,8 @@ public:
nsresult GetValue(const char* aProperty, nsCSSValue& aValue);
nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue);
+ nsresult GetValue(PRInt32 aProperty, nsString& aValue);
+ nsresult GetValue(const nsString& aProperty, nsString& aValue);
nsresult GetImportantValues(nsICSSDeclaration*& aResult);
nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant);
@@ -1461,6 +1351,10 @@ nsresult CSSDeclarationImpl::AppendValue(PRInt32 aProperty, const nsCSSValue& aV
mOrder->AppendElement((void*)aProperty);
}
}
+ if (nsnull != mImportant) { // remove from important
+ nsCSSValue null;
+ mImportant->AppendValue(aProperty, null);
+ }
}
return result;
}
@@ -2315,6 +2209,154 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue)
return result;
}
+
+// XXX shouldn't this get moved to color code?
+static const char* RGBToCSSString(nscolor aColor)
+{
+ const char* result = nsnull;
+
+ PRInt32 r = NS_GET_R(aColor);
+ PRInt32 g = NS_GET_G(aColor);
+ PRInt32 b = NS_GET_B(aColor);
+
+ PRInt32 index = 0;
+ PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
+ CSSColorEntry* entry = nsnull;
+
+ for (index = 0; index < count; index++)
+ {
+ entry = &css_rgb_table[index];
+ if (entry->r == r)
+ {
+ if (entry->g == g && entry->b == b)
+ {
+ result = entry->name;
+ break;
+ }
+ }
+ else if (entry->r > r)
+ {
+ break;
+ }
+ }
+ return result;
+}
+
+
+nsresult CSSDeclarationImpl::GetValue(const nsString& aProperty, nsString& aValue)
+{
+ char prop[50];
+ aProperty.ToCString(prop, sizeof(prop));
+ PRInt32 propID = nsCSSProps::LookupName(prop);
+ return GetValue(propID, aValue);
+}
+
+nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsString& aValue)
+{
+ nsCSSValue value;
+ GetValue(aProperty, value);
+
+ nsCSSUnit unit = value.GetUnit();
+
+ aValue.Truncate(0);
+
+ if (eCSSUnit_Null == unit) {
+ return NS_OK;
+ }
+
+ if (eCSSUnit_String == unit) {
+ nsAutoString buffer;
+ value.GetStringValue(buffer);
+ aValue.Append(buffer);
+ }
+ else if (eCSSUnit_Integer == unit) {
+ aValue.Append(value.GetIntValue(), 10);
+ }
+ else if (eCSSUnit_Enumerated == unit) {
+ if (PROP_TEXT_DECORATION == aProperty) {
+ PRInt32 intValue = value.GetIntValue();
+ if (NS_STYLE_TEXT_DECORATION_NONE != intValue) {
+ PRInt32 mask;
+ for (mask = NS_STYLE_TEXT_DECORATION_UNDERLINE;
+ mask <= NS_STYLE_TEXT_DECORATION_BLINK;
+ mask <<= 1) {
+ if ((mask & intValue) == mask) {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, mask));
+ intValue &= ~mask;
+ if (0 != intValue) { // more left
+ aValue.Append(' ');
+ }
+ }
+ }
+ }
+ else {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, NS_STYLE_TEXT_DECORATION_NONE));
+ }
+ }
+ else {
+ const char* name = nsCSSProps::LookupProperty(aProperty, value.GetIntValue());
+ if (name != nsnull) {
+ aValue.Append(name);
+ }
+ }
+ }
+ else if (eCSSUnit_Color == unit){
+ nscolor color = value.GetColorValue();
+ const char* name = RGBToCSSString(color);
+
+ if (name != nsnull)
+ aValue.Append(name);
+ else
+ {
+ aValue.Append("rgb(");
+ aValue.Append(NS_GET_R(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_G(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_B(color), 10);
+ aValue.Append(')');
+ }
+ }
+ else if (eCSSUnit_Percent == unit) {
+ aValue.Append(value.GetPercentValue() * 100.0f);
+ }
+ else if (eCSSUnit_Percent < unit) { // length unit
+ aValue.Append(value.GetFloatValue());
+ }
+
+ switch (unit) {
+ case eCSSUnit_Null: break;
+ case eCSSUnit_Auto: aValue.Append("auto"); break;
+ case eCSSUnit_Inherit: aValue.Append("inherit"); break;
+ case eCSSUnit_None: aValue.Append("none"); break;
+ case eCSSUnit_Normal: aValue.Append("normal"); break;
+ case eCSSUnit_String: break;
+ case eCSSUnit_Integer: break;
+ case eCSSUnit_Enumerated: break;
+ case eCSSUnit_Color: break;
+ case eCSSUnit_Percent: aValue.Append("%"); break;
+ case eCSSUnit_Number: break;
+ case eCSSUnit_Inch: aValue.Append("in"); break;
+ case eCSSUnit_Foot: aValue.Append("ft"); break;
+ case eCSSUnit_Mile: aValue.Append("mi"); break;
+ case eCSSUnit_Millimeter: aValue.Append("mm"); break;
+ case eCSSUnit_Centimeter: aValue.Append("cm"); break;
+ case eCSSUnit_Meter: aValue.Append("m"); break;
+ case eCSSUnit_Kilometer: aValue.Append("km"); break;
+ case eCSSUnit_Point: aValue.Append("pt"); break;
+ case eCSSUnit_Pica: aValue.Append("pc"); break;
+ case eCSSUnit_Didot: aValue.Append("dt"); break;
+ case eCSSUnit_Cicero: aValue.Append("cc"); break;
+ case eCSSUnit_EM: aValue.Append("em"); break;
+ case eCSSUnit_EN: aValue.Append("en"); break;
+ case eCSSUnit_XHeight: aValue.Append("ex"); break;
+ case eCSSUnit_CapHeight: aValue.Append("cap"); break;
+ case eCSSUnit_Pixel: aValue.Append("px"); break;
+ }
+
+ return NS_OK;
+}
+
nsresult CSSDeclarationImpl::GetImportantValues(nsICSSDeclaration*& aResult)
{
if (nsnull != mImportant) {
@@ -2356,28 +2398,15 @@ nsresult CSSDeclarationImpl::ToString(nsString& aString)
for (index = 0; index < count; index++) {
PRInt32 property = (PRInt32)mOrder->ElementAt(index);
if (0 <= property) {
- nsCSSValue value;
- PRBool important = PR_FALSE;
- // check for important value
- if (nsnull != mImportant) {
- mImportant->GetValue(property, value);
- if (eCSSUnit_Null != value.GetUnit()) {
- important = PR_TRUE;
- }
- else {
- GetValue(property, value);
- }
- }
- else {
- GetValue(property, value);
- }
aString.Append(nsCSSProps::kNameTable[property].name);
aString.Append(": ");
- nsCSSValue::ValueToString(aString, value, property);
- if (PR_TRUE == important) {
- aString.Append(" ! important");
+
+ nsAutoString value;
+ GetValue(property, value);
+ aString.Append(value);
+ if (index < count) {
+ aString.Append("; ");
}
- aString.Append("; ");
}
else { // is comment
aString.Append("/* ");
diff --git a/layout/style/nsCSSStruct.cpp b/layout/style/nsCSSStruct.cpp
index 5cfeaef158d4..1d91f30f8907 100644
--- a/layout/style/nsCSSStruct.cpp
+++ b/layout/style/nsCSSStruct.cpp
@@ -268,118 +268,6 @@ nsCSSValue::~nsCSSValue(void)
Reset();
}
-// XXX shouldn't this get moved to color code?
-static const char* RGBToCSSString(nscolor aColor)
-{
- const char* result = nsnull;
-
- PRInt32 r = NS_GET_R(aColor);
- PRInt32 g = NS_GET_G(aColor);
- PRInt32 b = NS_GET_B(aColor);
-
- PRInt32 index = 0;
- PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
- CSSColorEntry* entry = nsnull;
-
- for (index = 0; index < count; index++)
- {
- entry = &css_rgb_table[index];
- if (entry->r == r)
- {
- if (entry->g == g && entry->b == b)
- {
- result = entry->name;
- break;
- }
- }
- else if (entry->r > r)
- {
- break;
- }
- }
- return result;
-}
-
-
-void
-nsCSSValue::ValueToString(nsString& aBuffer, const nsCSSValue& aValue,
- PRInt32 aPropID)
-{
- nsCSSUnit unit = aValue.GetUnit();
-
- if (eCSSUnit_Null == unit) {
- return;
- }
-
- if (eCSSUnit_String == unit) {
- nsAutoString buffer;
- aValue.GetStringValue(buffer);
- aBuffer.Append(buffer);
- }
- else if (eCSSUnit_Integer == unit) {
- aBuffer.Append(aValue.GetIntValue(), 10);
- }
- else if (eCSSUnit_Enumerated == unit) {
- const char* name = nsCSSProps::LookupProperty(aPropID, aValue.GetIntValue());
- if (name != nsnull) {
- aBuffer.Append(name);
- }
- }
- else if (eCSSUnit_Color == unit){
- nscolor color = aValue.GetColorValue();
- const char* name = RGBToCSSString(color);
-
- if (name != nsnull)
- aBuffer.Append(name);
- else
- {
- aBuffer.Append("rgb(");
- aBuffer.Append(NS_GET_R(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_G(color), 10);
- aBuffer.Append(",");
- aBuffer.Append(NS_GET_B(color), 10);
- aBuffer.Append(')');
- }
- }
- else if (eCSSUnit_Percent == unit) {
- aBuffer.Append(aValue.GetPercentValue() * 100.0f);
- }
- else if (eCSSUnit_Percent < unit) { // length unit
- aBuffer.Append(aValue.GetFloatValue());
- }
-
- switch (unit) {
- case eCSSUnit_Null: break;
- case eCSSUnit_Auto: aBuffer.Append("auto"); break;
- case eCSSUnit_Inherit: aBuffer.Append("inherit"); break;
- case eCSSUnit_None: aBuffer.Append("none"); break;
- case eCSSUnit_Normal: aBuffer.Append("normal"); break;
- case eCSSUnit_String: break;
- case eCSSUnit_Integer: break;
- case eCSSUnit_Enumerated: break;
- case eCSSUnit_Color: break;
- case eCSSUnit_Percent: aBuffer.Append("%"); break;
- case eCSSUnit_Number: break;
- case eCSSUnit_Inch: aBuffer.Append("in"); break;
- case eCSSUnit_Foot: aBuffer.Append("ft"); break;
- case eCSSUnit_Mile: aBuffer.Append("mi"); break;
- case eCSSUnit_Millimeter: aBuffer.Append("mm"); break;
- case eCSSUnit_Centimeter: aBuffer.Append("cm"); break;
- case eCSSUnit_Meter: aBuffer.Append("m"); break;
- case eCSSUnit_Kilometer: aBuffer.Append("km"); break;
- case eCSSUnit_Point: aBuffer.Append("pt"); break;
- case eCSSUnit_Pica: aBuffer.Append("pc"); break;
- case eCSSUnit_Didot: aBuffer.Append("dt"); break;
- case eCSSUnit_Cicero: aBuffer.Append("cc"); break;
- case eCSSUnit_EM: aBuffer.Append("em"); break;
- case eCSSUnit_EN: aBuffer.Append("en"); break;
- case eCSSUnit_XHeight: aBuffer.Append("ex"); break;
- case eCSSUnit_CapHeight: aBuffer.Append("cap"); break;
- case eCSSUnit_Pixel: aBuffer.Append("px"); break;
- }
-}
-
nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy)
{
Reset();
@@ -901,6 +789,8 @@ public:
nsresult GetValue(const char* aProperty, nsCSSValue& aValue);
nsresult GetValue(PRInt32 aProperty, nsCSSValue& aValue);
+ nsresult GetValue(PRInt32 aProperty, nsString& aValue);
+ nsresult GetValue(const nsString& aProperty, nsString& aValue);
nsresult GetImportantValues(nsICSSDeclaration*& aResult);
nsresult GetValueIsImportant(const char *aProperty, PRBool& aIsImportant);
@@ -1461,6 +1351,10 @@ nsresult CSSDeclarationImpl::AppendValue(PRInt32 aProperty, const nsCSSValue& aV
mOrder->AppendElement((void*)aProperty);
}
}
+ if (nsnull != mImportant) { // remove from important
+ nsCSSValue null;
+ mImportant->AppendValue(aProperty, null);
+ }
}
return result;
}
@@ -2315,6 +2209,154 @@ nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsCSSValue& aValue)
return result;
}
+
+// XXX shouldn't this get moved to color code?
+static const char* RGBToCSSString(nscolor aColor)
+{
+ const char* result = nsnull;
+
+ PRInt32 r = NS_GET_R(aColor);
+ PRInt32 g = NS_GET_G(aColor);
+ PRInt32 b = NS_GET_B(aColor);
+
+ PRInt32 index = 0;
+ PRInt32 count = sizeof(css_rgb_table)/sizeof(CSSColorEntry);
+ CSSColorEntry* entry = nsnull;
+
+ for (index = 0; index < count; index++)
+ {
+ entry = &css_rgb_table[index];
+ if (entry->r == r)
+ {
+ if (entry->g == g && entry->b == b)
+ {
+ result = entry->name;
+ break;
+ }
+ }
+ else if (entry->r > r)
+ {
+ break;
+ }
+ }
+ return result;
+}
+
+
+nsresult CSSDeclarationImpl::GetValue(const nsString& aProperty, nsString& aValue)
+{
+ char prop[50];
+ aProperty.ToCString(prop, sizeof(prop));
+ PRInt32 propID = nsCSSProps::LookupName(prop);
+ return GetValue(propID, aValue);
+}
+
+nsresult CSSDeclarationImpl::GetValue(PRInt32 aProperty, nsString& aValue)
+{
+ nsCSSValue value;
+ GetValue(aProperty, value);
+
+ nsCSSUnit unit = value.GetUnit();
+
+ aValue.Truncate(0);
+
+ if (eCSSUnit_Null == unit) {
+ return NS_OK;
+ }
+
+ if (eCSSUnit_String == unit) {
+ nsAutoString buffer;
+ value.GetStringValue(buffer);
+ aValue.Append(buffer);
+ }
+ else if (eCSSUnit_Integer == unit) {
+ aValue.Append(value.GetIntValue(), 10);
+ }
+ else if (eCSSUnit_Enumerated == unit) {
+ if (PROP_TEXT_DECORATION == aProperty) {
+ PRInt32 intValue = value.GetIntValue();
+ if (NS_STYLE_TEXT_DECORATION_NONE != intValue) {
+ PRInt32 mask;
+ for (mask = NS_STYLE_TEXT_DECORATION_UNDERLINE;
+ mask <= NS_STYLE_TEXT_DECORATION_BLINK;
+ mask <<= 1) {
+ if ((mask & intValue) == mask) {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, mask));
+ intValue &= ~mask;
+ if (0 != intValue) { // more left
+ aValue.Append(' ');
+ }
+ }
+ }
+ }
+ else {
+ aValue.Append(nsCSSProps::LookupProperty(aProperty, NS_STYLE_TEXT_DECORATION_NONE));
+ }
+ }
+ else {
+ const char* name = nsCSSProps::LookupProperty(aProperty, value.GetIntValue());
+ if (name != nsnull) {
+ aValue.Append(name);
+ }
+ }
+ }
+ else if (eCSSUnit_Color == unit){
+ nscolor color = value.GetColorValue();
+ const char* name = RGBToCSSString(color);
+
+ if (name != nsnull)
+ aValue.Append(name);
+ else
+ {
+ aValue.Append("rgb(");
+ aValue.Append(NS_GET_R(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_G(color), 10);
+ aValue.Append(",");
+ aValue.Append(NS_GET_B(color), 10);
+ aValue.Append(')');
+ }
+ }
+ else if (eCSSUnit_Percent == unit) {
+ aValue.Append(value.GetPercentValue() * 100.0f);
+ }
+ else if (eCSSUnit_Percent < unit) { // length unit
+ aValue.Append(value.GetFloatValue());
+ }
+
+ switch (unit) {
+ case eCSSUnit_Null: break;
+ case eCSSUnit_Auto: aValue.Append("auto"); break;
+ case eCSSUnit_Inherit: aValue.Append("inherit"); break;
+ case eCSSUnit_None: aValue.Append("none"); break;
+ case eCSSUnit_Normal: aValue.Append("normal"); break;
+ case eCSSUnit_String: break;
+ case eCSSUnit_Integer: break;
+ case eCSSUnit_Enumerated: break;
+ case eCSSUnit_Color: break;
+ case eCSSUnit_Percent: aValue.Append("%"); break;
+ case eCSSUnit_Number: break;
+ case eCSSUnit_Inch: aValue.Append("in"); break;
+ case eCSSUnit_Foot: aValue.Append("ft"); break;
+ case eCSSUnit_Mile: aValue.Append("mi"); break;
+ case eCSSUnit_Millimeter: aValue.Append("mm"); break;
+ case eCSSUnit_Centimeter: aValue.Append("cm"); break;
+ case eCSSUnit_Meter: aValue.Append("m"); break;
+ case eCSSUnit_Kilometer: aValue.Append("km"); break;
+ case eCSSUnit_Point: aValue.Append("pt"); break;
+ case eCSSUnit_Pica: aValue.Append("pc"); break;
+ case eCSSUnit_Didot: aValue.Append("dt"); break;
+ case eCSSUnit_Cicero: aValue.Append("cc"); break;
+ case eCSSUnit_EM: aValue.Append("em"); break;
+ case eCSSUnit_EN: aValue.Append("en"); break;
+ case eCSSUnit_XHeight: aValue.Append("ex"); break;
+ case eCSSUnit_CapHeight: aValue.Append("cap"); break;
+ case eCSSUnit_Pixel: aValue.Append("px"); break;
+ }
+
+ return NS_OK;
+}
+
nsresult CSSDeclarationImpl::GetImportantValues(nsICSSDeclaration*& aResult)
{
if (nsnull != mImportant) {
@@ -2356,28 +2398,15 @@ nsresult CSSDeclarationImpl::ToString(nsString& aString)
for (index = 0; index < count; index++) {
PRInt32 property = (PRInt32)mOrder->ElementAt(index);
if (0 <= property) {
- nsCSSValue value;
- PRBool important = PR_FALSE;
- // check for important value
- if (nsnull != mImportant) {
- mImportant->GetValue(property, value);
- if (eCSSUnit_Null != value.GetUnit()) {
- important = PR_TRUE;
- }
- else {
- GetValue(property, value);
- }
- }
- else {
- GetValue(property, value);
- }
aString.Append(nsCSSProps::kNameTable[property].name);
aString.Append(": ");
- nsCSSValue::ValueToString(aString, value, property);
- if (PR_TRUE == important) {
- aString.Append(" ! important");
+
+ nsAutoString value;
+ GetValue(property, value);
+ aString.Append(value);
+ if (index < count) {
+ aString.Append("; ");
}
- aString.Append("; ");
}
else { // is comment
aString.Append("/* ");