summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLTableCellElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/html/HTMLTableCellElement.cpp')
-rw-r--r--Source/WebCore/html/HTMLTableCellElement.cpp95
1 files changed, 62 insertions, 33 deletions
diff --git a/Source/WebCore/html/HTMLTableCellElement.cpp b/Source/WebCore/html/HTMLTableCellElement.cpp
index ccfbf27bc..c096dcf6c 100644
--- a/Source/WebCore/html/HTMLTableCellElement.cpp
+++ b/Source/WebCore/html/HTMLTableCellElement.cpp
@@ -25,40 +25,48 @@
#include "config.h"
#include "HTMLTableCellElement.h"
-#include "Attribute.h"
#include "CSSPropertyNames.h"
#include "CSSValueKeywords.h"
#include "HTMLNames.h"
+#include "HTMLParserIdioms.h"
#include "HTMLTableElement.h"
#include "RenderTableCell.h"
namespace WebCore {
-// Clamp rowspan at 8k to match Firefox.
-static const int maxRowspan = 8190;
-
using namespace HTMLNames;
-inline HTMLTableCellElement::HTMLTableCellElement(const QualifiedName& tagName, Document& document)
+Ref<HTMLTableCellElement> HTMLTableCellElement::create(const QualifiedName& tagName, Document& document)
+{
+ return adoptRef(*new HTMLTableCellElement(tagName, document));
+}
+
+HTMLTableCellElement::HTMLTableCellElement(const QualifiedName& tagName, Document& document)
: HTMLTablePartElement(tagName, document)
{
+ ASSERT(tagName == thTag || tagName == tdTag);
+}
+
+unsigned HTMLTableCellElement::colSpan() const
+{
+ return std::max(1u, colSpanForBindings());
}
-PassRefPtr<HTMLTableCellElement> HTMLTableCellElement::create(const QualifiedName& tagName, Document& document)
+unsigned HTMLTableCellElement::colSpanForBindings() const
{
- return adoptRef(new HTMLTableCellElement(tagName, document));
+ return limitToOnlyHTMLNonNegative(attributeWithoutSynchronization(colspanAttr), 1u);
}
-int HTMLTableCellElement::colSpan() const
+unsigned HTMLTableCellElement::rowSpan() const
{
- const AtomicString& colSpanValue = fastGetAttribute(colspanAttr);
- return std::max(1, colSpanValue.toInt());
+ static const unsigned maxRowspan = 8190;
+ // FIXME: a rowSpan equal to 0 should be allowed, and mean that the cell is to span all the remaining rows in the row group.
+ return std::max(1u, std::min(rowSpanForBindings(), maxRowspan));
}
-int HTMLTableCellElement::rowSpan() const
+unsigned HTMLTableCellElement::rowSpanForBindings() const
{
- const AtomicString& rowSpanValue = fastGetAttribute(rowspanAttr);
- return std::max(1, std::min(rowSpanValue.toInt(), maxRowspan));
+ return limitToOnlyHTMLNonNegative(attributeWithoutSynchronization(rowspanAttr), 1u);
}
int HTMLTableCellElement::cellIndex() const
@@ -105,16 +113,16 @@ void HTMLTableCellElement::collectStyleForPresentationAttribute(const QualifiedN
void HTMLTableCellElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
{
if (name == rowspanAttr) {
- if (renderer() && renderer()->isTableCell())
- toRenderTableCell(renderer())->colSpanOrRowSpanChanged();
+ if (is<RenderTableCell>(renderer()))
+ downcast<RenderTableCell>(*renderer()).colSpanOrRowSpanChanged();
} else if (name == colspanAttr) {
- if (renderer() && renderer()->isTableCell())
- toRenderTableCell(renderer())->colSpanOrRowSpanChanged();
+ if (is<RenderTableCell>(renderer()))
+ downcast<RenderTableCell>(*renderer()).colSpanOrRowSpanChanged();
} else
HTMLTablePartElement::parseAttribute(name, value);
}
-const StyleProperties* HTMLTableCellElement::additionalPresentationAttributeStyle()
+const StyleProperties* HTMLTableCellElement::additionalPresentationAttributeStyle() const
{
if (HTMLTableElement* table = findParentTable())
return table->additionalCellStyle();
@@ -128,53 +136,74 @@ bool HTMLTableCellElement::isURLAttribute(const Attribute& attribute) const
String HTMLTableCellElement::abbr() const
{
- return fastGetAttribute(abbrAttr);
+ return attributeWithoutSynchronization(abbrAttr);
}
String HTMLTableCellElement::axis() const
{
- return fastGetAttribute(axisAttr);
+ return attributeWithoutSynchronization(axisAttr);
}
-void HTMLTableCellElement::setColSpan(int n)
+void HTMLTableCellElement::setColSpanForBindings(unsigned n)
{
- setIntegralAttribute(colspanAttr, n);
+ setAttributeWithoutSynchronization(colspanAttr, AtomicString::number(limitToOnlyHTMLNonNegative(n, 1)));
}
String HTMLTableCellElement::headers() const
{
- return fastGetAttribute(headersAttr);
+ return attributeWithoutSynchronization(headersAttr);
+}
+
+void HTMLTableCellElement::setRowSpanForBindings(unsigned n)
+{
+ setAttributeWithoutSynchronization(rowspanAttr, AtomicString::number(limitToOnlyHTMLNonNegative(n, 1)));
}
-void HTMLTableCellElement::setRowSpan(int n)
+const AtomicString& HTMLTableCellElement::scope() const
{
- setIntegralAttribute(rowspanAttr, n);
+ // https://html.spec.whatwg.org/multipage/tables.html#attr-th-scope
+ static NeverDestroyed<const AtomicString> row("row", AtomicString::ConstructFromLiteral);
+ static NeverDestroyed<const AtomicString> col("col", AtomicString::ConstructFromLiteral);
+ static NeverDestroyed<const AtomicString> rowgroup("rowgroup", AtomicString::ConstructFromLiteral);
+ static NeverDestroyed<const AtomicString> colgroup("colgroup", AtomicString::ConstructFromLiteral);
+
+ const AtomicString& value = attributeWithoutSynchronization(HTMLNames::scopeAttr);
+
+ if (equalIgnoringASCIICase(value, row))
+ return row;
+ if (equalIgnoringASCIICase(value, col))
+ return col;
+ if (equalIgnoringASCIICase(value, rowgroup))
+ return rowgroup;
+ if (equalIgnoringASCIICase(value, colgroup))
+ return colgroup;
+ return emptyAtom;
}
-String HTMLTableCellElement::scope() const
+void HTMLTableCellElement::setScope(const AtomicString& scope)
{
- return fastGetAttribute(scopeAttr);
+ setAttributeWithoutSynchronization(scopeAttr, scope);
}
void HTMLTableCellElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
{
HTMLTablePartElement::addSubresourceAttributeURLs(urls);
- addSubresourceURL(urls, document().completeURL(getAttribute(backgroundAttr)));
+ addSubresourceURL(urls, document().completeURL(attributeWithoutSynchronization(backgroundAttr)));
}
HTMLTableCellElement* HTMLTableCellElement::cellAbove() const
{
- auto cellRenderer = renderer();
- if (!cellRenderer || !cellRenderer->isTableCell())
+ auto* cellRenderer = renderer();
+ if (!is<RenderTableCell>(cellRenderer))
return nullptr;
- auto tableCellRenderer = toRenderTableCell(cellRenderer);
- auto cellAboveRenderer = tableCellRenderer->table()->cellAbove(tableCellRenderer);
+ auto& tableCellRenderer = downcast<RenderTableCell>(*cellRenderer);
+ auto* cellAboveRenderer = tableCellRenderer.table()->cellAbove(&tableCellRenderer);
if (!cellAboveRenderer)
return nullptr;
- return toHTMLTableCellElement(cellAboveRenderer->element());
+ return downcast<HTMLTableCellElement>(cellAboveRenderer->element());
}
} // namespace WebCore