1/*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
18 *
19 * You should have received a copy of the GNU Library General Public License
20 * along with this library; see the file COPYING.LIB. If not, write to
21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, USA.
23 */
24
25#include "config.h"
26#include "HTMLTableSectionElement.h"
27
28#include "GenericCachedHTMLCollection.h"
29#include "HTMLCollection.h"
30#include "HTMLNames.h"
31#include "HTMLTableRowElement.h"
32#include "HTMLTableElement.h"
33#include "NodeList.h"
34#include "NodeRareData.h"
35#include "Text.h"
36#include <wtf/IsoMallocInlines.h>
37
38namespace WebCore {
39
40WTF_MAKE_ISO_ALLOCATED_IMPL(HTMLTableSectionElement);
41
42using namespace HTMLNames;
43
44inline HTMLTableSectionElement::HTMLTableSectionElement(const QualifiedName& tagName, Document& document)
45 : HTMLTablePartElement(tagName, document)
46{
47}
48
49Ref<HTMLTableSectionElement> HTMLTableSectionElement::create(const QualifiedName& tagName, Document& document)
50{
51 return adoptRef(*new HTMLTableSectionElement(tagName, document));
52}
53
54const StyleProperties* HTMLTableSectionElement::additionalPresentationAttributeStyle() const
55{
56 auto table = findParentTable();
57 if (!table)
58 return nullptr;
59 return table->additionalGroupStyle(true);
60}
61
62ExceptionOr<Ref<HTMLElement>> HTMLTableSectionElement::insertRow(int index)
63{
64 if (index < -1)
65 return Exception { IndexSizeError };
66 auto children = rows();
67 int numRows = children->length();
68 if (index > numRows)
69 return Exception { IndexSizeError };
70 auto row = HTMLTableRowElement::create(trTag, document());
71 ExceptionOr<void> result;
72 if (numRows == index || index == -1)
73 result = appendChild(row);
74 else
75 result = insertBefore(row, index < 1 ? firstChild() : children->item(index));
76 if (result.hasException())
77 return result.releaseException();
78 return Ref<HTMLElement> { WTFMove(row) };
79}
80
81ExceptionOr<void> HTMLTableSectionElement::deleteRow(int index)
82{
83 auto children = rows();
84 int numRows = children->length();
85 if (index == -1) {
86 if (!numRows)
87 return { };
88 index = numRows - 1;
89 }
90 if (index < 0 || index >= numRows)
91 return Exception { IndexSizeError };
92 return removeChild(*children->item(index));
93}
94
95int HTMLTableSectionElement::numRows() const
96{
97 auto rows = childrenOfType<HTMLTableRowElement>(*this);
98 return std::distance(rows.begin(), rows.end());
99}
100
101Ref<HTMLCollection> HTMLTableSectionElement::rows()
102{
103 return ensureRareData().ensureNodeLists().addCachedCollection<GenericCachedHTMLCollection<CollectionTypeTraits<TSectionRows>::traversalType>>(*this, TSectionRows);
104}
105
106}
107