diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
commit | 881da28418d380042aa95a97f0cbd42560a64f7c (patch) | |
tree | a794dff3274695e99c651902dde93d934ea7a5af /Source/WebCore/html/HTMLTableRowElement.cpp | |
parent | 7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff) | |
parent | 0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff) | |
download | qtwebkit-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.cpp | 124 |
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) |