diff options
Diffstat (limited to 'dom/html/HTMLLIElement.cpp')
-rw-r--r-- | dom/html/HTMLLIElement.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/dom/html/HTMLLIElement.cpp b/dom/html/HTMLLIElement.cpp new file mode 100644 index 0000000000..46022baee2 --- /dev/null +++ b/dom/html/HTMLLIElement.cpp @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/dom/HTMLLIElement.h" +#include "mozilla/dom/HTMLLIElementBinding.h" + +#include "mozilla/MappedDeclarations.h" +#include "nsAttrValueInlines.h" +#include "nsGkAtoms.h" +#include "nsStyleConsts.h" +#include "nsMappedAttributes.h" + +NS_IMPL_NS_NEW_HTML_ELEMENT(LI) + +namespace mozilla::dom { + +HTMLLIElement::~HTMLLIElement() = default; + +NS_IMPL_ELEMENT_CLONE(HTMLLIElement) + +// values that are handled case-insensitively +static const nsAttrValue::EnumTable kUnorderedListItemTypeTable[] = { + {"disc", ListStyle::Disc}, + {"circle", ListStyle::Circle}, + {"round", ListStyle::Circle}, + {"square", ListStyle::Square}, + {nullptr, 0}}; + +// values that are handled case-sensitively +static const nsAttrValue::EnumTable kOrderedListItemTypeTable[] = { + {"A", ListStyle::UpperAlpha}, {"a", ListStyle::LowerAlpha}, + {"I", ListStyle::UpperRoman}, {"i", ListStyle::LowerRoman}, + {"1", ListStyle::Decimal}, {nullptr, 0}}; + +bool HTMLLIElement::ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute, + const nsAString& aValue, + nsIPrincipal* aMaybeScriptedPrincipal, + nsAttrValue& aResult) { + if (aNamespaceID == kNameSpaceID_None) { + if (aAttribute == nsGkAtoms::type) { + return aResult.ParseEnumValue(aValue, kOrderedListItemTypeTable, true) || + aResult.ParseEnumValue(aValue, kUnorderedListItemTypeTable, false); + } + if (aAttribute == nsGkAtoms::value) { + return aResult.ParseIntValue(aValue); + } + } + + return nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue, + aMaybeScriptedPrincipal, aResult); +} + +void HTMLLIElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, + MappedDeclarations& aDecls) { + if (!aDecls.PropertyIsSet(eCSSProperty_list_style_type)) { + // type: enum + const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::type); + if (value && value->Type() == nsAttrValue::eEnum) + aDecls.SetKeywordValue(eCSSProperty_list_style_type, + value->GetEnumValue()); + } + + // Map <li value=INTEGER> to 'counter-set: list-item INTEGER'. + const nsAttrValue* attrVal = aAttributes->GetAttr(nsGkAtoms::value); + if (attrVal && attrVal->Type() == nsAttrValue::eInteger) { + if (!aDecls.PropertyIsSet(eCSSProperty_counter_set)) { + aDecls.SetCounterSetListItem(attrVal->GetIntegerValue()); + } + } + + nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aDecls); +} + +NS_IMETHODIMP_(bool) +HTMLLIElement::IsAttributeMapped(const nsAtom* aAttribute) const { + static const MappedAttributeEntry attributes[] = { + {nsGkAtoms::type}, + {nsGkAtoms::value}, + {nullptr}, + }; + + static const MappedAttributeEntry* const map[] = { + attributes, + sCommonAttributeMap, + }; + + return FindAttributeDependence(aAttribute, map); +} + +nsMapRuleToAttributesFunc HTMLLIElement::GetAttributeMappingFunction() const { + return &MapAttributesIntoRule; +} + +JSObject* HTMLLIElement::WrapNode(JSContext* aCx, + JS::Handle<JSObject*> aGivenProto) { + return HTMLLIElement_Binding::Wrap(aCx, this, aGivenProto); +} + +} // namespace mozilla::dom |