static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // height: value if (aData->mPositionData->mHeight.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); if (value && value->Type() == nsAttrValue::eInteger) aData->mPositionData->mHeight.SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); else if (value && value->Type() == nsAttrValue::ePercent) aData->mPositionData->mHeight.SetPercentValue(value->GetPercentValue()); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) { if (aData->mTextData->mTextAlign.GetUnit() == eCSSUnit_Null) { // align: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) aData->mTextData->mTextAlign.SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TextReset)) { if (aData->mTextData->mVerticalAlign.GetUnit() == eCSSUnit_Null) { // valign: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::valign); if (value && value->Type() == nsAttrValue::eEnum) aData->mTextData->mVerticalAlign.SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Border)) { // frameborder: 0 | 1 (| NO | YES in quirks mode) // If frameborder is 0 or No, set border to 0 // else leave it as the value set in html.css const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::frameborder); if (value && value->Type() == nsAttrValue::eEnum) { int32_t frameborder = value->GetEnumValue(); if (NS_STYLE_FRAME_0 == frameborder || NS_STYLE_FRAME_NO == frameborder || NS_STYLE_FRAME_OFF == frameborder) { nsCSSValue* borderLeftWidth = aData->ValueForBorderLeftWidthValue(); if (borderLeftWidth->GetUnit() == eCSSUnit_Null) borderLeftWidth->SetFloatValue(0.0f, eCSSUnit_Pixel); nsCSSValue* borderRightWidth = aData->ValueForBorderRightWidthValue(); if (borderRightWidth->GetUnit() == eCSSUnit_Null) borderRightWidth->SetFloatValue(0.0f, eCSSUnit_Pixel); nsCSSValue* borderTopWidth = aData->ValueForBorderTopWidth(); if (borderTopWidth->GetUnit() == eCSSUnit_Null) borderTopWidth->SetFloatValue(0.0f, eCSSUnit_Pixel); nsCSSValue* borderBottomWidth = aData->ValueForBorderBottomWidth(); if (borderBottomWidth->GetUnit() == eCSSUnit_Null) borderBottomWidth->SetFloatValue(0.0f, eCSSUnit_Pixel); } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // width: value nsCSSValue* width = aData->ValueForWidth(); if (width->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (value && value->Type() == nsAttrValue::eInteger) width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); else if (value && value->Type() == nsAttrValue::ePercent) width->SetPercentValue(value->GetPercentValue()); } // height: value nsCSSValue* height = aData->ValueForHeight(); if (height->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); if (value && value->Type() == nsAttrValue::eInteger) height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); else if (value && value->Type() == nsAttrValue::ePercent) height->SetPercentValue(value->GetPercentValue()); } } nsGenericHTMLElement::MapScrollingAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapImageAlignAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Font)) { // face: string list nsCSSValue* family = aData->ValueForFontFamily(); if (family->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::face); if (value && value->Type() == nsAttrValue::eString && !value->IsEmptyString()) { family->SetStringValue(value->GetStringValue(), eCSSUnit_Families); } } // size: int nsCSSValue* fontSize = aData->ValueForFontSize(); if (fontSize->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::size); if (value && value->Type() == nsAttrValue::eInteger) { fontSize->SetIntValue(value->GetIntegerValue(), eCSSUnit_Enumerated); } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) { nsCSSValue* colorValue = aData->ValueForColor(); if (colorValue->GetUnit() == eCSSUnit_Null && aData->mPresContext->UseDocumentColors()) { // color: color const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::color); nscolor color; if (value && value->GetColorValue(color)) { colorValue->SetColorValue(color); } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TextReset) && aData->mPresContext->CompatibilityMode() == eCompatibility_NavQuirks) { // Make <a><font color="red">text</font></a> give the text a red underline // in quirks mode. The NS_STYLE_TEXT_DECORATION_LINE_OVERRIDE_ALL flag only // affects quirks mode rendering. const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::color); nscolor color; if (value && value->GetColorValue(color)) { nsCSSValue* decoration = aData->ValueForTextDecorationLine(); int32_t newValue = NS_STYLE_TEXT_DECORATION_LINE_OVERRIDE_ALL; if (decoration->GetUnit() == eCSSUnit_Enumerated) { newValue |= decoration->GetIntValue(); } decoration->SetIntValue(newValue, eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
void HTMLTableCellElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, GenericSpecifiedValues* aData) { if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Position))) { // width: value if (!aData->PropertyIsSet(eCSSProperty_width)) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (value && value->Type() == nsAttrValue::eInteger) { if (value->GetIntegerValue() > 0) aData->SetPixelValue(eCSSProperty_width, (float)value->GetIntegerValue()); // else 0 implies auto for compatibility. } else if (value && value->Type() == nsAttrValue::ePercent) { if (value->GetPercentValue() > 0.0f) aData->SetPercentValue(eCSSProperty_width, value->GetPercentValue()); // else 0 implies auto for compatibility } } // height: value if (!aData->PropertyIsSet(eCSSProperty_height)) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); if (value && value->Type() == nsAttrValue::eInteger) { if (value->GetIntegerValue() > 0) aData->SetPixelValue(eCSSProperty_height, (float)value->GetIntegerValue()); // else 0 implies auto for compatibility. } else if (value && value->Type() == nsAttrValue::ePercent) { if (value->GetPercentValue() > 0.0f) aData->SetPercentValue(eCSSProperty_height, value->GetPercentValue()); // else 0 implies auto for compatibility } } } if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Text))) { if (!aData->PropertyIsSet(eCSSProperty_white_space)) { // nowrap: enum if (aAttributes->GetAttr(nsGkAtoms::nowrap)) { // See if our width is not a nonzero integer width. const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); nsCompatibility mode = aData->PresContext()->CompatibilityMode(); if (!value || value->Type() != nsAttrValue::eInteger || value->GetIntegerValue() == 0 || eCompatibility_NavQuirks != mode) { aData->SetKeywordValue(eCSSProperty_white_space, NS_STYLE_WHITESPACE_NOWRAP); } } } } nsGenericHTMLElement::MapDivAlignAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapVAlignAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Border)) { // frameborder: 0 | 1 (| NO | YES in quirks mode) // If frameborder is 0 or No, set border to 0 // else leave it as the value set in html.css const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::frameborder); if (value && value->Type() == nsAttrValue::eEnum) { PRInt32 frameborder = value->GetEnumValue(); if (NS_STYLE_FRAME_0 == frameborder || NS_STYLE_FRAME_NO == frameborder || NS_STYLE_FRAME_OFF == frameborder) { if (aData->mMarginData->mBorderWidth.mLeft.GetUnit() == eCSSUnit_Null) aData->mMarginData->mBorderWidth.mLeft.SetFloatValue(0.0f, eCSSUnit_Pixel); if (aData->mMarginData->mBorderWidth.mRight.GetUnit() == eCSSUnit_Null) aData->mMarginData->mBorderWidth.mRight.SetFloatValue(0.0f, eCSSUnit_Pixel); if (aData->mMarginData->mBorderWidth.mTop.GetUnit() == eCSSUnit_Null) aData->mMarginData->mBorderWidth.mTop.SetFloatValue(0.0f, eCSSUnit_Pixel); if (aData->mMarginData->mBorderWidth.mBottom.GetUnit() == eCSSUnit_Null) aData->mMarginData->mBorderWidth.mBottom.SetFloatValue(0.0f, eCSSUnit_Pixel); } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // width: value if (aData->mPositionData->mWidth.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (value && value->Type() == nsAttrValue::eInteger) aData->mPositionData->mWidth.SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); else if (value && value->Type() == nsAttrValue::ePercent) aData->mPositionData->mWidth.SetPercentValue(value->GetPercentValue()); } // height: value if (aData->mPositionData->mHeight.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); if (value && value->Type() == nsAttrValue::eInteger) aData->mPositionData->mHeight.SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); else if (value && value->Type() == nsAttrValue::ePercent) aData->mPositionData->mHeight.SetPercentValue(value->GetPercentValue()); } } nsGenericHTMLElement::MapScrollingAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapImageAlignAttributeInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
void HTMLBodyElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Display)) { // When display if first asked for, go ahead and get our colors set up. nsIPresShell *presShell = aData->mPresContext->GetPresShell(); if (presShell) { nsIDocument *doc = presShell->GetDocument(); if (doc) { nsHTMLStyleSheet* styleSheet = doc->GetAttributeStyleSheet(); if (styleSheet) { const nsAttrValue* value; nscolor color; value = aAttributes->GetAttr(nsGkAtoms::link); if (value && value->GetColorValue(color)) { styleSheet->SetLinkColor(color); } value = aAttributes->GetAttr(nsGkAtoms::alink); if (value && value->GetColorValue(color)) { styleSheet->SetActiveLinkColor(color); } value = aAttributes->GetAttr(nsGkAtoms::vlink); if (value && value->GetColorValue(color)) { styleSheet->SetVisitedLinkColor(color); } } } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) { nsCSSValue *colorValue = aData->ValueForColor(); if (colorValue->GetUnit() == eCSSUnit_Null && aData->mPresContext->UseDocumentColors()) { // color: color nscolor color; const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::text); if (value && value->GetColorValue(color)) colorValue->SetColorValue(color); } } nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { nsCSSValue* width = aData->ValueForWidth(); if (width->GetUnit() == eCSSUnit_Null) { // width: int (html4 attribute == nav4 cols) const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (!value || value->Type() != nsAttrValue::eInteger) { // cols: int (nav4 attribute) value = aAttributes->GetAttr(nsGkAtoms::cols); } if (value && value->Type() == nsAttrValue::eInteger) width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Char); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) { nsCSSValue* whiteSpace = aData->ValueForWhiteSpace(); if (whiteSpace->GetUnit() == eCSSUnit_Null) { // wrap: empty if (aAttributes->GetAttr(nsGkAtoms::wrap)) whiteSpace->SetIntValue(NS_STYLE_WHITESPACE_PRE_WRAP, eCSSUnit_Enumerated); // width: int (html4 attribute == nav4 cols) const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (!value || value->Type() != nsAttrValue::eInteger) { // cols: int (nav4 attribute) value = aAttributes->GetAttr(nsGkAtoms::cols); } if (value && value->Type() == nsAttrValue::eInteger) { // Force wrap property on since we want to wrap at a width // boundary not just a newline. whiteSpace->SetIntValue(NS_STYLE_WHITESPACE_PRE_WRAP, eCSSUnit_Enumerated); } } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TableBorder)) { if (aData->mTableData->mCaptionSide.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) aData->mTableData->mCaptionSide.SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
void HTMLTableRowElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // height: value nsCSSValue* height = aData->ValueForHeight(); if (height->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); if (value && value->Type() == nsAttrValue::eInteger) height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); else if (value && value->Type() == nsAttrValue::ePercent) height->SetPercentValue(value->GetPercentValue()); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) { nsCSSValue* textAlign = aData->ValueForTextAlign(); if (textAlign->GetUnit() == eCSSUnit_Null) { // align: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) textAlign->SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TextReset)) { nsCSSValue* verticalAlign = aData->ValueForVerticalAlign(); if (verticalAlign->GetUnit() == eCSSUnit_Null) { // valign: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::valign); if (value && value->Type() == nsAttrValue::eEnum) verticalAlign->SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(List)) { nsCSSValue* listStyleType = aData->ValueForListStyleType(); if (listStyleType->GetUnit() == eCSSUnit_Null) { // type: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::type); if (value && value->Type() == nsAttrValue::eEnum) listStyleType->SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(List)) { if (aData->mListData->mType.GetUnit() == eCSSUnit_Null) { // type: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::type); if (value) { if (value->Type() == nsAttrValue::eEnum) aData->mListData->mType.SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); else aData->mListData->mType.SetIntValue(NS_STYLE_LIST_STYLE_DECIMAL, eCSSUnit_Enumerated); } } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
void HTMLTextAreaElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) { // wrap=off nsCSSValue* whiteSpace = aData->ValueForWhiteSpace(); if (whiteSpace->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::wrap); if (value && value->Type() == nsAttrValue::eString && value->Equals(nsGkAtoms::OFF, eIgnoreCase)) { whiteSpace->SetIntValue(NS_STYLE_WHITESPACE_PRE, eCSSUnit_Enumerated); } } } nsGenericHTMLFormElementWithState::MapDivAlignAttributeInto(aAttributes, aData); nsGenericHTMLFormElementWithState::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Font)) { nsRuleDataFont& font = *(aData->mFontData); // face: string list if (font.mFamily.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::face); if (value && value->Type() == nsAttrValue::eString && !value->IsEmptyString()) { font.mFamily.SetStringValue(value->GetStringValue(), eCSSUnit_String); font.mFamilyFromHTML = PR_TRUE; } } // pointSize: int if (font.mSize.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::pointSize); if (value && value->Type() == nsAttrValue::eInteger) font.mSize.SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Point); else { // size: int, enum , value = aAttributes->GetAttr(nsGkAtoms::size); if (value) { nsAttrValue::ValueType unit = value->Type(); if (unit == nsAttrValue::eInteger || unit == nsAttrValue::eEnum) { PRInt32 size; if (unit == nsAttrValue::eEnum) // int (+/-) size = value->GetEnumValue() + 3; // XXX should be BASEFONT, not three see bug 3875 else size = value->GetIntegerValue(); size = ((0 < size) ? ((size < 8) ? size : 7) : 1); font.mSize.SetIntValue(size, eCSSUnit_Enumerated); } } } } // fontWeight: int if (font.mWeight.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::fontWeight); if (value && value->Type() == nsAttrValue::eInteger) // +/- font.mWeight.SetIntValue(value->GetIntegerValue(), eCSSUnit_Integer); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) { if (aData->mColorData->mColor.GetUnit() == eCSSUnit_Null && aData->mPresContext->UseDocumentColors()) { // color: color const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::color); nscolor color; if (value && value->GetColorValue(color)) { aData->mColorData->mColor.SetColorValue(color); } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TextReset)) { // Make <a><font color="red">text</font></a> give the text a red underline // in quirks mode. The NS_STYLE_TEXT_DECORATION_OVERRIDE_ALL flag only // affects quirks mode rendering. const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::color); nscolor color; if (value && value->GetColorValue(color)) { nsCSSValue& decoration = aData->mTextData->mDecoration; PRInt32 newValue = NS_STYLE_TEXT_DECORATION_OVERRIDE_ALL; if (decoration.GetUnit() == eCSSUnit_Enumerated) { newValue |= decoration.GetIntValue(); } decoration.SetIntValue(newValue, eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { PRBool noshade = PR_FALSE; const nsAttrValue* colorValue = aAttributes->GetAttr(nsGkAtoms::color); nscolor color; PRBool colorIsSet = colorValue && colorValue->GetColorValue(color); if (aData->mSIDs & (NS_STYLE_INHERIT_BIT(Position) | NS_STYLE_INHERIT_BIT(Border))) { if (colorIsSet) { noshade = PR_TRUE; } else { noshade = !!aAttributes->GetAttr(nsGkAtoms::noshade); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Margin)) { // align: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) { // Map align attribute into auto side margins nsCSSRect& margin = aData->mMarginData->mMargin; switch (value->GetEnumValue()) { case NS_STYLE_TEXT_ALIGN_LEFT: if (margin.mLeft.GetUnit() == eCSSUnit_Null) margin.mLeft.SetFloatValue(0.0f, eCSSUnit_Pixel); if (margin.mRight.GetUnit() == eCSSUnit_Null) margin.mRight.SetAutoValue(); break; case NS_STYLE_TEXT_ALIGN_RIGHT: if (margin.mLeft.GetUnit() == eCSSUnit_Null) margin.mLeft.SetAutoValue(); if (margin.mRight.GetUnit() == eCSSUnit_Null) margin.mRight.SetFloatValue(0.0f, eCSSUnit_Pixel); break; case NS_STYLE_TEXT_ALIGN_CENTER: if (margin.mLeft.GetUnit() == eCSSUnit_Null) margin.mLeft.SetAutoValue(); if (margin.mRight.GetUnit() == eCSSUnit_Null) margin.mRight.SetAutoValue(); break; } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // width: integer, percent if (aData->mPositionData->mWidth.GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (value && value->Type() == nsAttrValue::eInteger) { aData->mPositionData->mWidth.SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); } else if (value && value->Type() == nsAttrValue::ePercent) { aData->mPositionData->mWidth.SetPercentValue(value->GetPercentValue()); } } if (aData->mPositionData->mHeight.GetUnit() == eCSSUnit_Null) { // size: integer if (noshade) { // noshade case: size is set using the border aData->mPositionData->mHeight.SetAutoValue(); } else { // normal case // the height includes the top and bottom borders that are initially 1px. // for size=1, html.css has a special case rule that makes this work by // removing all but the top border. const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::size); if (value && value->Type() == nsAttrValue::eInteger) { aData->mPositionData->mHeight.SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); } // else use default value from html.css } } } if ((aData->mSIDs & NS_STYLE_INHERIT_BIT(Border)) && noshade) { // if not noshade, border styles are dealt with by html.css // size: integer // if a size is set, use half of it per side, otherwise, use 1px per side float sizePerSide; PRBool allSides = PR_TRUE; const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::size); if (value && value->Type() == nsAttrValue::eInteger) { sizePerSide = (float)value->GetIntegerValue() / 2.0f; if (sizePerSide < 1.0f) { // XXX When the pixel bug is fixed, all the special casing for // subpixel borders should be removed. // In the meantime, this makes http://www.microsoft.com/ look right. sizePerSide = 1.0f; allSides = PR_FALSE; } } else { sizePerSide = 1.0f; // default to a 2px high line } nsCSSRect& borderWidth = aData->mMarginData->mBorderWidth; if (borderWidth.mTop.GetUnit() == eCSSUnit_Null) { borderWidth.mTop.SetFloatValue(sizePerSide, eCSSUnit_Pixel); } if (allSides) { if (borderWidth.mRight.GetUnit() == eCSSUnit_Null) { borderWidth.mRight.SetFloatValue(sizePerSide, eCSSUnit_Pixel); } if (borderWidth.mBottom.GetUnit() == eCSSUnit_Null) { borderWidth.mBottom.SetFloatValue(sizePerSide, eCSSUnit_Pixel); } if (borderWidth.mLeft.GetUnit() == eCSSUnit_Null) { borderWidth.mLeft.SetFloatValue(sizePerSide, eCSSUnit_Pixel); } } nsCSSRect& borderStyle = aData->mMarginData->mBorderStyle; if (borderStyle.mTop.GetUnit() == eCSSUnit_Null) { borderStyle.mTop.SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } if (allSides) { if (borderStyle.mRight.GetUnit() == eCSSUnit_Null) { borderStyle.mRight.SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } if (borderStyle.mBottom.GetUnit() == eCSSUnit_Null) { borderStyle.mBottom.SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } if (borderStyle.mLeft.GetUnit() == eCSSUnit_Null) { borderStyle.mLeft.SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } // If it would be noticeable, set the border radius to // 100% on all corners nsCSSCornerSizes& corners = aData->mMarginData->mBorderRadius; NS_FOR_CSS_HALF_CORNERS(hc) { nsCSSValue& dimen = corners.GetHalfCorner(hc); if (dimen.GetUnit() == eCSSUnit_Null) { dimen.SetPercentValue(1.0f); } } } }
void HTMLTableCellElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // width: value nsCSSValue* width = aData->ValueForWidth(); if (width->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (value && value->Type() == nsAttrValue::eInteger) { if (value->GetIntegerValue() > 0) width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); // else 0 implies auto for compatibility. } else if (value && value->Type() == nsAttrValue::ePercent) { if (value->GetPercentValue() > 0.0f) width->SetPercentValue(value->GetPercentValue()); // else 0 implies auto for compatibility } } // height: value nsCSSValue* height = aData->ValueForHeight(); if (height->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height); if (value && value->Type() == nsAttrValue::eInteger) { if (value->GetIntegerValue() > 0) height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); // else 0 implies auto for compatibility. } else if (value && value->Type() == nsAttrValue::ePercent) { if (value->GetPercentValue() > 0.0f) height->SetPercentValue(value->GetPercentValue()); // else 0 implies auto for compatibility } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Text)) { nsCSSValue* textAlign = aData->ValueForTextAlign(); if (textAlign->GetUnit() == eCSSUnit_Null) { // align: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) textAlign->SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } nsCSSValue* whiteSpace = aData->ValueForWhiteSpace(); if (whiteSpace->GetUnit() == eCSSUnit_Null) { // nowrap: enum if (aAttributes->GetAttr(nsGkAtoms::nowrap)) { // See if our width is not a nonzero integer width. const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); nsCompatibility mode = aData->mPresContext->CompatibilityMode(); if (!value || value->Type() != nsAttrValue::eInteger || value->GetIntegerValue() == 0 || eCompatibility_NavQuirks != mode) { whiteSpace->SetIntValue(NS_STYLE_WHITESPACE_NOWRAP, eCSSUnit_Enumerated); } } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(TextReset)) { nsCSSValue* verticalAlign = aData->ValueForVerticalAlign(); if (verticalAlign->GetUnit() == eCSSUnit_Null) { // valign: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::valign); if (value && value->Type() == nsAttrValue::eEnum) verticalAlign->SetIntValue(value->GetEnumValue(), eCSSUnit_Enumerated); } } nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData); nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }
void nsMathMLElement::MapMathMLAttributesInto(const nsMappedAttributes* aAttributes, nsRuleData* aData) { if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Font)) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::scriptsizemultiplier_); if (value && value->Type() == nsAttrValue::eString && aData->mFontData->mScriptSizeMultiplier.GetUnit() == eCSSUnit_Null) { nsAutoString str(value->GetStringValue()); str.CompressWhitespace(); // MathML numbers can't have leading '+' if (str.Length() > 0 && str.CharAt(0) != '+') { PRInt32 errorCode; float floatValue = str.ToFloat(&errorCode); // Negative scriptsizemultipliers are not parsed if (NS_SUCCEEDED(errorCode) && floatValue >= 0.0f) { aData->mFontData->mScriptSizeMultiplier. SetFloatValue(floatValue, eCSSUnit_Number); } } } value = aAttributes->GetAttr(nsGkAtoms::scriptminsize_); if (value && value->Type() == nsAttrValue::eString && aData->mFontData->mScriptMinSize.GetUnit() == eCSSUnit_Null) { ParseNumericValue(value->GetStringValue(), aData->mFontData->mScriptMinSize, 0); } value = aAttributes->GetAttr(nsGkAtoms::scriptlevel_); if (value && value->Type() == nsAttrValue::eString && aData->mFontData->mScriptLevel.GetUnit() == eCSSUnit_Null) { nsAutoString str(value->GetStringValue()); str.CompressWhitespace(); if (str.Length() > 0) { PRInt32 errorCode; PRInt32 intValue = str.ToInteger(&errorCode); if (NS_SUCCEEDED(errorCode)) { // This is kind of cheesy ... if the scriptlevel has a sign, // then it's a relative value and we store the nsCSSValue as an // Integer to indicate that. Otherwise we store it as a Number // to indicate that the scriptlevel is absolute. PRUnichar ch = str.CharAt(0); if (ch == '+' || ch == '-') { aData->mFontData->mScriptLevel.SetIntValue(intValue, eCSSUnit_Integer); } else { aData->mFontData->mScriptLevel.SetFloatValue(intValue, eCSSUnit_Number); } } } } PRBool parseSizeKeywords = PR_TRUE; value = aAttributes->GetAttr(nsGkAtoms::mathsize_); if (!value) { parseSizeKeywords = PR_FALSE; value = aAttributes->GetAttr(nsGkAtoms::fontsize_); } if (value && value->Type() == nsAttrValue::eString && aData->mFontData->mSize.GetUnit() == eCSSUnit_Null) { nsAutoString str(value->GetStringValue()); if (!ParseNumericValue(str, aData->mFontData->mSize, 0) && parseSizeKeywords) { static const char sizes[3][7] = { "small", "normal", "big" }; static const PRInt32 values[NS_ARRAY_LENGTH(sizes)] = { NS_STYLE_FONT_SIZE_SMALL, NS_STYLE_FONT_SIZE_MEDIUM, NS_STYLE_FONT_SIZE_LARGE }; str.CompressWhitespace(); for (PRInt32 i = 0; i < NS_ARRAY_LENGTH(sizes); ++i) { if (str.EqualsASCII(sizes[i])) { aData->mFontData->mSize.SetIntValue(values[i], eCSSUnit_Enumerated); break; } } } } value = aAttributes->GetAttr(nsGkAtoms::fontfamily_); if (value && value->Type() == nsAttrValue::eString && aData->mFontData->mFamily.GetUnit() == eCSSUnit_Null) { aData->mFontData->mFamily.SetStringValue(value->GetStringValue(), eCSSUnit_String); aData->mFontData->mFamilyFromHTML = PR_FALSE; } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Background)) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::mathbackground_); if (!value) { value = aAttributes->GetAttr(nsGkAtoms::background); } if (value && aData->mColorData->mBackColor.GetUnit() == eCSSUnit_Null) { nscolor color; if (value->GetColorValue(color)) { aData->mColorData->mBackColor.SetColorValue(color); } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::mathcolor_); if (!value) { value = aAttributes->GetAttr(nsGkAtoms::color); } nscolor color; if (value && value->GetColorValue(color) && aData->mColorData->mColor.GetUnit() == eCSSUnit_Null) { aData->mColorData->mColor.SetColorValue(color); } } }
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes, nsRuleData* aData) { PRBool noshade = PR_FALSE; const nsAttrValue* colorValue = aAttributes->GetAttr(nsGkAtoms::color); nscolor color; PRBool colorIsSet = colorValue && colorValue->GetColorValue(color); if (aData->mSIDs & (NS_STYLE_INHERIT_BIT(Position) | NS_STYLE_INHERIT_BIT(Border))) { if (colorIsSet) { noshade = PR_TRUE; } else { noshade = !!aAttributes->GetAttr(nsGkAtoms::noshade); } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Margin)) { // align: enum const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) { // Map align attribute into auto side margins nsCSSValue* marginLeft = aData->ValueForMarginLeftValue(); nsCSSValue* marginRight = aData->ValueForMarginRightValue(); switch (value->GetEnumValue()) { case NS_STYLE_TEXT_ALIGN_LEFT: if (marginLeft->GetUnit() == eCSSUnit_Null) marginLeft->SetFloatValue(0.0f, eCSSUnit_Pixel); if (marginRight->GetUnit() == eCSSUnit_Null) marginRight->SetAutoValue(); break; case NS_STYLE_TEXT_ALIGN_RIGHT: if (marginLeft->GetUnit() == eCSSUnit_Null) marginLeft->SetAutoValue(); if (marginRight->GetUnit() == eCSSUnit_Null) marginRight->SetFloatValue(0.0f, eCSSUnit_Pixel); break; case NS_STYLE_TEXT_ALIGN_CENTER: if (marginLeft->GetUnit() == eCSSUnit_Null) marginLeft->SetAutoValue(); if (marginRight->GetUnit() == eCSSUnit_Null) marginRight->SetAutoValue(); break; } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)) { // width: integer, percent nsCSSValue* width = aData->ValueForWidth(); if (width->GetUnit() == eCSSUnit_Null) { const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width); if (value && value->Type() == nsAttrValue::eInteger) { width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); } else if (value && value->Type() == nsAttrValue::ePercent) { width->SetPercentValue(value->GetPercentValue()); } } nsCSSValue* height = aData->ValueForHeight(); if (height->GetUnit() == eCSSUnit_Null) { // size: integer if (noshade) { // noshade case: size is set using the border height->SetAutoValue(); } else { // normal case // the height includes the top and bottom borders that are initially 1px. // for size=1, html.css has a special case rule that makes this work by // removing all but the top border. const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::size); if (value && value->Type() == nsAttrValue::eInteger) { height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel); } // else use default value from html.css } } } if ((aData->mSIDs & NS_STYLE_INHERIT_BIT(Border)) && noshade) { // if not noshade, border styles are dealt with by html.css // size: integer // if a size is set, use half of it per side, otherwise, use 1px per side float sizePerSide; PRBool allSides = PR_TRUE; const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::size); if (value && value->Type() == nsAttrValue::eInteger) { sizePerSide = (float)value->GetIntegerValue() / 2.0f; if (sizePerSide < 1.0f) { // XXX When the pixel bug is fixed, all the special casing for // subpixel borders should be removed. // In the meantime, this makes http://www.microsoft.com/ look right. sizePerSide = 1.0f; allSides = PR_FALSE; } } else { sizePerSide = 1.0f; // default to a 2px high line } nsCSSValue* borderTopWidth = aData->ValueForBorderTopWidth(); if (borderTopWidth->GetUnit() == eCSSUnit_Null) { borderTopWidth->SetFloatValue(sizePerSide, eCSSUnit_Pixel); } if (allSides) { nsCSSValue* borderRightWidth = aData->ValueForBorderRightWidthValue(); if (borderRightWidth->GetUnit() == eCSSUnit_Null) { borderRightWidth->SetFloatValue(sizePerSide, eCSSUnit_Pixel); } nsCSSValue* borderBottomWidth = aData->ValueForBorderBottomWidth(); if (borderBottomWidth->GetUnit() == eCSSUnit_Null) { borderBottomWidth->SetFloatValue(sizePerSide, eCSSUnit_Pixel); } nsCSSValue* borderLeftWidth = aData->ValueForBorderLeftWidthValue(); if (borderLeftWidth->GetUnit() == eCSSUnit_Null) { borderLeftWidth->SetFloatValue(sizePerSide, eCSSUnit_Pixel); } } nsCSSValue* borderTopStyle = aData->ValueForBorderTopStyle(); if (borderTopStyle->GetUnit() == eCSSUnit_Null) { borderTopStyle->SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } if (allSides) { nsCSSValue* borderRightStyle = aData->ValueForBorderRightStyleValue(); if (borderRightStyle->GetUnit() == eCSSUnit_Null) { borderRightStyle->SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } nsCSSValue* borderBottomStyle = aData->ValueForBorderBottomStyle(); if (borderBottomStyle->GetUnit() == eCSSUnit_Null) { borderBottomStyle->SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } nsCSSValue* borderLeftStyle = aData->ValueForBorderLeftStyleValue(); if (borderLeftStyle->GetUnit() == eCSSUnit_Null) { borderLeftStyle->SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated); } // If it would be noticeable, set the border radius to // 10000px on all corners; this triggers the clamping to make // circular ends. This assumes the <hr> isn't larger than // that in *both* dimensions. for (const nsCSSProperty* props = nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_radius); *props != eCSSProperty_UNKNOWN; ++props) { nsCSSValue* dimen = aData->ValueFor(*props); if (dimen->GetUnit() == eCSSUnit_Null) { dimen->SetFloatValue(10000.0f, eCSSUnit_Pixel); } } } } if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) { // color: a color // (we got the color attribute earlier) nsCSSValue* colorValue = aData->ValueForColor(); if (colorIsSet && colorValue->GetUnit() == eCSSUnit_Null && aData->mPresContext->UseDocumentColors()) { colorValue->SetColorValue(color); } } nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData); }