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)
7d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2009, 2013 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 RenderTableSection_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RenderTableSection_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTable.h"
2902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/Vector.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// This variable is used to balance the memory consumption vs the paint invalidation time on big tables.
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciconst float gMaxAllowedOverflowingCellRatioForFastPaintPath = 0.1f;
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum CollapsedBorderSide {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CBSBefore,
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CBSAfter,
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CBSStart,
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CBSEnd
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Helper class for paintObject.
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CellSpan {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CellSpan(unsigned start, unsigned end)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_start(start)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_end(end)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned start() const { return m_start; }
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned end() const { return m_end; }
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned& start() { return m_start; }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned& end() { return m_end; }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_start;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_end;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCell;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableRow;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class RenderTableSection FINAL : public RenderBox {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderTableSection(Element*);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~RenderTableSection();
70e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderTableRow* firstRow() const;
73d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RenderTableRow* lastRow() const;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderObjectChildList* children() const { return &m_children; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObjectChildList* children() { return &m_children; }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int firstLineBoxBaseline() const OVERRIDE;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addCell(RenderTableCell*, RenderTableRow* row);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int calcRowLogicalHeight();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void layoutRows();
8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void computeOverflowFromCells();
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTable* table() const { return toRenderTable(parent()); }
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
90e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    typedef WillBeHeapVector<RawPtrWillBeMember<RenderTableCell>, 2> SpanningRenderTableCells;
91591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct CellStruct {
93e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        ALLOW_ONLY_INLINE_ALLOCATION();
94e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    public:
95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        WillBeHeapVector<RawPtrWillBeMember<RenderTableCell>, 1> cells;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool inColSpan; // true for columns after the first in a colspan
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CellStruct()
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : inColSpan(false)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
102e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        void trace(Visitor*);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderTableCell* primaryCell()
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
106e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return hasCells() ? cells[cells.size() - 1].get() : 0;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const RenderTableCell* primaryCell() const
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
111e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return hasCells() ? cells[cells.size() - 1].get() : 0;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool hasCells() const { return cells.size() > 0; }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    typedef WillBeHeapVector<CellStruct> Row;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct RowStruct {
120e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        ALLOW_ONLY_INLINE_ALLOCATION();
121e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    public:
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RowStruct()
123e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            : rowRenderer(nullptr)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , baseline()
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
127e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        void trace(Visitor*);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Row row;
130e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        RawPtrWillBeMember<RenderTableRow> rowRenderer;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit baseline;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Length logicalHeight;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    struct SpanningRowsHeight {
1367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        WTF_MAKE_NONCOPYABLE(SpanningRowsHeight);
1377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    public:
1397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        SpanningRowsHeight()
1407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            : totalRowsHeight(0)
1417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            , spanningCellHeightIgnoringBorderSpacing(0)
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            , isAnyRowWithOnlySpanningCells(false)
1437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        {
1447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        }
1457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        Vector<int> rowHeight;
1477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        int totalRowsHeight;
1487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        int spanningCellHeightIgnoringBorderSpacing;
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool isAnyRowWithOnlySpanningCells;
1507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    };
1517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BorderValue& borderAdjoiningTableStart() const
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hasSameDirectionAs(table()))
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->borderStart();
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->borderEnd();
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BorderValue& borderAdjoiningTableEnd() const
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (hasSameDirectionAs(table()))
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return style()->borderEnd();
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return style()->borderStart();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BorderValue& borderAdjoiningStartCell(const RenderTableCell*) const;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BorderValue& borderAdjoiningEndCell(const RenderTableCell*) const;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderTableCell* firstRowCellAdjoiningTableStart() const;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderTableCell* firstRowCellAdjoiningTableEnd() const;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CellStruct& cellAt(unsigned row,  unsigned col) { return m_grid[row].row[col]; }
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const CellStruct& cellAt(unsigned row, unsigned col) const { return m_grid[row].row[col]; }
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderTableCell* primaryCellAt(unsigned row, unsigned col)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CellStruct& c = m_grid[row].row[col];
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return c.primaryCell();
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RenderTableRow* rowRendererAt(unsigned row) const { return m_grid[row].rowRenderer; }
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void appendColumn(unsigned pos);
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void splitColumn(unsigned pos, unsigned first);
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum BlockBorderSide { BorderBefore, BorderAfter };
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int calcBlockDirectionOuterBorder(BlockBorderSide) const;
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    enum InlineBorderSide { BorderStart, BorderEnd };
19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    int calcInlineDirectionOuterBorder(InlineBorderSide) const;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcOuterBorder();
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderBefore() const { return m_outerBorderBefore; }
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderAfter() const { return m_outerBorderAfter; }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderStart() const { return m_outerBorderStart; }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int outerBorderEnd() const { return m_outerBorderEnd; }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned numRows() const { return m_grid.size(); }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned numColumns() const;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcCells();
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcCellsIfNeeded()
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_needsCellRecalc)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            recalcCells();
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool needsCellRecalc() const { return m_needsCellRecalc; }
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNeedsCellRecalc();
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit rowBaseline(unsigned row) { return m_grid[row].baseline; }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void rowLogicalHeightChanged(RenderTableRow*);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeCachedCollapsedBorders(const RenderTableCell*);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCachedCollapsedBorder(const RenderTableCell*, CollapsedBorderSide, CollapsedBorderValue);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CollapsedBorderValue& cachedCollapsedBorder(const RenderTableCell*, CollapsedBorderSide);
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // distributeExtraLogicalHeightToRows methods return the *consumed* extra logical height.
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: We may want to introduce a structure holding the in-flux layout information.
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int distributeExtraLogicalHeightToRows(int extraLogicalHeight);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static RenderTableSection* createAnonymousWithParentRenderer(const RenderObject*);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderBox* createAnonymousBoxWithSameTypeAs(const RenderObject* parent) const OVERRIDE
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return createAnonymousWithParentRenderer(parent);
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void paint(PaintInfo&, const LayoutPoint&) OVERRIDE;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Flip the rect so it aligns with the coordinates used by the rowPos and columnPos vectors.
2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LayoutRect logicalRectForWritingModeAndDirection(const LayoutRect&) const;
2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    CellSpan dirtiedRows(const LayoutRect& paintInvalidationRect) const;
2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    CellSpan dirtiedColumns(const LayoutRect& paintInvalidationRect) const;
2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WillBeHeapHashSet<RawPtrWillBeMember<RenderTableCell> >& overflowingCells() { return m_overflowingCells; }
2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool hasMultipleCellLevels() { return m_hasMultipleCellLevels; }
2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
240d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
24309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual RenderObjectChildList* virtualChildren() OVERRIDE { return children(); }
24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual const RenderObjectChildList* virtualChildren() const OVERRIDE { return children(); }
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual const char* renderName() const OVERRIDE { return (isAnonymous() || isPseudoElement()) ? "RenderTableSection (anonymous)" : "RenderTableSection"; }
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isTableSection() const OVERRIDE { return true; }
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void willBeRemovedFromTree() OVERRIDE;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void layout() OVERRIDE;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void paintObject(PaintInfo&, const LayoutPoint&) OVERRIDE;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) OVERRIDE;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
258591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    int borderSpacingForRow(unsigned row) const { return m_grid[row].rowRenderer ? table()->vBorderSpacing() : 0; }
259591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void ensureRows(unsigned);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool rowHasOnlySpanningCells(unsigned);
26306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    unsigned calcRowHeightHavingOnlySpanningCells(unsigned);
26406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    void updateRowsHeightHavingOnlySpanningCells(RenderTableCell*, struct SpanningRowsHeight&);
26506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool isHeightNeededForRowHavingOnlySpanningCells(unsigned);
26606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
2677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    void populateSpanningRowsHeightFromCell(RenderTableCell*, struct SpanningRowsHeight&);
2687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    void distributeExtraRowSpanHeightToPercentRows(RenderTableCell*, int, int&, Vector<int>&);
2699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    void distributeWholeExtraRowSpanHeightToPercentRows(RenderTableCell*, int, int&, Vector<int>&);
2707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    void distributeExtraRowSpanHeightToAutoRows(RenderTableCell*, int, int&, Vector<int>&);
2717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    void distributeExtraRowSpanHeightToRemainingRows(RenderTableCell*, int, int&, Vector<int>&);
272591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells);
273591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void distributeExtraLogicalHeightToPercentRows(int& extraLogicalHeight, int totalPercent);
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void distributeExtraLogicalHeightToAutoRows(int& extraLogicalHeight, unsigned autoRowsCount);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void distributeRemainingExtraLogicalHeight(int& extraLogicalHeight);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
278591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void updateBaselineForCell(RenderTableCell*, unsigned row, LayoutUnit& baselineDescent);
279591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasOverflowingCell() const { return m_overflowingCells.size() || m_forceSlowPaintPathWithOverflowingCell; }
2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
28253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void computeOverflowFromCells(unsigned totalRows, unsigned nEffCols);
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CellSpan fullTableRowSpan() const { return CellSpan(0, m_grid.size()); }
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CellSpan fullTableColumnSpan() const { return CellSpan(0, table()->columns().size()); }
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These two functions take a rectangle as input that has been flipped by logicalRectForWritingModeAndDirection.
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The returned span of rows or columns is end-exclusive, and empty if start==end.
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CellSpan spannedRows(const LayoutRect& flippedRect) const;
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CellSpan spannedColumns(const LayoutRect& flippedRect) const;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setLogicalPositionForCell(RenderTableCell*, unsigned effectiveColumn) const;
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObjectChildList m_children;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
296e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WillBeHeapVector<RowStruct> m_grid;
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<int> m_rowPos;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the current insertion position
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_cCol;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_cRow;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_outerBorderStart;
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_outerBorderEnd;
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_outerBorderBefore;
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_outerBorderAfter;
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_needsCellRecalc;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This HashSet holds the overflowing cells for faster painting.
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have more than gMaxAllowedOverflowingCellRatio * total cells, it will be empty
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and m_forceSlowPaintPathWithOverflowingCell will be set to save memory.
313e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WillBeHeapHashSet<RawPtrWillBeMember<RenderTableCell> > m_overflowingCells;
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_forceSlowPaintPathWithOverflowingCell;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasMultipleCellLevels;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This map holds the collapsed border values for cells with collapsed borders.
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It is held at RenderTableSection level to spare memory consumption by table cells.
320e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WillBeHeapHashMap<pair<RawPtrWillBeMember<const RenderTableCell>, int>, CollapsedBorderValue > m_cellsCollapsedBorders;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
323bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderTableSection, isTableSection());
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
327e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)namespace WTF {
328e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
329e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#if ENABLE(OILPAN)
330e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)template<> struct VectorTraits<blink::RenderTableSection::CellStruct> : VectorTraitsBase<blink::RenderTableSection::CellStruct> {
331e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    static const bool needsDestruction = false;
332e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)};
333e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)template<> struct VectorTraits<blink::RenderTableSection::RowStruct> : VectorTraitsBase<blink::RenderTableSection::RowStruct> {
334e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    static const bool needsDestruction = false;
335e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)};
336e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#endif
337e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
338e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
339e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RenderTableSection_h
341