tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit ade4bbd47beeb455b4fbb60f2cc4930ffff37a22
parent 32de7fcb43cf6614e23873240cfe3cb55e85a784
Author: agoloman <agoloman@mozilla.com>
Date:   Tue,  6 Jan 2026 04:23:53 +0200

Revert "Bug 2008335 - Refactor HTML align attribute values and CSS property mappings. r=layout-reviewers,emilio" for causing wpt failures.

This reverts commit 8b60f09bd9bd59d437f2acae123da8efaabe96c8.

Diffstat:
Mdom/html/HTMLTableCellElement.cpp | 4++--
Mdom/html/HTMLTableColElement.cpp | 4++--
Mdom/html/HTMLTableElement.cpp | 16+++++++++++++++-
Mdom/html/HTMLTableRowElement.cpp | 4++--
Mdom/html/HTMLTableSectionElement.cpp | 4++--
Mdom/html/nsGenericHTMLElement.cpp | 281++++++++++++++++++++++++++++---------------------------------------------------
Mdom/html/nsGenericHTMLElement.h | 17++---------------
7 files changed, 125 insertions(+), 205 deletions(-)

diff --git a/dom/html/HTMLTableCellElement.cpp b/dom/html/HTMLTableCellElement.cpp @@ -178,8 +178,8 @@ void HTMLTableCellElement::MapAttributesIntoRule( } } - nsGenericHTMLElement::MapTableCellHAlignAttributeInto(aBuilder); - nsGenericHTMLElement::MapTableVAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapDivAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapVAlignAttributeInto(aBuilder); nsGenericHTMLElement::MapBackgroundAttributesInto(aBuilder); nsGenericHTMLElement::MapCommonAttributesInto(aBuilder); } diff --git a/dom/html/HTMLTableColElement.cpp b/dom/html/HTMLTableColElement.cpp @@ -74,8 +74,8 @@ void HTMLTableColElement::MapAttributesIntoRule( } nsGenericHTMLElement::MapWidthAttributeInto(aBuilder); - nsGenericHTMLElement::MapTableCellHAlignAttributeInto(aBuilder); - nsGenericHTMLElement::MapTableVAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapDivAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapVAlignAttributeInto(aBuilder); nsGenericHTMLElement::MapCommonAttributesInto(aBuilder); } diff --git a/dom/html/HTMLTableElement.cpp b/dom/html/HTMLTableElement.cpp @@ -860,6 +860,21 @@ void HTMLTableElement::MapAttributesIntoRule( aBuilder.SetPixelValue(eCSSProperty_border_spacing, float(value->GetIntegerValue())); } + // align; Check for enumerated type (it may be another type if + // illegal) + value = aBuilder.GetAttr(nsGkAtoms::align); + if (value && value->Type() == nsAttrValue::eEnum) { + uint8_t enumValue = value->GetEnumValue(); + + if (enumValue == uint8_t(StyleTextAlign::Center)) { + aBuilder.SetAutoValueIfUnset(eCSSProperty_margin_left); + aBuilder.SetAutoValueIfUnset(eCSSProperty_margin_right); + } else if (enumValue == uint8_t(StyleTextAlign::Left)) { + aBuilder.SetKeywordValue(eCSSProperty_float, StyleFloat::Left); + } else if (enumValue == uint8_t(StyleTextAlign::Right)) { + aBuilder.SetKeywordValue(eCSSProperty_float, StyleFloat::Right); + } + } // bordercolor value = aBuilder.GetAttr(nsGkAtoms::bordercolor); @@ -890,7 +905,6 @@ void HTMLTableElement::MapAttributesIntoRule( (float)borderThickness); } - nsGenericHTMLElement::MapTableHAlignAttributeInto(aBuilder); nsGenericHTMLElement::MapImageSizeAttributesInto(aBuilder); nsGenericHTMLElement::MapBackgroundAttributesInto(aBuilder); nsGenericHTMLElement::MapCommonAttributesInto(aBuilder); diff --git a/dom/html/HTMLTableRowElement.cpp b/dom/html/HTMLTableRowElement.cpp @@ -222,8 +222,8 @@ bool HTMLTableRowElement::ParseAttribute(int32_t aNamespaceID, void HTMLTableRowElement::MapAttributesIntoRule( MappedDeclarationsBuilder& aBuilder) { nsGenericHTMLElement::MapHeightAttributeInto(aBuilder); - nsGenericHTMLElement::MapTableCellHAlignAttributeInto(aBuilder); - nsGenericHTMLElement::MapTableVAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapDivAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapVAlignAttributeInto(aBuilder); nsGenericHTMLElement::MapBackgroundAttributesInto(aBuilder); nsGenericHTMLElement::MapCommonAttributesInto(aBuilder); } diff --git a/dom/html/HTMLTableSectionElement.cpp b/dom/html/HTMLTableSectionElement.cpp @@ -150,8 +150,8 @@ void HTMLTableSectionElement::MapAttributesIntoRule( (float)value->GetIntegerValue()); } } - nsGenericHTMLElement::MapTableCellHAlignAttributeInto(aBuilder); - nsGenericHTMLElement::MapTableVAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapDivAlignAttributeInto(aBuilder); + nsGenericHTMLElement::MapVAlignAttributeInto(aBuilder); nsGenericHTMLElement::MapBackgroundAttributesInto(aBuilder); nsGenericHTMLElement::MapCommonAttributesInto(aBuilder); } diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp @@ -1103,33 +1103,13 @@ nsMapRuleToAttributesFunc nsGenericHTMLElement::GetAttributeMappingFunction() return &MapCommonAttributesInto; } -// Represents a possible value for the "align" attribute. Different -// elements may support different subsets of these values and map -// them into different CSS properties. -enum class HTMLAlignValue : uint8_t { - Left, - Right, - Top, - Middle, - Bottom, - Center, - Baseline, - TextTop, - AbsMiddle, - AbsCenter, - AbsBottom, - Justify, -}; - -// clang-format off static constexpr nsAttrValue::EnumTableEntry kDivAlignTable[] = { - {"left", HTMLAlignValue::Left}, - {"right", HTMLAlignValue::Right}, - {"center", HTMLAlignValue::Center}, - {"middle", HTMLAlignValue::Middle}, - {"justify", HTMLAlignValue::Justify}, + {"left", StyleTextAlign::MozLeft}, + {"right", StyleTextAlign::MozRight}, + {"center", StyleTextAlign::MozCenter}, + {"middle", StyleTextAlign::MozCenter}, + {"justify", StyleTextAlign::Justify}, }; -// clang-format on static constexpr nsAttrValue::EnumTableEntry kFrameborderTable[] = { {"yes", FrameBorderProperty::Yes}, @@ -1157,31 +1137,62 @@ static constexpr nsAttrValue::EnumTableEntry kTableVAlignTable[] = { }; static constexpr nsAttrValue::EnumTableEntry kAlignTable[] = { - {"left", HTMLAlignValue::Left}, - {"right", HTMLAlignValue::Right}, - {"top", HTMLAlignValue::Top}, - {"middle", HTMLAlignValue::Middle}, - {"bottom", HTMLAlignValue::Bottom}, - {"center", HTMLAlignValue::Center}, - {"baseline", HTMLAlignValue::Baseline}, - {"texttop", HTMLAlignValue::TextTop}, - {"absmiddle", HTMLAlignValue::AbsMiddle}, - {"abscenter", HTMLAlignValue::AbsCenter}, - {"absbottom", HTMLAlignValue::AbsBottom}, + {"left", StyleTextAlign::Left}, + {"right", StyleTextAlign::Right}, + + {"top", StyleVerticalAlignKeyword::Top}, + {"middle", StyleVerticalAlignKeyword::MozMiddleWithBaseline}, + + // Intentionally not bottom. + {"bottom", StyleVerticalAlignKeyword::Baseline}, + + {"center", StyleVerticalAlignKeyword::MozMiddleWithBaseline}, + {"baseline", StyleVerticalAlignKeyword::Baseline}, + + {"texttop", StyleVerticalAlignKeyword::TextTop}, + {"absmiddle", StyleVerticalAlignKeyword::Middle}, + {"abscenter", StyleVerticalAlignKeyword::Middle}, + {"absbottom", StyleVerticalAlignKeyword::Bottom}, }; bool nsGenericHTMLElement::ParseAlignValue(const nsAString& aString, nsAttrValue& aResult) { + static_assert(uint8_t(StyleTextAlign::Left) != + uint8_t(StyleVerticalAlignKeyword::Top) && + uint8_t(StyleTextAlign::Left) != + uint8_t(StyleVerticalAlignKeyword::MozMiddleWithBaseline) && + uint8_t(StyleTextAlign::Left) != + uint8_t(StyleVerticalAlignKeyword::Baseline) && + uint8_t(StyleTextAlign::Left) != + uint8_t(StyleVerticalAlignKeyword::TextTop) && + uint8_t(StyleTextAlign::Left) != + uint8_t(StyleVerticalAlignKeyword::Middle) && + uint8_t(StyleTextAlign::Left) != + uint8_t(StyleVerticalAlignKeyword::Bottom)); + + static_assert(uint8_t(StyleTextAlign::Right) != + uint8_t(StyleVerticalAlignKeyword::Top) && + uint8_t(StyleTextAlign::Right) != + uint8_t(StyleVerticalAlignKeyword::MozMiddleWithBaseline) && + uint8_t(StyleTextAlign::Right) != + uint8_t(StyleVerticalAlignKeyword::Baseline) && + uint8_t(StyleTextAlign::Right) != + uint8_t(StyleVerticalAlignKeyword::TextTop) && + uint8_t(StyleTextAlign::Right) != + uint8_t(StyleVerticalAlignKeyword::Middle) && + uint8_t(StyleTextAlign::Right) != + uint8_t(StyleVerticalAlignKeyword::Bottom)); + return aResult.ParseEnumValue(aString, kAlignTable, false); } //---------------------------------------- static constexpr nsAttrValue::EnumTableEntry kTableHAlignTable[] = { - {"left", HTMLAlignValue::Left}, - {"right", HTMLAlignValue::Right}, - {"center", HTMLAlignValue::Center}, - {"justify", HTMLAlignValue::Justify}, + {"left", StyleTextAlign::Left}, + {"right", StyleTextAlign::Right}, + {"center", StyleTextAlign::Center}, + {"justify", StyleTextAlign::Justify}, }; bool nsGenericHTMLElement::ParseTableHAlignValue(const nsAString& aString, @@ -1193,12 +1204,12 @@ bool nsGenericHTMLElement::ParseTableHAlignValue(const nsAString& aString, // This table is used for td, th, tr, col, thead, tbody and tfoot. static constexpr nsAttrValue::EnumTableEntry kTableCellHAlignTable[] = { - {"left", HTMLAlignValue::Left}, - {"right", HTMLAlignValue::Right}, - {"center", HTMLAlignValue::Center}, - {"justify", HTMLAlignValue::Justify}, - {"middle", HTMLAlignValue::Middle}, - {"absmiddle", HTMLAlignValue::AbsMiddle}, + {"left", StyleTextAlign::MozLeft}, + {"right", StyleTextAlign::MozRight}, + {"center", StyleTextAlign::MozCenter}, + {"justify", StyleTextAlign::Justify}, + {"middle", StyleTextAlign::MozCenter}, + {"absmiddle", StyleTextAlign::Center}, }; bool nsGenericHTMLElement::ParseTableCellHAlignValue(const nsAString& aString, @@ -1389,153 +1400,61 @@ void nsGenericHTMLElement::MapImageAlignAttributeInto( MappedDeclarationsBuilder& aBuilder) { const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::align); if (value && value->Type() == nsAttrValue::eEnum) { - switch (HTMLAlignValue(value->GetEnumValue())) { - case HTMLAlignValue::Left: + int32_t align = value->GetEnumValue(); + if (!aBuilder.PropertyIsSet(eCSSProperty_float)) { + if (align == uint8_t(StyleTextAlign::Left)) { aBuilder.SetKeywordValue(eCSSProperty_float, StyleFloat::Left); - break; - case HTMLAlignValue::Right: + } else if (align == uint8_t(StyleTextAlign::Right)) { aBuilder.SetKeywordValue(eCSSProperty_float, StyleFloat::Right); - break; - case HTMLAlignValue::TextTop: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::TextTop); - break; - case HTMLAlignValue::Top: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Top); - break; - case HTMLAlignValue::Middle: - case HTMLAlignValue::Center: - aBuilder.SetKeywordValue( - eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::MozMiddleWithBaseline); - break; - case HTMLAlignValue::AbsMiddle: - case HTMLAlignValue::AbsCenter: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Middle); - break; - case HTMLAlignValue::AbsBottom: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Bottom); - break; - case HTMLAlignValue::Bottom: // Intentionally mapped to `baseline` - case HTMLAlignValue::Baseline: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Baseline); - break; - default: - MOZ_ASSERT_UNREACHABLE("Unexpected align value"); - break; - } - } -} - -void nsGenericHTMLElement::MapDivAlignAttributeInto( - MappedDeclarationsBuilder& aBuilder) { - const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::align); - if (value && value->Type() == nsAttrValue::eEnum) { - switch (HTMLAlignValue(value->GetEnumValue())) { - case HTMLAlignValue::Left: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::MozLeft); - break; - case HTMLAlignValue::Right: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::MozRight); - break; - case HTMLAlignValue::Center: - case HTMLAlignValue::Middle: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::MozCenter); - break; - case HTMLAlignValue::Justify: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::Justify); - break; - default: - MOZ_ASSERT_UNREACHABLE("Unexpected align value"); - break; + } } - } -} - -void nsGenericHTMLElement::MapTableVAlignAttributeInto( - MappedDeclarationsBuilder& aBuilder) { - const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::valign); - if (value && value->Type() == nsAttrValue::eEnum) { - switch (TableCellAlignment(value->GetEnumValue())) { - case TableCellAlignment::Top: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Top); - break; - case TableCellAlignment::Middle: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Middle); - break; - case TableCellAlignment::Bottom: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Bottom); - break; - case TableCellAlignment::Baseline: - aBuilder.SetKeywordValue(eCSSProperty_vertical_align, - StyleVerticalAlignKeyword::Baseline); - break; + if (!aBuilder.PropertyIsSet(eCSSProperty_vertical_align)) { + switch (align) { + case uint8_t(StyleTextAlign::Left): + case uint8_t(StyleTextAlign::Right): + break; + default: + aBuilder.SetKeywordValue(eCSSProperty_vertical_align, align); + break; + } } } } -void nsGenericHTMLElement::MapTableHAlignAttributeInto( +void nsGenericHTMLElement::MapDivAlignAttributeInto( MappedDeclarationsBuilder& aBuilder) { - const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::align); - if (value && value->Type() == nsAttrValue::eEnum) { - switch (HTMLAlignValue(value->GetEnumValue())) { - case HTMLAlignValue::Center: - aBuilder.SetAutoValueIfUnset(eCSSProperty_margin_left); - aBuilder.SetAutoValueIfUnset(eCSSProperty_margin_right); - break; - case HTMLAlignValue::Left: - aBuilder.SetKeywordValue(eCSSProperty_float, StyleFloat::Left); - break; - case HTMLAlignValue::Right: - aBuilder.SetKeywordValue(eCSSProperty_float, StyleFloat::Right); - break; - default: - MOZ_ASSERT_UNREACHABLE("Unexpected align value"); - break; - } + if (!aBuilder.PropertyIsSet(eCSSProperty_text_align)) { + // align: enum + const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::align); + if (value && value->Type() == nsAttrValue::eEnum) + aBuilder.SetKeywordValue(eCSSProperty_text_align, value->GetEnumValue()); } } -void nsGenericHTMLElement::MapTableCellHAlignAttributeInto( +void nsGenericHTMLElement::MapVAlignAttributeInto( MappedDeclarationsBuilder& aBuilder) { - const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::align); - if (value && value->Type() == nsAttrValue::eEnum) { - switch (HTMLAlignValue(value->GetEnumValue())) { - case HTMLAlignValue::Left: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::MozLeft); - break; - case HTMLAlignValue::Right: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::MozRight); - break; - case HTMLAlignValue::Center: - case HTMLAlignValue::Middle: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::MozCenter); - break; - case HTMLAlignValue::AbsMiddle: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::Center); - break; - case HTMLAlignValue::Justify: - aBuilder.SetKeywordValue(eCSSProperty_text_align, - StyleTextAlign::Justify); - break; - default: - MOZ_ASSERT_UNREACHABLE("Unexpected align value"); - break; + if (!aBuilder.PropertyIsSet(eCSSProperty_vertical_align)) { + // align: enum + const nsAttrValue* value = aBuilder.GetAttr(nsGkAtoms::valign); + if (value && value->Type() == nsAttrValue::eEnum) { + switch (static_cast<TableCellAlignment>(value->GetEnumValue())) { + case TableCellAlignment::Top: + aBuilder.SetKeywordValue(eCSSProperty_vertical_align, + StyleVerticalAlignKeyword::Top); + break; + case TableCellAlignment::Middle: + aBuilder.SetKeywordValue(eCSSProperty_vertical_align, + StyleVerticalAlignKeyword::Middle); + break; + case TableCellAlignment::Bottom: + aBuilder.SetKeywordValue(eCSSProperty_vertical_align, + StyleVerticalAlignKeyword::Bottom); + break; + case TableCellAlignment::Baseline: + aBuilder.SetKeywordValue(eCSSProperty_vertical_align, + StyleVerticalAlignKeyword::Baseline); + break; + } } } } diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h @@ -544,23 +544,10 @@ class nsGenericHTMLElement : public nsGenericHTMLElementBase { static void MapDivAlignAttributeInto(mozilla::MappedDeclarationsBuilder&); /** - * Helper to map the valign attribute for various table elements. + * Helper to map the valign attribute for things like <col>, <tr>, <section>. * @see GetAttributeMappingFunction */ - static void MapTableVAlignAttributeInto(mozilla::MappedDeclarationsBuilder&); - - /** - * Helper to map the align attribute for <table>. - * @see GetAttributeMappingFunction - */ - static void MapTableHAlignAttributeInto(mozilla::MappedDeclarationsBuilder&); - - /** - * Helper to map the align attribute for various table elements. - * @see GetAttributeMappingFunction - */ - static void MapTableCellHAlignAttributeInto( - mozilla::MappedDeclarationsBuilder&); + static void MapVAlignAttributeInto(mozilla::MappedDeclarationsBuilder&); /** * Helper to map the image border attribute.