Implement computed position and clip, make computed style not round

values, fix font-style to say "normal" instead of "", and some random
cleanup.  Bugs 116032, 116033, 94080, 98052


git-svn-id: svn://10.0.0.236/trunk@111897 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bzbarsky%mit.edu 2002-01-11 00:15:55 +00:00
parent caa1fd0f57
commit b7de1b681f
8 changed files with 590 additions and 172 deletions

View File

@ -47,6 +47,7 @@
#include "nsIDOMElement.h"
#include "nsIStyleContext.h"
#include "nsROCSSPrimitiveValue.h"
#include "nsDOMCSSRect.h"
#include "nsCSSProps.h"
#include "nsCSSKeywords.h"
@ -213,6 +214,8 @@ private:
nsresult GetBehavior(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetCssFloat(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetDisplay(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetPosition(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetClip(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsROCSSPrimitiveValue* GetROCSSPrimitiveValue();
@ -233,6 +236,7 @@ static const nsCSSProperty queryableProperties[] = {
eCSSProperty_top,
eCSSProperty_right,
eCSSProperty_bottom,
eCSSProperty_clip,
eCSSProperty_color,
eCSSProperty_font_family,
@ -245,39 +249,48 @@ static const nsCSSProperty queryableProperties[] = {
eCSSProperty_background_image,
eCSSProperty_display,
eCSSProperty_position,
eCSSProperty_binding,
eCSSProperty_float,
eCSSProperty_padding,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_padding,
eCSSProperty_padding_top,
eCSSProperty_padding_bottom,
eCSSProperty_padding_left,
eCSSProperty_padding_right,
eCSSProperty_border_style,
eCSSProperty_border_width,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_border_style,
// eCSSProperty_border_width,
eCSSProperty_border_collapse,
eCSSProperty_border_spacing,
eCSSProperty_border_top_style,
eCSSProperty_border_right_style,
eCSSProperty_border_bottom_style,
eCSSProperty_border_left_style,
eCSSProperty_border_right_style,
eCSSProperty_border_top_width,
eCSSProperty_border_right_width,
eCSSProperty_border_bottom_width,
eCSSProperty_border_left_width,
eCSSProperty_border_right_width,
eCSSProperty_border_top_color,
eCSSProperty_border_right_color,
eCSSProperty_border_bottom_color,
eCSSProperty_border_left_color,
eCSSProperty_border_right_color,
eCSSProperty_margin,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_margin,
eCSSProperty_margin_top,
eCSSProperty_margin_bottom,
eCSSProperty_margin_left,
eCSSProperty_margin_right,
eCSSProperty_outline,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_outline,
eCSSProperty_outline_width,
eCSSProperty_outline_style,
eCSSProperty_outline_color,
@ -442,6 +455,8 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsAReadableString& aPropertyName,
rv = GetBehavior(frame, *getter_AddRefs(val)); break;
case eCSSProperty_display :
rv = GetDisplay(frame, *getter_AddRefs(val)); break;
case eCSSProperty_position :
rv = GetPosition(frame, *getter_AddRefs(val)); break;
case eCSSProperty_float :
rv = GetCssFloat(frame, *getter_AddRefs(val)); break;
case eCSSProperty_width :
@ -557,6 +572,10 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsAReadableString& aPropertyName,
// Z-Index property
case eCSSProperty_z_index:
rv = GetZIndex(frame, *getter_AddRefs(val)); break;
// Clip
case eCSSProperty_clip:
rv = GetClip(frame, *getter_AddRefs(val)); break;
default :
break;
}
@ -675,7 +694,7 @@ nsComputedDOMStyle::GetBehavior(nsIFrame *aFrame,
val->SetString(display->mBinding);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -696,10 +715,10 @@ nsComputedDOMStyle::GetCssFloat(nsIFrame *aFrame,
const nsAFlatCString& cssFloat =
nsCSSProps::SearchKeywordTable(display->mFloats,
nsCSSProps::kFloatKTable);
val->SetString(cssFloat.get());
val->SetString(cssFloat);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -878,7 +897,7 @@ nsComputedDOMStyle::GetColor(nsIFrame *aFrame,
val->SetString(hex);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -918,7 +937,7 @@ nsComputedDOMStyle::GetFontFamily(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -953,13 +972,17 @@ nsComputedDOMStyle::GetFontStyle(nsIFrame *aFrame,
GetStyleData(eStyleStruct_Font, (const nsStyleStruct*&)font, aFrame);
if(font) {
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(font->mFont.style,
nsCSSProps::kFontStyleKTable);
val->SetString(style.get());
if (font->mFont.style == NS_STYLE_FONT_STYLE_NORMAL) {
val->SetString(NS_LITERAL_STRING("normal"));
} else {
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(font->mFont.style,
nsCSSProps::kFontStyleKTable);
val->SetString(style);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -980,8 +1003,8 @@ nsComputedDOMStyle::GetFontWeight(nsIFrame *aFrame,
const nsAFlatCString& str_weight=
nsCSSProps::SearchKeywordTable(font->mFont.weight,
nsCSSProps::kFontWeightKTable);
if(str_weight.Length()>0) {
val->SetString(str_weight.get());
if(!str_weight.IsEmpty()) {
val->SetString(str_weight);
}
else {
nsAutoString num_weight;
@ -990,7 +1013,7 @@ nsComputedDOMStyle::GetFontWeight(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1008,13 +1031,17 @@ nsComputedDOMStyle::GetFontVariant(nsIFrame *aFrame,
GetStyleData(eStyleStruct_Font, (const nsStyleStruct*&)font, aFrame);
if(font) {
const nsAFlatCString& variant=
nsCSSProps::SearchKeywordTable(font->mFont.variant,
nsCSSProps::kFontVariantKTable);
val->SetString(variant.get());
if (font->mFont.variant == NS_STYLE_FONT_VARIANT_NORMAL) {
val->SetString(NS_LITERAL_STRING("normal"));
} else {
const nsAFlatCString& variant=
nsCSSProps::SearchKeywordTable(font->mFont.variant,
nsCSSProps::kFontVariantKTable);
val->SetString(variant);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1036,7 +1063,7 @@ nsComputedDOMStyle::GetBackgroundColor(nsIFrame *aFrame,
const nsAFlatCString& backgroundColor =
nsCSSProps::SearchKeywordTable(NS_STYLE_BG_COLOR_TRANSPARENT,
nsCSSProps::kBackgroundColorKTable);
val->SetString(backgroundColor.get());
val->SetString(backgroundColor);
}
else {
nsAutoString hex;
@ -1045,7 +1072,7 @@ nsComputedDOMStyle::GetBackgroundColor(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1063,10 +1090,14 @@ nsComputedDOMStyle::GetBackgroundImage(nsIFrame *aFrame,
GetStyleData(eStyleStruct_Background, (const nsStyleStruct*&)color, aFrame);
if(color) {
if (color->mBackgroundFlags & NS_STYLE_BG_IMAGE_NONE) {
val->SetString(NS_LITERAL_STRING("none"));
} else {
val->SetString(color->mBackgroundImage);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1123,10 +1154,10 @@ nsComputedDOMStyle::GetBorderCollapse(nsIFrame *aFrame,
const nsAFlatCString& ident=
nsCSSProps::SearchKeywordTable(table->mBorderCollapse,
nsCSSProps::kBorderCollapseKTable);
val->SetString(ident.get());
val->SetString(ident);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1340,7 +1371,7 @@ nsComputedDOMStyle::GetOutlineWidth(nsIFrame *aFrame,
const nsAFlatCString& width =
nsCSSProps::LookupPropertyValue(eCSSProperty_outline_width,
outline->mOutlineWidth.GetIntValue());
val->SetString(width.get());
val->SetString(width);
break;
}
default:
@ -1374,11 +1405,11 @@ nsComputedDOMStyle::GetOutlineStyle(nsIFrame *aFrame,
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(outline->GetOutlineStyle(),
nsCSSProps::kBorderStyleKTable);
val->SetString(style.get());
val->SetString(style);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1405,7 +1436,7 @@ nsComputedDOMStyle::GetOutlineColor(nsIFrame *aFrame,
val->SetString(hex);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1462,7 +1493,7 @@ nsComputedDOMStyle::GetListStyleImage(nsIFrame *aFrame,
val->SetString(list->mListStyleImage);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1483,10 +1514,10 @@ nsComputedDOMStyle::GetTextAlign(nsIFrame *aFrame,
const nsAFlatCString& align=
nsCSSProps::SearchKeywordTable(text->mTextAlign,
nsCSSProps::kTextAlignKTable);
val->SetString(align.get());
val->SetString(align);
}
else {
val->SetString("start");
val->SetString(NS_LITERAL_STRING("start"));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1507,7 +1538,7 @@ nsComputedDOMStyle::GetTextDecoration(nsIFrame *aFrame,
if (NS_STYLE_TEXT_DECORATION_NONE == text->mTextDecoration) {
const nsAFlatCString& decoration=
nsCSSKeywords::GetStringValue(eCSSKeyword_none);
val->SetString(decoration.get());
val->SetString(decoration);
}
else {
nsAutoString decorationString;
@ -1548,7 +1579,7 @@ nsComputedDOMStyle::GetTextDecoration(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1569,10 +1600,10 @@ nsComputedDOMStyle::GetVisibility(nsIFrame *aFrame,
const nsAFlatCString& value=
nsCSSProps::SearchKeywordTable(visibility->mVisible,
nsCSSProps::kVisibilityKTable);
val->SetString(value.get());
val->SetString(value);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1674,45 +1705,45 @@ nsComputedDOMStyle::GetDisplay(nsIFrame *aFrame,
if (display) {
switch (display->mDisplay) {
case NS_STYLE_DISPLAY_NONE :
val->SetString("none"); break;
val->SetString(NS_LITERAL_STRING("none")); break;
case NS_STYLE_DISPLAY_BLOCK :
val->SetString("block"); break;
val->SetString(NS_LITERAL_STRING("block")); break;
case NS_STYLE_DISPLAY_INLINE :
val->SetString("inline"); break;
val->SetString(NS_LITERAL_STRING("inline")); break;
case NS_STYLE_DISPLAY_INLINE_BLOCK :
val->SetString("inline_block"); break;
val->SetString(NS_LITERAL_STRING("inline-block")); break;
case NS_STYLE_DISPLAY_LIST_ITEM :
val->SetString("list-item"); break;
val->SetString(NS_LITERAL_STRING("list-item")); break;
case NS_STYLE_DISPLAY_MARKER :
val->SetString("marker"); break;
val->SetString(NS_LITERAL_STRING("marker")); break;
case NS_STYLE_DISPLAY_RUN_IN :
val->SetString("run-in"); break;
val->SetString(NS_LITERAL_STRING("run-in")); break;
case NS_STYLE_DISPLAY_COMPACT :
val->SetString("compact"); break;
val->SetString(NS_LITERAL_STRING("compact")); break;
case NS_STYLE_DISPLAY_TABLE :
val->SetString("table"); break;
val->SetString(NS_LITERAL_STRING("table")); break;
case NS_STYLE_DISPLAY_INLINE_TABLE :
val->SetString("inline-table"); break;
val->SetString(NS_LITERAL_STRING("inline-table")); break;
case NS_STYLE_DISPLAY_TABLE_ROW_GROUP :
val->SetString("table-row-group"); break;
val->SetString(NS_LITERAL_STRING("table-row-group")); break;
case NS_STYLE_DISPLAY_TABLE_COLUMN :
val->SetString("table-column"); break;
val->SetString(NS_LITERAL_STRING("table-column")); break;
case NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP :
val->SetString("table-column-group"); break;
val->SetString(NS_LITERAL_STRING("table-column-group")); break;
case NS_STYLE_DISPLAY_TABLE_HEADER_GROUP :
val->SetString("table-header-group"); break;
val->SetString(NS_LITERAL_STRING("table-header-group")); break;
case NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP :
val->SetString("table-footer-group"); break;
val->SetString(NS_LITERAL_STRING("table-footer-group")); break;
case NS_STYLE_DISPLAY_TABLE_ROW :
val->SetString("table-row"); break;
val->SetString(NS_LITERAL_STRING("table-row")); break;
case NS_STYLE_DISPLAY_TABLE_CELL :
val->SetString("table-cell"); break;
val->SetString(NS_LITERAL_STRING("table-cell")); break;
case NS_STYLE_DISPLAY_TABLE_CAPTION :
val->SetString("table-caption"); break;
val->SetString(NS_LITERAL_STRING("table-caption")); break;
case NS_STYLE_DISPLAY_MENU :
val->SetString("menu"); break;
val->SetString(NS_LITERAL_STRING("menu")); break;
default :
val->SetString(""); break;
val->SetString(NS_LITERAL_STRING("")); break;
break;
}
@ -1722,6 +1753,122 @@ nsComputedDOMStyle::GetDisplay(nsIFrame *aFrame,
(void **)&aValue);
}
nsresult
nsComputedDOMStyle::GetPosition(nsIFrame *aFrame,
nsIDOMCSSPrimitiveValue*& aValue)
{
nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue();
NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY);
const nsStyleDisplay* display = nsnull;
GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display, aFrame);
if (display) {
switch (display->mPosition) {
case NS_STYLE_POSITION_NORMAL:
val->SetString(NS_LITERAL_STRING("static"));
break;
case NS_STYLE_POSITION_RELATIVE:
val->SetString(NS_LITERAL_STRING("relative"));
break;
case NS_STYLE_POSITION_ABSOLUTE:
val->SetString(NS_LITERAL_STRING("absolute"));
break;
case NS_STYLE_POSITION_FIXED:
val->SetString(NS_LITERAL_STRING("fixed"));
break;
default:
NS_WARNING("Double check the position!");
break;
}
}
return CallQueryInterface(val, &aValue);
}
nsresult
nsComputedDOMStyle::GetClip(nsIFrame *aFrame,
nsIDOMCSSPrimitiveValue*& aValue)
{
nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue();
NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY);
const nsStyleDisplay* display = nsnull;
GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display, aFrame);
nsresult rv = NS_OK;
nsROCSSPrimitiveValue *topVal = nsnull;
nsROCSSPrimitiveValue *rightVal = nsnull;
nsROCSSPrimitiveValue *bottomVal = nsnull;
nsROCSSPrimitiveValue *leftVal = nsnull;
if (display) {
if (display->mClipFlags == NS_STYLE_CLIP_AUTO ||
display->mClipFlags == (NS_STYLE_CLIP_TOP_AUTO |
NS_STYLE_CLIP_RIGHT_AUTO |
NS_STYLE_CLIP_BOTTOM_AUTO |
NS_STYLE_CLIP_LEFT_AUTO)) {
val->SetString(NS_LITERAL_STRING("auto"));
}
else if (display->mClipFlags == NS_STYLE_CLIP_INHERIT) {
val->SetString(NS_LITERAL_STRING("inherit"));
} else {
// create the cssvalues for the sides, stick them in the rect object
topVal = GetROCSSPrimitiveValue();
rightVal = GetROCSSPrimitiveValue();
bottomVal = GetROCSSPrimitiveValue();
leftVal = GetROCSSPrimitiveValue();
if (topVal && rightVal && bottomVal && leftVal) {
nsDOMCSSRect * domRect = new nsDOMCSSRect(topVal, rightVal,
bottomVal, leftVal);
if (domRect) {
if (display->mClipFlags & NS_STYLE_CLIP_TOP_AUTO) {
topVal->SetString(NS_LITERAL_STRING("auto"));
} else {
topVal->SetTwips(display->mClip.y);
}
if (display->mClipFlags & NS_STYLE_CLIP_RIGHT_AUTO) {
rightVal->SetString(NS_LITERAL_STRING("auto"));
} else {
rightVal->SetTwips(display->mClip.width + display->mClip.x);
}
if (display->mClipFlags & NS_STYLE_CLIP_BOTTOM_AUTO) {
bottomVal->SetString(NS_LITERAL_STRING("auto"));
} else {
bottomVal->SetTwips(display->mClip.height + display->mClip.y);
}
if (display->mClipFlags & NS_STYLE_CLIP_LEFT_AUTO) {
leftVal->SetString(NS_LITERAL_STRING("auto"));
} else {
leftVal->SetTwips(display->mClip.x);
}
val->SetRect(domRect);
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
}
}
if (NS_FAILED(rv)) {
delete topVal;
delete rightVal;
delete bottomVal;
delete leftVal;
delete val;
return rv;
}
return CallQueryInterface(val, &aValue);
}
#if 0
NS_IMETHODIMP
nsComputedDOMStyle::GetElevation(nsAWritableString& aElevation)
@ -2721,7 +2868,7 @@ nsComputedDOMStyle::GetBorderWidthFor(PRUint8 aSide,
const nsAFlatCString& width=
nsCSSProps::SearchKeywordTable(coord.GetIntValue(),
nsCSSProps::kBorderWidthKTable);
val->SetString(width.get()); break;
val->SetString(width); break;
}
default:
NS_WARNING("double check the unit");
@ -2761,7 +2908,7 @@ nsComputedDOMStyle::GetBorderColorFor(PRUint8 aSide,
val->SetString(hex);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -2829,10 +2976,10 @@ nsComputedDOMStyle::GetBorderStyleFor(PRUint8 aSide,
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(border->GetBorderStyle(aSide),
nsCSSProps::kBorderStyleKTable);
val->SetString(style.get());
val->SetString(style);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),

View File

@ -75,47 +75,42 @@ NS_IMETHODIMP
nsROCSSPrimitiveValue::GetCssText(nsAWritableString& aCssText)
{
nsAutoString tmpStr;
aCssText.Truncate();
nsresult result = NS_OK;
switch (mType) {
case CSS_PX :
{
PRInt32 px = NSTwipsToIntPixels(mTwips, mT2P);
tmpStr.AppendInt(px);
float val = NSTwipsToFloatPixels(mTwips, mT2P);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("px"));
break;
}
case CSS_CM :
{
float val = NS_TWIPS_TO_CENTIMETERS(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("cm"));
break;
}
case CSS_MM :
{
float val = NS_TWIPS_TO_MILLIMETERS(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("mm"));
break;
}
case CSS_IN :
{
float val = NS_TWIPS_TO_INCHES(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("in"));
break;
}
case CSS_PT :
{
float val = NSTwipsToFloatPoints(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("pt"));
break;
}
@ -126,10 +121,50 @@ nsROCSSPrimitiveValue::GetCssText(nsAWritableString& aCssText)
}
case CSS_PERCENTAGE :
{
tmpStr.AppendInt(int(mFloat * 100));
tmpStr.AppendFloat(mFloat * 100);
tmpStr.Append(PRUnichar('%'));
break;
}
case CSS_RECT :
{
NS_NAMED_LITERAL_STRING(comma, ", ");
nsCOMPtr<nsIDOMCSSPrimitiveValue> sideCSSValue;
nsAutoString sideValue;
tmpStr = NS_LITERAL_STRING("rect(");
// get the top
result = mRect->GetTop(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + comma);
// get the right
result = mRect->GetRight(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + comma);
// get the bottom
result = mRect->GetBottom(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + comma);
// get the left
result = mRect->GetLeft(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + NS_LITERAL_STRING(")"));
break;
}
case CSS_PC :
case CSS_UNKNOWN :
case CSS_NUMBER :
@ -147,12 +182,13 @@ nsROCSSPrimitiveValue::GetCssText(nsAWritableString& aCssText)
case CSS_IDENT :
case CSS_ATTR :
case CSS_COUNTER :
case CSS_RECT :
case CSS_RGBCOLOR :
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
aCssText.Assign(tmpStr);
if (NS_SUCCEEDED(result)) {
aCssText.Assign(tmpStr);
}
return NS_OK;
}
@ -219,10 +255,12 @@ nsROCSSPrimitiveValue::GetFloatValue(PRUint16 aUnitType, float* aReturn)
case CSS_PT :
*aReturn = NSTwipsToFloatPoints(mTwips);
break;
case CSS_PERCENTAGE :
*aReturn = mFloat * 100;
break;
case CSS_PC :
case CSS_UNKNOWN :
case CSS_NUMBER :
case CSS_PERCENTAGE :
case CSS_EMS :
case CSS_EXS :
case CSS_DEG :
@ -258,6 +296,10 @@ nsROCSSPrimitiveValue::SetStringValue(PRUint16 aStringType,
NS_IMETHODIMP
nsROCSSPrimitiveValue::GetStringValue(nsAWritableString& aReturn)
{
if (mType != CSS_STRING) {
aReturn.Truncate();
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
aReturn.Assign(mString);
return NS_OK;
}
@ -273,7 +315,11 @@ nsROCSSPrimitiveValue::GetCounterValue(nsIDOMCounter** aReturn)
NS_IMETHODIMP
nsROCSSPrimitiveValue::GetRectValue(nsIDOMRect** aReturn)
{
return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
if (mType != CSS_RECT || !mRect) {
*aReturn = nsnull;
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
return CallQueryInterface(mRect, aReturn);
}

View File

@ -43,10 +43,11 @@
#include "nsString.h"
#include "nsCoord.h"
#include "nsUnitConversion.h"
#include "nsReadableUtils.h"
#include "nsCOMPtr.h"
#include "nsDOMError.h"
#include "nsDOMCSSRect.h"
class nsROCSSPrimitiveValue : public nsIDOMCSSPrimitiveValue
{
@ -74,9 +75,9 @@ public:
mTwips = aValue;
}
void SetString(const char *aString)
void SetString(const nsACString& aString)
{
mString.AssignWithConversion(aString);
CopyASCIItoUCS2(aString, mString);
mType = CSS_STRING;
}
@ -86,10 +87,17 @@ public:
mType = CSS_STRING;
}
void SetRect(nsIDOMRect* aRect)
{
mRect = aRect;
mType = CSS_RECT;
}
private:
PRUint16 mType;
nscoord mTwips;
nsCOMPtr<nsIDOMRect> mRect;
nsString mString;
float mFloat;

View File

@ -250,6 +250,11 @@ enum nsDOMClassInfoID {
// DOM Traversal classes
eDOMClassInfo_TreeWalker_id,
// We are now trying to preserve binary compat in classinfo. No
// more putting things in those categories up there. New entries
// are to be added right before eDOMClassInfoIDCount
eDOMClassInfo_CSSRect_id,
// This one better be the last one in this list
eDOMClassInfoIDCount
};

View File

@ -139,6 +139,7 @@
#include "nsIDOMCSSStyleDeclaration.h"
#include "nsIDOMCSSRule.h"
#include "nsIDOMCSSRuleList.h"
#include "nsIDOMRect.h"
// XBL related includes.
#include "nsIXBLService.h"
@ -797,6 +798,12 @@ static nsDOMClassInfoData sClassInfoData[] = {
// DOM Traversal classes
NS_DEFINE_CLASSINFO_DATA(TreeWalker, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
// We are now trying to preserve binary compat in classinfo. No
// more putting things in those categories up there. New entries
// are to be added to the end of the list
NS_DEFINE_CLASSINFO_DATA(CSSRect, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
};
nsIXPConnect *nsDOMClassInfo::sXPConnect = nsnull;
@ -1668,6 +1675,10 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSPrimitiveValue)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(CSSRect, nsIDOMRect)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMRect)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(Range, nsIDOMRange)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMRange)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSRange)

View File

@ -47,6 +47,7 @@
#include "nsIDOMElement.h"
#include "nsIStyleContext.h"
#include "nsROCSSPrimitiveValue.h"
#include "nsDOMCSSRect.h"
#include "nsCSSProps.h"
#include "nsCSSKeywords.h"
@ -213,6 +214,8 @@ private:
nsresult GetBehavior(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetCssFloat(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetDisplay(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetPosition(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsresult GetClip(nsIFrame *aFrame, nsIDOMCSSPrimitiveValue*& aValue);
nsROCSSPrimitiveValue* GetROCSSPrimitiveValue();
@ -233,6 +236,7 @@ static const nsCSSProperty queryableProperties[] = {
eCSSProperty_top,
eCSSProperty_right,
eCSSProperty_bottom,
eCSSProperty_clip,
eCSSProperty_color,
eCSSProperty_font_family,
@ -245,39 +249,48 @@ static const nsCSSProperty queryableProperties[] = {
eCSSProperty_background_image,
eCSSProperty_display,
eCSSProperty_position,
eCSSProperty_binding,
eCSSProperty_float,
eCSSProperty_padding,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_padding,
eCSSProperty_padding_top,
eCSSProperty_padding_bottom,
eCSSProperty_padding_left,
eCSSProperty_padding_right,
eCSSProperty_border_style,
eCSSProperty_border_width,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_border_style,
// eCSSProperty_border_width,
eCSSProperty_border_collapse,
eCSSProperty_border_spacing,
eCSSProperty_border_top_style,
eCSSProperty_border_right_style,
eCSSProperty_border_bottom_style,
eCSSProperty_border_left_style,
eCSSProperty_border_right_style,
eCSSProperty_border_top_width,
eCSSProperty_border_right_width,
eCSSProperty_border_bottom_width,
eCSSProperty_border_left_width,
eCSSProperty_border_right_width,
eCSSProperty_border_top_color,
eCSSProperty_border_right_color,
eCSSProperty_border_bottom_color,
eCSSProperty_border_left_color,
eCSSProperty_border_right_color,
eCSSProperty_margin,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_margin,
eCSSProperty_margin_top,
eCSSProperty_margin_bottom,
eCSSProperty_margin_left,
eCSSProperty_margin_right,
eCSSProperty_outline,
// shorthand properties are not really queryable. There is no
// decent way to generate them based on computed style
// eCSSProperty_outline,
eCSSProperty_outline_width,
eCSSProperty_outline_style,
eCSSProperty_outline_color,
@ -442,6 +455,8 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsAReadableString& aPropertyName,
rv = GetBehavior(frame, *getter_AddRefs(val)); break;
case eCSSProperty_display :
rv = GetDisplay(frame, *getter_AddRefs(val)); break;
case eCSSProperty_position :
rv = GetPosition(frame, *getter_AddRefs(val)); break;
case eCSSProperty_float :
rv = GetCssFloat(frame, *getter_AddRefs(val)); break;
case eCSSProperty_width :
@ -557,6 +572,10 @@ nsComputedDOMStyle::GetPropertyCSSValue(const nsAReadableString& aPropertyName,
// Z-Index property
case eCSSProperty_z_index:
rv = GetZIndex(frame, *getter_AddRefs(val)); break;
// Clip
case eCSSProperty_clip:
rv = GetClip(frame, *getter_AddRefs(val)); break;
default :
break;
}
@ -675,7 +694,7 @@ nsComputedDOMStyle::GetBehavior(nsIFrame *aFrame,
val->SetString(display->mBinding);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -696,10 +715,10 @@ nsComputedDOMStyle::GetCssFloat(nsIFrame *aFrame,
const nsAFlatCString& cssFloat =
nsCSSProps::SearchKeywordTable(display->mFloats,
nsCSSProps::kFloatKTable);
val->SetString(cssFloat.get());
val->SetString(cssFloat);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -878,7 +897,7 @@ nsComputedDOMStyle::GetColor(nsIFrame *aFrame,
val->SetString(hex);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -918,7 +937,7 @@ nsComputedDOMStyle::GetFontFamily(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -953,13 +972,17 @@ nsComputedDOMStyle::GetFontStyle(nsIFrame *aFrame,
GetStyleData(eStyleStruct_Font, (const nsStyleStruct*&)font, aFrame);
if(font) {
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(font->mFont.style,
nsCSSProps::kFontStyleKTable);
val->SetString(style.get());
if (font->mFont.style == NS_STYLE_FONT_STYLE_NORMAL) {
val->SetString(NS_LITERAL_STRING("normal"));
} else {
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(font->mFont.style,
nsCSSProps::kFontStyleKTable);
val->SetString(style);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -980,8 +1003,8 @@ nsComputedDOMStyle::GetFontWeight(nsIFrame *aFrame,
const nsAFlatCString& str_weight=
nsCSSProps::SearchKeywordTable(font->mFont.weight,
nsCSSProps::kFontWeightKTable);
if(str_weight.Length()>0) {
val->SetString(str_weight.get());
if(!str_weight.IsEmpty()) {
val->SetString(str_weight);
}
else {
nsAutoString num_weight;
@ -990,7 +1013,7 @@ nsComputedDOMStyle::GetFontWeight(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1008,13 +1031,17 @@ nsComputedDOMStyle::GetFontVariant(nsIFrame *aFrame,
GetStyleData(eStyleStruct_Font, (const nsStyleStruct*&)font, aFrame);
if(font) {
const nsAFlatCString& variant=
nsCSSProps::SearchKeywordTable(font->mFont.variant,
nsCSSProps::kFontVariantKTable);
val->SetString(variant.get());
if (font->mFont.variant == NS_STYLE_FONT_VARIANT_NORMAL) {
val->SetString(NS_LITERAL_STRING("normal"));
} else {
const nsAFlatCString& variant=
nsCSSProps::SearchKeywordTable(font->mFont.variant,
nsCSSProps::kFontVariantKTable);
val->SetString(variant);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1036,7 +1063,7 @@ nsComputedDOMStyle::GetBackgroundColor(nsIFrame *aFrame,
const nsAFlatCString& backgroundColor =
nsCSSProps::SearchKeywordTable(NS_STYLE_BG_COLOR_TRANSPARENT,
nsCSSProps::kBackgroundColorKTable);
val->SetString(backgroundColor.get());
val->SetString(backgroundColor);
}
else {
nsAutoString hex;
@ -1045,7 +1072,7 @@ nsComputedDOMStyle::GetBackgroundColor(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1063,10 +1090,14 @@ nsComputedDOMStyle::GetBackgroundImage(nsIFrame *aFrame,
GetStyleData(eStyleStruct_Background, (const nsStyleStruct*&)color, aFrame);
if(color) {
if (color->mBackgroundFlags & NS_STYLE_BG_IMAGE_NONE) {
val->SetString(NS_LITERAL_STRING("none"));
} else {
val->SetString(color->mBackgroundImage);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1123,10 +1154,10 @@ nsComputedDOMStyle::GetBorderCollapse(nsIFrame *aFrame,
const nsAFlatCString& ident=
nsCSSProps::SearchKeywordTable(table->mBorderCollapse,
nsCSSProps::kBorderCollapseKTable);
val->SetString(ident.get());
val->SetString(ident);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1340,7 +1371,7 @@ nsComputedDOMStyle::GetOutlineWidth(nsIFrame *aFrame,
const nsAFlatCString& width =
nsCSSProps::LookupPropertyValue(eCSSProperty_outline_width,
outline->mOutlineWidth.GetIntValue());
val->SetString(width.get());
val->SetString(width);
break;
}
default:
@ -1374,11 +1405,11 @@ nsComputedDOMStyle::GetOutlineStyle(nsIFrame *aFrame,
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(outline->GetOutlineStyle(),
nsCSSProps::kBorderStyleKTable);
val->SetString(style.get());
val->SetString(style);
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1405,7 +1436,7 @@ nsComputedDOMStyle::GetOutlineColor(nsIFrame *aFrame,
val->SetString(hex);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1462,7 +1493,7 @@ nsComputedDOMStyle::GetListStyleImage(nsIFrame *aFrame,
val->SetString(list->mListStyleImage);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1483,10 +1514,10 @@ nsComputedDOMStyle::GetTextAlign(nsIFrame *aFrame,
const nsAFlatCString& align=
nsCSSProps::SearchKeywordTable(text->mTextAlign,
nsCSSProps::kTextAlignKTable);
val->SetString(align.get());
val->SetString(align);
}
else {
val->SetString("start");
val->SetString(NS_LITERAL_STRING("start"));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1507,7 +1538,7 @@ nsComputedDOMStyle::GetTextDecoration(nsIFrame *aFrame,
if (NS_STYLE_TEXT_DECORATION_NONE == text->mTextDecoration) {
const nsAFlatCString& decoration=
nsCSSKeywords::GetStringValue(eCSSKeyword_none);
val->SetString(decoration.get());
val->SetString(decoration);
}
else {
nsAutoString decorationString;
@ -1548,7 +1579,7 @@ nsComputedDOMStyle::GetTextDecoration(nsIFrame *aFrame,
}
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1569,10 +1600,10 @@ nsComputedDOMStyle::GetVisibility(nsIFrame *aFrame,
const nsAFlatCString& value=
nsCSSProps::SearchKeywordTable(visibility->mVisible,
nsCSSProps::kVisibilityKTable);
val->SetString(value.get());
val->SetString(value);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -1674,45 +1705,45 @@ nsComputedDOMStyle::GetDisplay(nsIFrame *aFrame,
if (display) {
switch (display->mDisplay) {
case NS_STYLE_DISPLAY_NONE :
val->SetString("none"); break;
val->SetString(NS_LITERAL_STRING("none")); break;
case NS_STYLE_DISPLAY_BLOCK :
val->SetString("block"); break;
val->SetString(NS_LITERAL_STRING("block")); break;
case NS_STYLE_DISPLAY_INLINE :
val->SetString("inline"); break;
val->SetString(NS_LITERAL_STRING("inline")); break;
case NS_STYLE_DISPLAY_INLINE_BLOCK :
val->SetString("inline_block"); break;
val->SetString(NS_LITERAL_STRING("inline-block")); break;
case NS_STYLE_DISPLAY_LIST_ITEM :
val->SetString("list-item"); break;
val->SetString(NS_LITERAL_STRING("list-item")); break;
case NS_STYLE_DISPLAY_MARKER :
val->SetString("marker"); break;
val->SetString(NS_LITERAL_STRING("marker")); break;
case NS_STYLE_DISPLAY_RUN_IN :
val->SetString("run-in"); break;
val->SetString(NS_LITERAL_STRING("run-in")); break;
case NS_STYLE_DISPLAY_COMPACT :
val->SetString("compact"); break;
val->SetString(NS_LITERAL_STRING("compact")); break;
case NS_STYLE_DISPLAY_TABLE :
val->SetString("table"); break;
val->SetString(NS_LITERAL_STRING("table")); break;
case NS_STYLE_DISPLAY_INLINE_TABLE :
val->SetString("inline-table"); break;
val->SetString(NS_LITERAL_STRING("inline-table")); break;
case NS_STYLE_DISPLAY_TABLE_ROW_GROUP :
val->SetString("table-row-group"); break;
val->SetString(NS_LITERAL_STRING("table-row-group")); break;
case NS_STYLE_DISPLAY_TABLE_COLUMN :
val->SetString("table-column"); break;
val->SetString(NS_LITERAL_STRING("table-column")); break;
case NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP :
val->SetString("table-column-group"); break;
val->SetString(NS_LITERAL_STRING("table-column-group")); break;
case NS_STYLE_DISPLAY_TABLE_HEADER_GROUP :
val->SetString("table-header-group"); break;
val->SetString(NS_LITERAL_STRING("table-header-group")); break;
case NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP :
val->SetString("table-footer-group"); break;
val->SetString(NS_LITERAL_STRING("table-footer-group")); break;
case NS_STYLE_DISPLAY_TABLE_ROW :
val->SetString("table-row"); break;
val->SetString(NS_LITERAL_STRING("table-row")); break;
case NS_STYLE_DISPLAY_TABLE_CELL :
val->SetString("table-cell"); break;
val->SetString(NS_LITERAL_STRING("table-cell")); break;
case NS_STYLE_DISPLAY_TABLE_CAPTION :
val->SetString("table-caption"); break;
val->SetString(NS_LITERAL_STRING("table-caption")); break;
case NS_STYLE_DISPLAY_MENU :
val->SetString("menu"); break;
val->SetString(NS_LITERAL_STRING("menu")); break;
default :
val->SetString(""); break;
val->SetString(NS_LITERAL_STRING("")); break;
break;
}
@ -1722,6 +1753,122 @@ nsComputedDOMStyle::GetDisplay(nsIFrame *aFrame,
(void **)&aValue);
}
nsresult
nsComputedDOMStyle::GetPosition(nsIFrame *aFrame,
nsIDOMCSSPrimitiveValue*& aValue)
{
nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue();
NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY);
const nsStyleDisplay* display = nsnull;
GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display, aFrame);
if (display) {
switch (display->mPosition) {
case NS_STYLE_POSITION_NORMAL:
val->SetString(NS_LITERAL_STRING("static"));
break;
case NS_STYLE_POSITION_RELATIVE:
val->SetString(NS_LITERAL_STRING("relative"));
break;
case NS_STYLE_POSITION_ABSOLUTE:
val->SetString(NS_LITERAL_STRING("absolute"));
break;
case NS_STYLE_POSITION_FIXED:
val->SetString(NS_LITERAL_STRING("fixed"));
break;
default:
NS_WARNING("Double check the position!");
break;
}
}
return CallQueryInterface(val, &aValue);
}
nsresult
nsComputedDOMStyle::GetClip(nsIFrame *aFrame,
nsIDOMCSSPrimitiveValue*& aValue)
{
nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue();
NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY);
const nsStyleDisplay* display = nsnull;
GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display, aFrame);
nsresult rv = NS_OK;
nsROCSSPrimitiveValue *topVal = nsnull;
nsROCSSPrimitiveValue *rightVal = nsnull;
nsROCSSPrimitiveValue *bottomVal = nsnull;
nsROCSSPrimitiveValue *leftVal = nsnull;
if (display) {
if (display->mClipFlags == NS_STYLE_CLIP_AUTO ||
display->mClipFlags == (NS_STYLE_CLIP_TOP_AUTO |
NS_STYLE_CLIP_RIGHT_AUTO |
NS_STYLE_CLIP_BOTTOM_AUTO |
NS_STYLE_CLIP_LEFT_AUTO)) {
val->SetString(NS_LITERAL_STRING("auto"));
}
else if (display->mClipFlags == NS_STYLE_CLIP_INHERIT) {
val->SetString(NS_LITERAL_STRING("inherit"));
} else {
// create the cssvalues for the sides, stick them in the rect object
topVal = GetROCSSPrimitiveValue();
rightVal = GetROCSSPrimitiveValue();
bottomVal = GetROCSSPrimitiveValue();
leftVal = GetROCSSPrimitiveValue();
if (topVal && rightVal && bottomVal && leftVal) {
nsDOMCSSRect * domRect = new nsDOMCSSRect(topVal, rightVal,
bottomVal, leftVal);
if (domRect) {
if (display->mClipFlags & NS_STYLE_CLIP_TOP_AUTO) {
topVal->SetString(NS_LITERAL_STRING("auto"));
} else {
topVal->SetTwips(display->mClip.y);
}
if (display->mClipFlags & NS_STYLE_CLIP_RIGHT_AUTO) {
rightVal->SetString(NS_LITERAL_STRING("auto"));
} else {
rightVal->SetTwips(display->mClip.width + display->mClip.x);
}
if (display->mClipFlags & NS_STYLE_CLIP_BOTTOM_AUTO) {
bottomVal->SetString(NS_LITERAL_STRING("auto"));
} else {
bottomVal->SetTwips(display->mClip.height + display->mClip.y);
}
if (display->mClipFlags & NS_STYLE_CLIP_LEFT_AUTO) {
leftVal->SetString(NS_LITERAL_STRING("auto"));
} else {
leftVal->SetTwips(display->mClip.x);
}
val->SetRect(domRect);
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
} else {
rv = NS_ERROR_OUT_OF_MEMORY;
}
}
}
if (NS_FAILED(rv)) {
delete topVal;
delete rightVal;
delete bottomVal;
delete leftVal;
delete val;
return rv;
}
return CallQueryInterface(val, &aValue);
}
#if 0
NS_IMETHODIMP
nsComputedDOMStyle::GetElevation(nsAWritableString& aElevation)
@ -2721,7 +2868,7 @@ nsComputedDOMStyle::GetBorderWidthFor(PRUint8 aSide,
const nsAFlatCString& width=
nsCSSProps::SearchKeywordTable(coord.GetIntValue(),
nsCSSProps::kBorderWidthKTable);
val->SetString(width.get()); break;
val->SetString(width); break;
}
default:
NS_WARNING("double check the unit");
@ -2761,7 +2908,7 @@ nsComputedDOMStyle::GetBorderColorFor(PRUint8 aSide,
val->SetString(hex);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),
@ -2829,10 +2976,10 @@ nsComputedDOMStyle::GetBorderStyleFor(PRUint8 aSide,
const nsAFlatCString& style=
nsCSSProps::SearchKeywordTable(border->GetBorderStyle(aSide),
nsCSSProps::kBorderStyleKTable);
val->SetString(style.get());
val->SetString(style);
}
else {
val->SetString("");
val->SetString(NS_LITERAL_STRING(""));
}
return val->QueryInterface(NS_GET_IID(nsIDOMCSSPrimitiveValue),

View File

@ -75,47 +75,42 @@ NS_IMETHODIMP
nsROCSSPrimitiveValue::GetCssText(nsAWritableString& aCssText)
{
nsAutoString tmpStr;
aCssText.Truncate();
nsresult result = NS_OK;
switch (mType) {
case CSS_PX :
{
PRInt32 px = NSTwipsToIntPixels(mTwips, mT2P);
tmpStr.AppendInt(px);
float val = NSTwipsToFloatPixels(mTwips, mT2P);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("px"));
break;
}
case CSS_CM :
{
float val = NS_TWIPS_TO_CENTIMETERS(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("cm"));
break;
}
case CSS_MM :
{
float val = NS_TWIPS_TO_MILLIMETERS(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("mm"));
break;
}
case CSS_IN :
{
float val = NS_TWIPS_TO_INCHES(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("in"));
break;
}
case CSS_PT :
{
float val = NSTwipsToFloatPoints(mTwips);
char buf[64];
PR_snprintf(buf, 63, "%.2fcm", val);
tmpStr.AppendFloat(val);
tmpStr.Append(NS_LITERAL_STRING("pt"));
break;
}
@ -126,10 +121,50 @@ nsROCSSPrimitiveValue::GetCssText(nsAWritableString& aCssText)
}
case CSS_PERCENTAGE :
{
tmpStr.AppendInt(int(mFloat * 100));
tmpStr.AppendFloat(mFloat * 100);
tmpStr.Append(PRUnichar('%'));
break;
}
case CSS_RECT :
{
NS_NAMED_LITERAL_STRING(comma, ", ");
nsCOMPtr<nsIDOMCSSPrimitiveValue> sideCSSValue;
nsAutoString sideValue;
tmpStr = NS_LITERAL_STRING("rect(");
// get the top
result = mRect->GetTop(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + comma);
// get the right
result = mRect->GetRight(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + comma);
// get the bottom
result = mRect->GetBottom(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + comma);
// get the left
result = mRect->GetLeft(getter_AddRefs(sideCSSValue));
if (NS_FAILED(result))
break;
result = sideCSSValue->GetCssText(sideValue);
if (NS_FAILED(result))
break;
tmpStr.Append(sideValue + NS_LITERAL_STRING(")"));
break;
}
case CSS_PC :
case CSS_UNKNOWN :
case CSS_NUMBER :
@ -147,12 +182,13 @@ nsROCSSPrimitiveValue::GetCssText(nsAWritableString& aCssText)
case CSS_IDENT :
case CSS_ATTR :
case CSS_COUNTER :
case CSS_RECT :
case CSS_RGBCOLOR :
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
aCssText.Assign(tmpStr);
if (NS_SUCCEEDED(result)) {
aCssText.Assign(tmpStr);
}
return NS_OK;
}
@ -219,10 +255,12 @@ nsROCSSPrimitiveValue::GetFloatValue(PRUint16 aUnitType, float* aReturn)
case CSS_PT :
*aReturn = NSTwipsToFloatPoints(mTwips);
break;
case CSS_PERCENTAGE :
*aReturn = mFloat * 100;
break;
case CSS_PC :
case CSS_UNKNOWN :
case CSS_NUMBER :
case CSS_PERCENTAGE :
case CSS_EMS :
case CSS_EXS :
case CSS_DEG :
@ -258,6 +296,10 @@ nsROCSSPrimitiveValue::SetStringValue(PRUint16 aStringType,
NS_IMETHODIMP
nsROCSSPrimitiveValue::GetStringValue(nsAWritableString& aReturn)
{
if (mType != CSS_STRING) {
aReturn.Truncate();
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
aReturn.Assign(mString);
return NS_OK;
}
@ -273,7 +315,11 @@ nsROCSSPrimitiveValue::GetCounterValue(nsIDOMCounter** aReturn)
NS_IMETHODIMP
nsROCSSPrimitiveValue::GetRectValue(nsIDOMRect** aReturn)
{
return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
if (mType != CSS_RECT || !mRect) {
*aReturn = nsnull;
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
return CallQueryInterface(mRect, aReturn);
}

View File

@ -43,10 +43,11 @@
#include "nsString.h"
#include "nsCoord.h"
#include "nsUnitConversion.h"
#include "nsReadableUtils.h"
#include "nsCOMPtr.h"
#include "nsDOMError.h"
#include "nsDOMCSSRect.h"
class nsROCSSPrimitiveValue : public nsIDOMCSSPrimitiveValue
{
@ -74,9 +75,9 @@ public:
mTwips = aValue;
}
void SetString(const char *aString)
void SetString(const nsACString& aString)
{
mString.AssignWithConversion(aString);
CopyASCIItoUCS2(aString, mString);
mType = CSS_STRING;
}
@ -86,10 +87,17 @@ public:
mType = CSS_STRING;
}
void SetRect(nsIDOMRect* aRect)
{
mRect = aRect;
mType = CSS_RECT;
}
private:
PRUint16 mType;
nscoord mTwips;
nsCOMPtr<nsIDOMRect> mRect;
nsString mString;
float mFloat;