summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLTableRowElement.cpp
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
commit881da28418d380042aa95a97f0cbd42560a64f7c (patch)
treea794dff3274695e99c651902dde93d934ea7a5af /Source/WebCore/html/HTMLTableRowElement.cpp
parent7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff)
parent0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff)
downloadqtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
Diffstat (limited to 'Source/WebCore/html/HTMLTableRowElement.cpp')
-rw-r--r--Source/WebCore/html/HTMLTableRowElement.cpp124
1 files changed, 54 insertions, 70 deletions
diff --git a/Source/WebCore/html/HTMLTableRowElement.cpp b/Source/WebCore/html/HTMLTableRowElement.cpp
index 2a6ed24bb..766bd0c31 100644
--- a/Source/WebCore/html/HTMLTableRowElement.cpp
+++ b/Source/WebCore/html/HTMLTableRowElement.cpp
@@ -26,137 +26,121 @@
#include "HTMLTableRowElement.h"
#include "ExceptionCode.h"
-#include "HTMLCollection.h"
+#include "GenericCachedHTMLCollection.h"
#include "HTMLNames.h"
-#include "HTMLTableCellElement.h"
+#include "HTMLTableDataCellElement.h"
#include "HTMLTableElement.h"
#include "HTMLTableSectionElement.h"
#include "NodeList.h"
+#include "NodeRareData.h"
#include "Text.h"
namespace WebCore {
using namespace HTMLNames;
-HTMLTableRowElement::HTMLTableRowElement(const QualifiedName& tagName, Document* document)
+HTMLTableRowElement::HTMLTableRowElement(const QualifiedName& tagName, Document& document)
: HTMLTablePartElement(tagName, document)
{
ASSERT(hasTagName(trTag));
}
-PassRefPtr<HTMLTableRowElement> HTMLTableRowElement::create(Document* document)
+Ref<HTMLTableRowElement> HTMLTableRowElement::create(Document& document)
{
- return adoptRef(new HTMLTableRowElement(trTag, document));
+ return adoptRef(*new HTMLTableRowElement(trTag, document));
}
-PassRefPtr<HTMLTableRowElement> HTMLTableRowElement::create(const QualifiedName& tagName, Document* document)
+Ref<HTMLTableRowElement> HTMLTableRowElement::create(const QualifiedName& tagName, Document& document)
{
- return adoptRef(new HTMLTableRowElement(tagName, document));
+ return adoptRef(*new HTMLTableRowElement(tagName, document));
}
int HTMLTableRowElement::rowIndex() const
{
- ContainerNode* table = parentNode();
- if (!table)
+ auto* parent = parentNode();
+ if (!parent)
return -1;
- table = table->parentNode();
- if (!table || !isHTMLTableElement(table))
- return -1;
-
- // To match Firefox, the row indices work like this:
- // Rows from the first <thead> are numbered before all <tbody> rows.
- // Rows from the first <tfoot> are numbered after all <tbody> rows.
- // Rows from other <thead> and <tfoot> elements don't get row indices at all.
-
- int rIndex = 0;
- if (HTMLTableSectionElement* head = toHTMLTableElement(table)->tHead()) {
- for (Node *row = head->firstChild(); row; row = row->nextSibling()) {
- if (row == this)
- return rIndex;
- if (row->hasTagName(trTag))
- ++rIndex;
- }
- }
-
- for (Node *node = table->firstChild(); node; node = node->nextSibling()) {
- if (node->hasTagName(tbodyTag)) {
- HTMLTableSectionElement* section = static_cast<HTMLTableSectionElement*>(node);
- for (Node* row = section->firstChild(); row; row = row->nextSibling()) {
- if (row == this)
- return rIndex;
- if (row->hasTagName(trTag))
- ++rIndex;
- }
- }
+ HTMLTableElement* table;
+ if (is<HTMLTableElement>(*parent))
+ table = downcast<HTMLTableElement>(parent);
+ else {
+ if (!is<HTMLTableSectionElement>(*parent) || !is<HTMLTableElement>(parent->parentNode()))
+ return -1;
+ table = downcast<HTMLTableElement>(parent->parentNode());
}
- if (HTMLTableSectionElement* foot = toHTMLTableElement(table)->tFoot()) {
- for (Node *row = foot->firstChild(); row; row = row->nextSibling()) {
- if (row == this)
- return rIndex;
- if (row->hasTagName(trTag))
- ++rIndex;
- }
+ auto rows = table->rows();
+ unsigned length = rows->length();
+ for (unsigned i = 0; i < length; ++i) {
+ if (rows->item(i) == this)
+ return i;
}
- // We get here for rows that are in <thead> or <tfoot> sections other than the main header and footer.
return -1;
}
int HTMLTableRowElement::sectionRowIndex() const
{
- int rIndex = 0;
- const Node *n = this;
- do {
- n = n->previousSibling();
- if (n && n->hasTagName(trTag))
- rIndex++;
+ auto* parent = parentNode();
+ if (!parent)
+ return -1;
+
+ RefPtr<HTMLCollection> rows;
+ if (is<HTMLTableSectionElement>(*parent))
+ rows = downcast<HTMLTableSectionElement>(*parent).rows();
+ else if (is<HTMLTableElement>(*parent))
+ rows = downcast<HTMLTableElement>(*parent).rows();
+ else
+ return -1;
+
+ unsigned length = rows->length();
+ for (unsigned i = 0; i < length; ++i) {
+ if (rows->item(i) == this)
+ return i;
}
- while (n);
- return rIndex;
+ return -1;
}
-PassRefPtr<HTMLElement> HTMLTableRowElement::insertCell(int index, ExceptionCode& ec)
+RefPtr<HTMLTableCellElement> HTMLTableRowElement::insertCell(int index, ExceptionCode& ec)
{
- RefPtr<HTMLCollection> children = cells();
- int numCells = children ? children->length() : 0;
+ Ref<HTMLCollection> children = cells();
+ int numCells = children->length();
if (index < -1 || index > numCells) {
ec = INDEX_SIZE_ERR;
- return 0;
+ return nullptr;
}
- RefPtr<HTMLTableCellElement> cell = HTMLTableCellElement::create(tdTag, document());
+ auto cell = HTMLTableDataCellElement::create(document());
if (index < 0 || index >= numCells)
- appendChild(cell, ec);
+ appendChild(cell.copyRef(), ec);
else {
Node* n;
if (index < 1)
n = firstChild();
else
n = children->item(index);
- insertBefore(cell, n, ec);
+ insertBefore(cell.copyRef(), n, ec);
}
- return cell.release();
+ return WTFMove(cell);
}
void HTMLTableRowElement::deleteCell(int index, ExceptionCode& ec)
{
- RefPtr<HTMLCollection> children = cells();
- int numCells = children ? children->length() : 0;
+ Ref<HTMLCollection> children = cells();
+ int numCells = children->length();
if (index == -1)
index = numCells-1;
- if (index >= 0 && index < numCells) {
- RefPtr<Node> cell = children->item(index);
- HTMLElement::removeChild(cell.get(), ec);
- } else
+ if (index >= 0 && index < numCells)
+ HTMLElement::removeChild(*children->item(index), ec);
+ else
ec = INDEX_SIZE_ERR;
}
-PassRefPtr<HTMLCollection> HTMLTableRowElement::cells()
+Ref<HTMLCollection> HTMLTableRowElement::cells()
{
- return ensureCachedHTMLCollection(TRCells);
+ return ensureRareData().ensureNodeLists().addCachedCollection<GenericCachedHTMLCollection<CollectionTypeTraits<TRCells>::traversalType>>(*this, TRCells);
}
void HTMLTableRowElement::setCells(HTMLCollection*, ExceptionCode& ec)