1 /* 2 * Copyright (C) 1997 Martin Jones (mjones (at) kde.org) 3 * (C) 1997 Torben Weis (weis (at) kde.org) 4 * (C) 1998 Waldo Bastian (bastian (at) kde.org) 5 * (C) 1999 Lars Knoll (knoll (at) kde.org) 6 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 7 * Copyright (C) 2003, 2004, 2005, 2006, 2009, 2013 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 #ifndef RenderTableRow_h 26 #define RenderTableRow_h 27 28 #include "core/rendering/RenderTableSection.h" 29 30 namespace blink { 31 32 static const unsigned unsetRowIndex = 0x7FFFFFFF; 33 static const unsigned maxRowIndex = 0x7FFFFFFE; // 2,147,483,646 34 35 class RenderTableRow FINAL : public RenderBox { 36 public: 37 explicit RenderTableRow(Element*); 38 virtual void trace(Visitor*) OVERRIDE; 39 40 RenderTableCell* firstCell() const; 41 RenderTableCell* lastCell() const; 42 43 RenderTableRow* previousRow() const; 44 RenderTableRow* nextRow() const; 45 46 const RenderObjectChildList* children() const { return &m_children; } 47 RenderObjectChildList* children() { return &m_children; } 48 49 RenderTableSection* section() const { return toRenderTableSection(parent()); } 50 RenderTable* table() const { return toRenderTable(parent()->parent()); } 51 52 static RenderTableRow* createAnonymous(Document*); 53 static RenderTableRow* createAnonymousWithParentRenderer(const RenderObject*); 54 virtual RenderBox* createAnonymousBoxWithSameTypeAs(const RenderObject* parent) const OVERRIDE 55 { 56 return createAnonymousWithParentRenderer(parent); 57 } 58 59 void setRowIndex(unsigned rowIndex) 60 { 61 if (UNLIKELY(rowIndex > maxRowIndex)) 62 CRASH(); 63 64 m_rowIndex = rowIndex; 65 } 66 67 bool rowIndexWasSet() const { return m_rowIndex != unsetRowIndex; } 68 unsigned rowIndex() const 69 { 70 ASSERT(rowIndexWasSet()); 71 ASSERT(!section() || !section()->needsCellRecalc()); // index may be bogus if cells need recalc. 72 return m_rowIndex; 73 } 74 75 const BorderValue& borderAdjoiningTableStart() const 76 { 77 if (section()->hasSameDirectionAs(table())) 78 return style()->borderStart(); 79 80 return style()->borderEnd(); 81 } 82 83 const BorderValue& borderAdjoiningTableEnd() const 84 { 85 if (section()->hasSameDirectionAs(table())) 86 return style()->borderEnd(); 87 88 return style()->borderStart(); 89 } 90 91 const BorderValue& borderAdjoiningStartCell(const RenderTableCell*) const; 92 const BorderValue& borderAdjoiningEndCell(const RenderTableCell*) const; 93 94 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE; 95 96 private: 97 virtual RenderObjectChildList* virtualChildren() OVERRIDE { return children(); } 98 virtual const RenderObjectChildList* virtualChildren() const OVERRIDE { return children(); } 99 100 virtual const char* renderName() const OVERRIDE { return (isAnonymous() || isPseudoElement()) ? "RenderTableRow (anonymous)" : "RenderTableRow"; } 101 102 virtual bool isTableRow() const OVERRIDE { return true; } 103 104 virtual void willBeRemovedFromTree() OVERRIDE; 105 106 virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE; 107 virtual void layout() OVERRIDE; 108 109 virtual LayerType layerTypeRequired() const OVERRIDE 110 { 111 if (hasTransform() || hasHiddenBackface() || hasClipPath() || createsGroup() || style()->shouldCompositeForCurrentAnimations()) 112 return NormalLayer; 113 114 if (hasOverflowClip()) 115 return OverflowClipLayer; 116 117 return NoLayer; 118 } 119 120 virtual void paint(PaintInfo&, const LayoutPoint&) OVERRIDE; 121 122 virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) OVERRIDE; 123 124 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE; 125 126 void nextSibling() const WTF_DELETED_FUNCTION; 127 void previousSibling() const WTF_DELETED_FUNCTION; 128 129 RenderObjectChildList m_children; 130 unsigned m_rowIndex : 31; 131 }; 132 133 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderTableRow, isTableRow()); 134 135 inline RenderTableRow* RenderTableRow::previousRow() const 136 { 137 return toRenderTableRow(RenderObject::previousSibling()); 138 } 139 140 inline RenderTableRow* RenderTableRow::nextRow() const 141 { 142 return toRenderTableRow(RenderObject::nextSibling()); 143 } 144 145 inline RenderTableRow* RenderTableSection::firstRow() const 146 { 147 ASSERT(children() == virtualChildren()); 148 return toRenderTableRow(children()->firstChild()); 149 } 150 151 inline RenderTableRow* RenderTableSection::lastRow() const 152 { 153 ASSERT(children() == virtualChildren()); 154 return toRenderTableRow(children()->lastChild()); 155 } 156 157 } // namespace blink 158 159 #endif // RenderTableRow_h 160