15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1997 Martin Jones (mjones@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1997 Torben Weis (weis@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1998 Waldo Bastian (bastian@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Lars Knoll (knoll@kde.org)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010 Apple Inc. All rights reserved.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef RenderTable_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RenderTable_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSPropertyNames.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBlock.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/CollapsedBorderValue.h"
3102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/Vector.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCol;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCaption;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCell;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableSection;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TableLayout;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum SkipEmptySectionsValue { DoNotSkipEmptySections, SkipEmptySections };
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class RenderTable FINAL : public RenderBlock {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    explicit RenderTable(Element*);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~RenderTable();
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Per CSS 3 writing-mode: "The first and second values of the 'border-spacing' property represent spacing between columns
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and rows respectively, not necessarily the horizontal and vertical spacing respectively".
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int hBorderSpacing() const { return m_hSpacing; }
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int vBorderSpacing() const { return m_vSpacing; }
5202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool collapseBorders() const { return style()->borderCollapse(); }
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderStart() const { return m_borderStart; }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderEnd() const { return m_borderEnd; }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderBefore() const;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderAfter() const;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderLeft() const
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isLeftToRightDirection() ? borderStart() : borderEnd();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isFlippedBlocksWritingMode() ? borderAfter() : borderBefore();
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderRight() const
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isLeftToRightDirection() ? borderEnd() : borderStart();
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isFlippedBlocksWritingMode() ? borderBefore() : borderAfter();
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderTop() const
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isFlippedBlocksWritingMode() ? borderAfter() : borderBefore();
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isLeftToRightDirection() ? borderStart() : borderEnd();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderBottom() const
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isFlippedBlocksWritingMode() ? borderBefore() : borderAfter();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isLeftToRightDirection() ? borderEnd() : borderStart();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    Color bgColor() const { return resolveColor(CSSPropertyBackgroundColor); }
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderBefore() const;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderAfter() const;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderStart() const;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderEnd() const;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderLeft() const
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isLeftToRightDirection() ? outerBorderStart() : outerBorderEnd();
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isFlippedBlocksWritingMode() ? outerBorderAfter() : outerBorderBefore();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderRight() const
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isLeftToRightDirection() ? outerBorderEnd() : outerBorderStart();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isFlippedBlocksWritingMode() ? outerBorderBefore() : outerBorderAfter();
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderTop() const
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isFlippedBlocksWritingMode() ? outerBorderAfter() : outerBorderBefore();
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isLeftToRightDirection() ? outerBorderStart() : outerBorderEnd();
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderBottom() const
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style()->isHorizontalWritingMode())
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->isFlippedBlocksWritingMode() ? outerBorderBefore() : outerBorderAfter();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->isLeftToRightDirection() ? outerBorderEnd() : outerBorderStart();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int calcBorderStart() const;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int calcBorderEnd() const;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcBordersInRowDirection();
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct ColumnStruct {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        explicit ColumnStruct(unsigned initialSpan = 1)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : span(initialSpan)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned span;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void forceSectionsRecalc()
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsSectionRecalc();
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        recalcSections();
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<ColumnStruct>& columns() const { return m_columns; }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<int>& columnPositions() const { return m_columnPos; }
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setColumnPosition(unsigned index, int position)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Note that if our horizontal border-spacing changed, our position will change but not
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // our column's width. In practice, horizontal border-spacing won't change often.
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_columnLogicalWidthChanged |= m_columnPos[index] != position;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_columnPos[index] = position;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* header() const { return m_head; }
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* footer() const { return m_foot; }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* firstBody() const { return m_firstBody; }
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This function returns 0 if the table has no section.
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* topSection() const;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* bottomSection() const;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This function returns 0 if the table has no non-empty sections.
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* topNonEmptySection() const;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned lastColumnIndex() const { return numEffCols() - 1; }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void splitColumn(unsigned position, unsigned firstSpan);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void appendColumn(unsigned span);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned numEffCols() const { return m_columns.size(); }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned spanOfEffCol(unsigned effCol) const { return m_columns[effCol].span; }
17102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned colToEffCol(unsigned column) const
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned effColumn = 0;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned numColumns = numEffCols();
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned c = 0; effColumn < numColumns && c + m_columns[effColumn].span - 1 < column; ++effColumn)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c += m_columns[effColumn].span;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return effColumn;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned effColToCol(unsigned effCol) const
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned c = 0;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < effCol; i++)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c += m_columns[i].span;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return c;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit borderSpacingInRowDirection() const
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (unsigned effectiveColumnCount = numEffCols())
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return static_cast<LayoutUnit>(effectiveColumnCount + 1) * hBorderSpacing();
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Override paddingStart/End to return pixel values to match behavor of RenderTableCell.
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual LayoutUnit paddingEnd() const OVERRIDE { return static_cast<int>(RenderBlock::paddingEnd()); }
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual LayoutUnit paddingStart() const OVERRIDE { return static_cast<int>(RenderBlock::paddingStart()); }
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit bordersPaddingAndSpacingInRowDirection() const
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // 'border-spacing' only applies to separate borders (see 17.6.1 The separated borders model).
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderStart() + borderEnd() + (collapseBorders() ? LayoutUnit() : (paddingStart() + paddingEnd() + borderSpacingInRowDirection()));
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return the first column or column-group.
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCol* firstColumn() const;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCol* colElement(unsigned col, bool* startEdge = 0, bool* endEdge = 0) const
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The common case is to not have columns, make that case fast.
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_hasColElements)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return slowColElement(col, startEdge, endEdge);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool needsSectionRecalc() const { return m_needsSectionRecalc; }
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNeedsSectionRecalc()
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (documentBeingDestroyed())
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_needsSectionRecalc = true;
224d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch        setNeedsLayout();
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* sectionAbove(const RenderTableSection*, SkipEmptySectionsValue = DoNotSkipEmptySections) const;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableSection* sectionBelow(const RenderTableSection*, SkipEmptySectionsValue = DoNotSkipEmptySections) const;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCell* cellAbove(const RenderTableCell*) const;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCell* cellBelow(const RenderTableCell*) const;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCell* cellBefore(const RenderTableCell*) const;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCell* cellAfter(const RenderTableCell*) const;
23402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef Vector<CollapsedBorderValue> CollapsedBorderValues;
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateCollapsedBorders()
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_collapsedBordersValid = false;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_collapsedBorders.clear();
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const CollapsedBorderValue* currentBorderValue() const { return m_currentBorder; }
24202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasSections() const { return m_head || m_foot || m_firstBody; }
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcSectionsIfNeeded() const
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_needsSectionRecalc)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            recalcSections();
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static RenderTable* createAnonymousWithParentRenderer(const RenderObject*);
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderBox* createAnonymousBoxWithSameTypeAs(const RenderObject* parent) const OVERRIDE
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return createAnonymousWithParentRenderer(parent);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BorderValue& tableStartBorderAdjoiningCell(const RenderTableCell*) const;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BorderValue& tableEndBorderAdjoiningCell(const RenderTableCell*) const;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addCaption(const RenderTableCaption*);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeCaption(const RenderTableCaption*);
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addColumn(const RenderTableCol*);
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeColumn(const RenderTableCol*);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
26753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void simplifiedNormalFlowLayout();
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual const char* renderName() const { return "RenderTable"; }
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isTable() const { return true; }
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool avoidsFloats() const { return true; }
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void paint(PaintInfo&, const LayoutPoint&);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void paintObject(PaintInfo&, const LayoutPoint&);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void paintBoxDecorations(PaintInfo&, const LayoutPoint&);
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void paintMask(PaintInfo&, const LayoutPoint&);
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void layout();
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void computeIntrinsicLogicalWidths(LayoutUnit& minWidth, LayoutUnit& maxWidth) const OVERRIDE;
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void computePreferredLogicalWidths() OVERRIDE;
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const OVERRIDE;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int firstLineBoxBaseline() const OVERRIDE;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int inlineBlockBaseline(LineDirectionMode) const OVERRIDE;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCol* slowColElement(unsigned col, bool* startEdge, bool* endEdge) const;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateColumnCache() const;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateCachedColumns();
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderBlock* firstLineBlock() const;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updateFirstLetter();
29602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updateLogicalWidth() OVERRIDE;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit convertStyleLogicalWidthToComputedWidth(const Length& styleLogicalWidth, LayoutUnit availableWidth);
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutUnit convertStyleLogicalHeightToComputedHeight(const Length& styleLogicalHeight);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual LayoutRect overflowClipRect(const LayoutPoint& location, RenderRegion*, OverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void addOverflowFromChildren();
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void subtractCaptionRect(LayoutRect&) const;
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcCollapsedBorders();
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcSections() const;
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void layoutCaption(RenderTableCaption*);
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void distributeExtraLogicalHeight(int extraLogicalHeight);
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable Vector<int> m_columnPos;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable Vector<ColumnStruct> m_columns;
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable Vector<RenderTableCaption*> m_captions;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable Vector<RenderTableCol*> m_columnRenderers;
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable RenderTableSection* m_head;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable RenderTableSection* m_foot;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable RenderTableSection* m_firstBody;
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<TableLayout> m_tableLayout;
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CollapsedBorderValues m_collapsedBorders;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const CollapsedBorderValue* m_currentBorder;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_collapsedBordersValid : 1;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable bool m_hasColElements : 1;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable bool m_needsSectionRecalc : 1;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_columnLogicalWidthChanged : 1;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable bool m_columnRenderersValid: 1;
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    short m_hSpacing;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    short m_vSpacing;
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_borderStart;
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_borderEnd;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline RenderTableSection* RenderTable::topSection() const
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!needsSectionRecalc());
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_head)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_head;
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_firstBody)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_firstBody;
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_foot;
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline RenderTable* toRenderTable(RenderObject* object)
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isTable());
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<RenderTable*>(object);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const RenderTable* toRenderTable(const RenderObject* object)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isTable());
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<const RenderTable*>(object);
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This will catch anyone doing an unnecessary cast.
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void toRenderTable(const RenderTable*);
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RenderTable_h
369