18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1997 Martin Jones (mjones@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1997 Torben Weis (weis@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1998 Waldo Bastian (bastian@kde.org)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Lars Knoll (knoll@kde.org)
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTable.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AutoTableLayout.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "CollapsedBorderValue.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DeleteButtonController.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FixedTableLayout.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
3517dcead8ee9edfa8f75e7e2d2284ed3c6f4bd403Grace Kloba#include "HitTestResult.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderLayer.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCell.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableCol.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTableSection.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderView.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTable::RenderTable(Node* node)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : RenderBlock(node)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_caption(0)
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_head(0)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_foot(0)
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_firstBody(0)
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_currentBorder(0)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_hasColElements(false)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_needsSectionRecalc(0)
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_hSpacing(0)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_vSpacing(0)
6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_borderStart(0)
6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    , m_borderEnd(0)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6668513a70bcd92384395513322f1b801e7bf9c729Steve Block    setChildrenInline(false);
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columnPos.fill(0, 2);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns.fill(ColumnStruct(), 1);
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block
708de7ac488df2f39f82e56811541f4847b3f2e952Steve Block#ifdef ANDROID_LAYOUT
718de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    m_singleColumn = false;
728de7ac488df2f39f82e56811541f4847b3f2e952Steve Block#endif
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
75a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochRenderTable::~RenderTable()
76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderTable::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderBlock::styleDidChange(diff, oldStyle);
8205c44efdceb09e0a5066c1f2ae06a5f19fd7fc6cVictoria Lease    propagateStyleToAnonymousChildren();
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ETableLayout oldTableLayout = oldStyle ? oldStyle->tableLayout() : TAUTO;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In the collapsed border model, there is no cell spacing.
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hSpacing = collapseBorders() ? 0 : style()->horizontalBorderSpacing();
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_vSpacing = collapseBorders() ? 0 : style()->verticalBorderSpacing();
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columnPos[0] = m_hSpacing;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_tableLayout || style()->tableLayout() != oldTableLayout) {
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // According to the CSS2 spec, you only use fixed table layout if an
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // explicit width is specified on the table.  Auto width implies auto table layout.
9428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style()->tableLayout() == TFIXED && !style()->logicalWidth().isAuto())
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            m_tableLayout.set(new FixedTableLayout(this));
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            m_tableLayout.set(new AutoTableLayout(this));
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void resetSectionPointerIfNotBefore(RenderTableSection*& ptr, RenderObject* before)
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!before || !ptr)
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* o = before->previousSibling();
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (o && o != ptr)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o = o->previousSibling();
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!o)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ptr = 0;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::addChild(RenderObject* child, RenderObject* beforeChild)
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make sure we don't append things after :after-generated content if we have it.
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!beforeChild && isAfterContent(lastChild()))
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        beforeChild = lastChild();
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool wrapInAnonymousSection = !child->isPositioned();
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (child->isRenderBlock() && child->style()->display() == TABLE_CAPTION) {
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // First caption wins.
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (beforeChild && m_caption) {
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RenderObject* o = beforeChild->previousSibling();
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (o && o != m_caption)
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                o = o->previousSibling();
12654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            if (!o) {
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_caption = 0;
12854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block                setNeedsSectionRecalc();
12954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            }
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_caption)
1328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_caption = toRenderBlock(child);
13354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        else
13454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            setNeedsSectionRecalc();
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wrapInAnonymousSection = false;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (child->isTableCol()) {
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_hasColElements = true;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wrapInAnonymousSection = false;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (child->isTableSection()) {
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (child->style()->display()) {
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_HEADER_GROUP:
1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                resetSectionPointerIfNotBefore(m_head, beforeChild);
1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!m_head) {
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    m_head = toRenderTableSection(child);
1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                } else {
1465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    resetSectionPointerIfNotBefore(m_firstBody, beforeChild);
1475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    if (!m_firstBody)
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        m_firstBody = toRenderTableSection(child);
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                wrapInAnonymousSection = false;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_FOOTER_GROUP:
1535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                resetSectionPointerIfNotBefore(m_foot, beforeChild);
1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!m_foot) {
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    m_foot = toRenderTableSection(child);
1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    wrapInAnonymousSection = false;
1575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    break;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Fall through.
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_ROW_GROUP:
1615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                resetSectionPointerIfNotBefore(m_firstBody, beforeChild);
1625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!m_firstBody)
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    m_firstBody = toRenderTableSection(child);
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                wrapInAnonymousSection = false;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    } else if (child->isTableCell() || child->isTableRow())
1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        wrapInAnonymousSection = true;
1715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    else
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wrapInAnonymousSection = true;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!wrapInAnonymousSection) {
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If the next renderer is actually wrapped in an anonymous table section, we need to go up and find that.
1762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        while (beforeChild && beforeChild->parent() != this)
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            beforeChild = beforeChild->parent();
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        RenderBox::addChild(child, beforeChild);
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!beforeChild && lastChild() && lastChild()->isTableSection() && lastChild()->isAnonymous()) {
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lastChild()->addChild(child);
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* lastBox = beforeChild;
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (lastBox && lastBox->parent()->isAnonymous() && !lastBox->isTableSection() && lastBox->style()->display() != TABLE_CAPTION && lastBox->style()->display() != TABLE_COLUMN_GROUP)
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lastBox = lastBox->parent();
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (lastBox && lastBox->isAnonymous() && !isAfterContent(lastBox)) {
192cad810f21b803229eb11403f9209855525a25d57Steve Block        if (beforeChild == lastBox)
193cad810f21b803229eb11403f9209855525a25d57Steve Block            beforeChild = lastBox->firstChild();
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lastBox->addChild(child, beforeChild);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (beforeChild && !beforeChild->isTableSection() && beforeChild->style()->display() != TABLE_CAPTION && beforeChild->style()->display() != TABLE_COLUMN_GROUP)
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        beforeChild = 0;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* section = new (renderArena()) RenderTableSection(document() /* anonymous */);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<RenderStyle> newStyle = RenderStyle::create();
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newStyle->inheritFrom(style());
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newStyle->setDisplay(TABLE_ROW_GROUP);
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    section->setStyle(newStyle.release());
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addChild(section, beforeChild);
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    section->addChild(child);
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderTable::removeChild(RenderObject* oldChild)
2108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
2118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBox::removeChild(oldChild);
21254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
21354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    if (m_caption && oldChild == m_caption && node())
21454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        node()->setNeedsStyleRecalc();
2158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    setNeedsSectionRecalc();
2168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderTable::computeLogicalWidth()
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT
22123e9dd818a876304304944c844be7625f63383c4Shimeng (Simon) Wang    if (view()->frameView())
22223e9dd818a876304304944c844be7625f63383c4Shimeng (Simon) Wang        setVisibleWidth(view()->frameView()->textWrapWidth());
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
224bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isPositioned())
226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        computePositionedLogicalWidth();
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderBlock* cb = containingBlock();
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int availableLogicalWidth = containingBlockLogicalWidthForContent();
23128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool hasPerpendicularContainingBlock = cb->style()->isHorizontalWritingMode() != style()->isHorizontalWritingMode();
23228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int containerWidthInInlineDirection = hasPerpendicularContainingBlock ? perpendicularContainingBlockLogicalHeight() : availableLogicalWidth;
23328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
23428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    LengthType logicalWidthType = style()->logicalWidth().type();
23528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (logicalWidthType > Relative && style()->logicalWidth().isPositive()) {
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Percent or fixed table
23728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setLogicalWidth(style()->logicalWidth().calcMinValue(containerWidthInInlineDirection));
23828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setLogicalWidth(max(minPreferredLogicalWidth(), logicalWidth()));
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Subtract out any fixed margins from our available width for auto width tables.
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int marginTotal = 0;
24228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (!style()->marginStart().isAuto())
24328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            marginTotal += style()->marginStart().calcValue(availableLogicalWidth);
24428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (!style()->marginEnd().isAuto())
24528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            marginTotal += style()->marginEnd().calcValue(availableLogicalWidth);
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Subtract out our margins to get the available content width.
24828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        int availableContentLogicalWidth = max(0, containerWidthInInlineDirection - marginTotal);
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ensure we aren't bigger than our max width or smaller than our min width.
25128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setLogicalWidth(min(availableContentLogicalWidth, maxPreferredLogicalWidth()));
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
25328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
25428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    setLogicalWidth(max(logicalWidth(), minPreferredLogicalWidth()));
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Finally, with our true width determined, compute our margins for real.
257a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    setMarginStart(0);
258a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    setMarginEnd(0);
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in SSR mode, we ignore left/right margin for table
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (document()->settings()->layoutAlgorithm() == Settings::kLayoutSSR)
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
263bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block#endif
26428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!hasPerpendicularContainingBlock)
26528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        computeInlineDirectionMargins(cb, availableLogicalWidth, logicalWidth());
26628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    else {
26728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setMarginStart(style()->marginStart().calcMinValue(availableLogicalWidth));
26828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setMarginEnd(style()->marginEnd().calcMinValue(availableLogicalWidth));
26928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid RenderTable::adjustLogicalHeightForCaption()
27381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
27481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_caption);
27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    IntRect captionRect(m_caption->x(), m_caption->y(), m_caption->width(), m_caption->height());
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_caption->setLogicalLocation(m_caption->marginStart(), logicalHeight());
27881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!selfNeedsLayout() && m_caption->checkForRepaintDuringLayout())
27981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_caption->repaintDuringLayoutIfMoved(captionRect);
28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
28181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setLogicalHeight(logicalHeight() + m_caption->logicalHeight() + m_caption->marginBefore() + m_caption->marginAfter());
28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
28381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::layout()
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(needsLayout());
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2882bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (simplifiedLayout())
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    LayoutRepainter repainter(*this, checkForRepaintDuringLayout());
2946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    LayoutStateMaintainer statePusher(view(), this, IntSize(x(), y()), style()->isFlippedBlocksWritingMode());
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    setLogicalHeight(0);
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_overflow.clear();
298231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initMaxMarginValues();
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool relayoutChildren = false;
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
304bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block
305a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    int oldLogicalWidth = logicalWidth();
306bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeLogicalWidth();
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT
30923e9dd818a876304304944c844be7625f63383c4Shimeng (Simon) Wang    if (!checkAndSetRelayoutChildren(&relayoutChildren)
31023e9dd818a876304304944c844be7625f63383c4Shimeng (Simon) Wang        && document()->settings()->layoutAlgorithm() == Settings::kLayoutSSR) {
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // if the width of a table is wider than its container width, or it has a nested table,
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // we will render it with single column.
31315196e7281a07cd210bad6e50ad31dabab648e6cKristian Monsen        int cw = containingBlockLogicalWidthForContent();
3148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        bool shouldRenderAsSingleColumn = (width() > cw);
3158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (!shouldRenderAsSingleColumn) {
3168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            RenderObject* child = firstChild();
3178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            while (child) {
3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (child->isTable()) {
3198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    shouldRenderAsSingleColumn = true;
3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
3218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
3228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                child = child->nextInPreOrder();
3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
3248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
3258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
3268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (shouldRenderAsSingleColumn) {
327bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block            m_singleColumn = true;
328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (width() > cw)
3298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                setWidth(cw);
33015196e7281a07cd210bad6e50ad31dabab648e6cKristian Monsen            if (m_minPreferredLogicalWidth > cw)
33115196e7281a07cd210bad6e50ad31dabab648e6cKristian Monsen                m_minPreferredLogicalWidth = cw;
33215196e7281a07cd210bad6e50ad31dabab648e6cKristian Monsen            if (m_maxPreferredLogicalWidth > cw)
33315196e7281a07cd210bad6e50ad31dabab648e6cKristian Monsen                m_maxPreferredLogicalWidth = cw;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
33728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (m_caption && logicalWidth() != oldLogicalWidth)
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_caption->setNeedsLayout(true, false);
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: The optimisation below doesn't work since the internal table
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // layout could have changed.  we need to add a flag to the table
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // layout that tells us if something has changed in the min max
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // calculations to do it correctly.
344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//     if ( oldWidth != width() || columns.size() + 1 != columnPos.size() )
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_tableLayout->layout();
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    setCellLogicalWidths();
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int totalSectionLogicalHeight = 0;
35028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int oldTableLogicalTop = m_caption ? m_caption->logicalHeight() + m_caption->marginBefore() + m_caption->marginAfter() : 0;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool collapsing = collapseBorders();
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_LAYOUT
3568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (relayoutChildren) {
3578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            child->setNeedsLayout(true, false);
3588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (!child->isTableSection()) {
3598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                child->layoutIfNeeded();
3608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                continue;
3618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
3628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            // fall through
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (child->isTableSection()) {
3668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            child->layoutIfNeeded();
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RenderTableSection* section = toRenderTableSection(child);
36828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            totalSectionLogicalHeight += section->calcRowLogicalHeight();
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (collapsing)
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                section->recalcOuterBorder();
371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            ASSERT(!section->needsLayout());
3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if (child->isTableCol()) {
3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            child->layoutIfNeeded();
3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ASSERT(!child->needsLayout());
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Only lay out one caption, since it's the only one we're going to end up painting.
3798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_caption)
3808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_caption->layoutIfNeeded();
3818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If any table section moved vertically, we will just repaint everything from that
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // section down (it is quite unlikely that any of the following sections
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // did not shift).
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool sectionMoved = false;
38628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int movedSectionLogicalTop = 0;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Collapse caption margin.
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_caption && m_caption->style()->captionSide() != CAPBOTTOM) {
39081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        adjustLogicalHeightForCaption();
39128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (logicalHeight() != oldTableLogicalTop) {
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            sectionMoved = true;
39328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            movedSectionLogicalTop = min(logicalHeight(), oldTableLogicalTop);
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int borderAndPaddingBefore = borderBefore() + (collapsing ? 0 : paddingBefore());
39828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int borderAndPaddingAfter = borderAfter() + (collapsing ? 0 : paddingAfter());
39928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
40028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    setLogicalHeight(logicalHeight() + borderAndPaddingBefore);
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isPositioned())
403bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        computeLogicalHeight();
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    Length logicalHeightLength = style()->logicalHeight();
40628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int computedLogicalHeight = 0;
40728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (logicalHeightLength.isFixed()) {
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Tables size as though CSS height includes border/padding.
40928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        computedLogicalHeight = logicalHeightLength.value() - (borderAndPaddingBefore + borderAndPaddingAfter);
41028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    } else if (logicalHeightLength.isPercent())
41128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        computedLogicalHeight = computePercentageLogicalHeight(logicalHeightLength);
41228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    computedLogicalHeight = max(0, computedLogicalHeight);
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (child->isTableSection())
416635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // FIXME: Distribute extra height between all table body sections instead of giving it all to the first one.
41728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            toRenderTableSection(child)->layoutRows(child == m_firstBody ? max(0, computedLogicalHeight - totalSectionLogicalHeight) : 0);
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_firstBody && computedLogicalHeight > totalSectionLogicalHeight && !document()->inQuirksMode()) {
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Completely empty tables (with no sections or anything) should at least honor specified height
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // in strict mode.
42328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setLogicalHeight(logicalHeight() + computedLogicalHeight);
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
42528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
42628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int sectionLogicalLeft = style()->isLeftToRightDirection() ? borderStart() : borderEnd();
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!collapsing)
42828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        sectionLogicalLeft += style()->isLeftToRightDirection() ? paddingStart() : paddingEnd();
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // position the table sections
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* section = m_head ? m_head : (m_firstBody ? m_firstBody : m_foot);
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (section) {
43328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (!sectionMoved && section->logicalTop() != logicalHeight()) {
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            sectionMoved = true;
4352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            movedSectionLogicalTop = min(logicalHeight(), section->logicalTop()) + (style()->isHorizontalWritingMode() ? section->minYVisualOverflow() : section->minXVisualOverflow());
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        section->setLogicalLocation(sectionLogicalLeft, logicalHeight());
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        setLogicalHeight(logicalHeight() + section->logicalHeight());
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        section = sectionBelow(section);
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    setLogicalHeight(logicalHeight() + borderAndPaddingAfter);
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_caption && m_caption->style()->captionSide() == CAPBOTTOM)
44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        adjustLogicalHeightForCaption();
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isPositioned())
449bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        computeLogicalHeight();
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // table can be containing block of positioned elements.
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Only pass true if width or height changed.
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layoutPositionedObjects(true);
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
455f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    updateLayerTransform();
456231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    computeOverflow(clientLogicalBottom());
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    statePusher.pop();
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
461f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (view()->layoutState()->pageLogicalHeight())
4622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        setPageLogicalOffset(view()->layoutState()->pageLogicalOffset(logicalTop()));
46368513a70bcd92384395513322f1b801e7bf9c729Steve Block
4648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool didFullRepaint = repainter.repaintAfterLayout();
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Repaint with our new bounds if they are different from our old bounds.
46628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!didFullRepaint && sectionMoved) {
46728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style()->isHorizontalWritingMode())
4682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            repaintRectangle(IntRect(minXVisualOverflow(), movedSectionLogicalTop, maxXVisualOverflow() - minXVisualOverflow(), maxYVisualOverflow() - movedSectionLogicalTop));
46928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        else
4702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            repaintRectangle(IntRect(movedSectionLogicalTop, minYVisualOverflow(), maxXVisualOverflow() - movedSectionLogicalTop, maxYVisualOverflow() - minYVisualOverflow()));
47128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
47228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setNeedsLayout(false);
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid RenderTable::addOverflowFromChildren()
477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
478f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Add overflow from borders.
479f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Technically it's odd that we are incorporating the borders into layout overflow, which is only supposed to be about overflow from our
480f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // descendant objects, but since tables don't support overflow:auto, this works out fine.
481f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (collapseBorders()) {
482f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        int rightBorderOverflow = width() + outerBorderRight() - borderRight();
483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        int leftBorderOverflow = borderLeft() - outerBorderLeft();
484f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        int bottomBorderOverflow = height() + outerBorderBottom() - borderBottom();
485f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        int topBorderOverflow = borderTop() - outerBorderTop();
486f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        IntRect borderOverflowRect(leftBorderOverflow, topBorderOverflow, rightBorderOverflow - leftBorderOverflow, bottomBorderOverflow - topBorderOverflow);
487f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (borderOverflowRect != borderBoxRect()) {
488f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            addLayoutOverflow(borderOverflowRect);
489f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            addVisualOverflow(borderOverflowRect);
490f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
491f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
492f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
493f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Add overflow from our caption.
494f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (m_caption)
495f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        addOverflowFromChild(m_caption);
496f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
497f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Add overflow from our sections.
498f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
499f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (child->isTableSection()) {
500f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            RenderTableSection* section = toRenderTableSection(child);
501f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            addOverflowFromChild(section);
502f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
503f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
504f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
505f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
50628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid RenderTable::setCellLogicalWidths()
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (child->isTableSection())
51028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            toRenderTableSection(child)->setCellLogicalWidths();
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::paint(PaintInfo& paintInfo, int tx, int ty)
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
516635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    tx += x();
517635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ty += y();
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PaintPhase paintPhase = paintInfo.phase;
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5212bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!isRoot()) {
5222bde8e466a4451c7319e3a072d118917957d6554Steve Block        IntRect overflowBox = visualOverflowRect();
5232bde8e466a4451c7319e3a072d118917957d6554Steve Block        flipForWritingMode(overflowBox);
5242bde8e466a4451c7319e3a072d118917957d6554Steve Block        overflowBox.inflate(maximalOutlineSize(paintInfo.phase));
5252bde8e466a4451c7319e3a072d118917957d6554Steve Block        overflowBox.move(tx, ty);
5262bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!overflowBox.intersects(paintInfo.rect))
5272bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
5282bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool pushedClip = pushContentsClip(paintInfo, tx, ty);
5318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    paintObject(paintInfo, tx, ty);
5328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (pushedClip)
5338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        popContentsClip(paintInfo, paintPhase, tx, ty);
5348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
5358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid RenderTable::paintObject(PaintInfo& paintInfo, int tx, int ty)
5378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
5388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    PaintPhase paintPhase = paintInfo.phase;
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChildBlockBackground) && hasBoxDecorations() && style()->visibility() == VISIBLE)
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paintBoxDecorations(paintInfo, tx, ty);
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintPhase == PaintPhaseMask) {
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paintMask(paintInfo, tx, ty);
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We're done.  We don't bother painting any children.
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintPhase == PaintPhaseBlockBackground)
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't paint our own background, but we do let the kids paint their backgrounds.
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintPhase == PaintPhaseChildBlockBackgrounds)
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paintPhase = PaintPhaseChildBlockBackground;
5548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PaintInfo info(paintInfo);
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    info.phase = paintPhase;
557ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    info.updatePaintingRootForChildren(this);
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
56028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (child->isBox() && !toRenderBox(child)->hasSelfPaintingLayer() && (child->isTableSection() || child == m_caption)) {
56128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            IntPoint childPoint = flipForWritingMode(toRenderBox(child), IntPoint(tx, ty), ParentToChildFlippingAdjustment);
56228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            child->paint(info, childPoint.x(), childPoint.y());
56328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (collapseBorders() && paintPhase == PaintPhaseChildBlockBackground && style()->visibility() == VISIBLE) {
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Collect all the unique border styles that we want to paint in a sorted list.  Once we
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // have all the styles sorted, we then do individual passes, painting each style of border
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // from lowest precedence to highest precedence.
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        info.phase = PaintPhaseCollapsedTableBorders;
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderTableCell::CollapsedBorderStyles borderStyles;
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderObject* stop = nextInPreOrderAfterChildren();
57328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        for (RenderObject* o = firstChild(); o && o != stop; o = o->nextInPreOrder()) {
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (o->isTableCell())
5750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                toRenderTableCell(o)->collectBorderStyles(borderStyles);
57628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderTableCell::sortBorderStyles(borderStyles);
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size_t count = borderStyles.size();
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < count; ++i) {
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_currentBorder = &borderStyles[i];
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (RenderObject* child = firstChild(); child; child = child->nextSibling())
58228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                if (child->isTableSection()) {
58328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    IntPoint childPoint = flipForWritingMode(toRenderTableSection(child), IntPoint(tx, ty), ParentToChildFlippingAdjustment);
58428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    child->paint(info, childPoint.x(), childPoint.y());
58528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                }
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_currentBorder = 0;
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
58981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
59081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Paint outline.
59181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if ((paintPhase == PaintPhaseOutline || paintPhase == PaintPhaseSelfOutline) && hasOutline() && style()->visibility() == VISIBLE)
59281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        paintOutline(paintInfo.context, tx, ty, width(), height());
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid RenderTable::subtractCaptionRect(IntRect& rect) const
59628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
59728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_caption)
59828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return;
59928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
60028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int captionLogicalHeight = m_caption->logicalHeight() + m_caption->marginBefore() + m_caption->marginAfter();
60128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool captionIsBefore = (m_caption->style()->captionSide() != CAPBOTTOM) ^ style()->isFlippedBlocksWritingMode();
60228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (style()->isHorizontalWritingMode()) {
60328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        rect.setHeight(rect.height() - captionLogicalHeight);
60428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (captionIsBefore)
60528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            rect.move(0, captionLogicalHeight);
60628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    } else {
60728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        rect.setWidth(rect.width() - captionLogicalHeight);
60828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (captionIsBefore)
60928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            rect.move(captionLogicalHeight, 0);
61028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
61128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
61228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::paintBoxDecorations(PaintInfo& paintInfo, int tx, int ty)
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
615ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!paintInfo.shouldPaintWithinRoot(this))
6165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return;
6175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
61828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    IntRect rect(tx, ty, width(), height());
61928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    subtractCaptionRect(rect);
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    paintBoxShadow(paintInfo.context, rect.x(), rect.y(), rect.width(), rect.height(), style(), Normal);
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6232bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (isRoot())
6242bde8e466a4451c7319e3a072d118917957d6554Steve Block        paintRootBoxFillLayers(paintInfo);
6252bde8e466a4451c7319e3a072d118917957d6554Steve Block    else if (!isBody() || document()->documentElement()->renderer()->hasBackground())
6262bde8e466a4451c7319e3a072d118917957d6554Steve Block        // The <body> only paints its background if the root element has defined a background
6272bde8e466a4451c7319e3a072d118917957d6554Steve Block        // independent of the body.
6282bde8e466a4451c7319e3a072d118917957d6554Steve Block        paintFillLayers(paintInfo, style()->visitedDependentColor(CSSPropertyBackgroundColor), style()->backgroundLayers(), rect.x(), rect.y(), rect.width(), rect.height());
6292bde8e466a4451c7319e3a072d118917957d6554Steve Block
63028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    paintBoxShadow(paintInfo.context, rect.x(), rect.y(), rect.width(), rect.height(), style(), Inset);
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style()->hasBorder() && !collapseBorders())
63328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        paintBorder(paintInfo.context, rect.x(), rect.y(), rect.width(), rect.height(), style());
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::paintMask(PaintInfo& paintInfo, int tx, int ty)
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask)
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    IntRect rect(tx, ty, width(), height());
64228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    subtractCaptionRect(rect);
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    paintMaskImages(paintInfo, rect.x(), rect.y(), rect.width(), rect.height());
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
647bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderTable::computePreferredLogicalWidths()
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
649bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ASSERT(preferredLogicalWidthsDirty());
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
65228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    recalcBordersInRowDirection();
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
654bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_tableLayout->computePreferredLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferredLogicalWidth);
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_caption)
657bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, m_caption->minPreferredLogicalWidth());
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
659bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    setPreferredLogicalWidthsDirty(false);
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::splitColumn(int pos, int firstSpan)
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we need to add a new columnStruct
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int oldSize = m_columns.size();
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns.grow(oldSize + 1);
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int oldSpan = m_columns[pos].span;
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(oldSpan > firstSpan);
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns[pos].span = firstSpan;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    memmove(m_columns.data() + pos + 1, m_columns.data() + pos, (oldSize - pos) * sizeof(ColumnStruct));
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns[pos + 1].span = oldSpan - firstSpan;
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // change width of all rows.
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (child->isTableSection())
6760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            toRenderTableSection(child)->splitColumn(pos, firstSpan);
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columnPos.grow(numEffCols() + 1);
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setNeedsLayoutAndPrefWidthsRecalc();
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::appendColumn(int span)
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // easy case.
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int pos = m_columns.size();
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int newSize = pos + 1;
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns.grow(newSize);
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns[pos].span = span;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // change width of all rows.
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (child->isTableSection())
6940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            toRenderTableSection(child)->appendColumn(pos);
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columnPos.grow(numEffCols() + 1);
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setNeedsLayoutAndPrefWidthsRecalc();
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRenderTableCol* RenderTable::nextColElement(RenderTableCol* current) const
702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RenderObject* next = current->firstChild();
704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!next)
705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        next = current->nextSibling();
706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!next && current->parent()->isTableCol())
707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        next = current->parent()->nextSibling();
708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    while (next) {
710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (next->isTableCol())
711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return toRenderTableCol(next);
712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (next != m_caption)
713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return 0;
714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        next = next->nextSibling();
715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableCol* RenderTable::colElement(int col, bool* startEdge, bool* endEdge) const
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_hasColElements)
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* child = firstChild();
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int cCol = 0;
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (child) {
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (child->isTableCol())
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (child != m_caption)
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return 0;
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        child = child->nextSibling();
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!child)
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RenderTableCol* colElem = toRenderTableCol(child);
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    while (colElem) {
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int span = colElem->span();
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!colElem->firstChild()) {
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            int startCol = cCol;
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            int endCol = cCol + span - 1;
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            cCol += span;
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (cCol > col) {
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (startEdge)
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    *startEdge = startCol == col;
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (endEdge)
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    *endEdge = endCol == col;
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                return colElem;
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        colElem = nextColElement(colElem);
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
75854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Blockvoid RenderTable::recalcCaption(RenderBlock* caption) const
75954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block{
76054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    if (!m_caption) {
76154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        m_caption = caption;
76254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        m_caption->setNeedsLayout(true);
76354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    } else {
76454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        // Make sure to null out the child's renderer.
76554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        if (Node* node = caption->node())
76654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            node->setRenderer(0);
76754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
76854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        // Destroy the child now.
76954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        caption->destroy();
77054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    }
77154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block}
77254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::recalcSections() const
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_caption = 0;
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_head = 0;
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_foot = 0;
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_firstBody = 0;
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hasColElements = false;
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We need to get valid pointers to caption, head, foot and first body again
78254cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    RenderObject* nextSibling;
78354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    for (RenderObject* child = firstChild(); child; child = nextSibling) {
78454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        nextSibling = child->nextSibling();
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (child->style()->display()) {
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_CAPTION:
78754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block                if (child->isRenderBlock())
78854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block                    recalcCaption(toRenderBlock(child));
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_COLUMN:
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_COLUMN_GROUP:
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_hasColElements = true;
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_HEADER_GROUP:
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (child->isTableSection()) {
7960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    RenderTableSection* section = toRenderTableSection(child);
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_head)
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_head = section;
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (!m_firstBody)
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_firstBody = section;
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    section->recalcCellsIfNeeded();
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_FOOTER_GROUP:
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (child->isTableSection()) {
8060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    RenderTableSection* section = toRenderTableSection(child);
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_foot)
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_foot = section;
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (!m_firstBody)
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_firstBody = section;
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    section->recalcCellsIfNeeded();
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case TABLE_ROW_GROUP:
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (child->isTableSection()) {
8160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    RenderTableSection* section = toRenderTableSection(child);
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_firstBody)
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        m_firstBody = section;
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    section->recalcCellsIfNeeded();
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // repair column count (addChild can grow it too much, because it always adds elements to the last row of a section)
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int maxCols = 0;
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (child->isTableSection()) {
8310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RenderTableSection* section = toRenderTableSection(child);
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int sectionCols = section->numColumns();
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (sectionCols > maxCols)
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                maxCols = sectionCols;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columns.resize(maxCols);
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_columnPos.resize(maxCols + 1);
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(selfNeedsLayout());
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_needsSectionRecalc = false;
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
84628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::calcBorderStart() const
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (collapseBorders()) {
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Determined by the first cell of the first row. See the CSS 2.1 spec, section 17.6.2.
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!numEffCols())
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned borderWidth = 0;
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
85528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        const BorderValue& tb = style()->borderStart();
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tb.style() == BHIDDEN)
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tb.style() > BHIDDEN)
859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            borderWidth = tb.width();
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (RenderTableCol* colGroup = colElement(0)) {
86228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            const BorderValue& gb = colGroup->style()->borderStart();
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (gb.style() == BHIDDEN)
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (gb.style() > BHIDDEN)
866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                borderWidth = max(borderWidth, static_cast<unsigned>(gb.width()));
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderTableSection* firstNonEmptySection = m_head ? m_head : (m_firstBody ? m_firstBody : m_foot);
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (firstNonEmptySection && !firstNonEmptySection->numRows())
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            firstNonEmptySection = sectionBelow(firstNonEmptySection, true);
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (firstNonEmptySection) {
87428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            const BorderValue& sb = firstNonEmptySection->style()->borderStart();
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (sb.style() == BHIDDEN)
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (sb.style() > BHIDDEN)
879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                borderWidth = max(borderWidth, static_cast<unsigned>(sb.width()));
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            const RenderTableSection::CellStruct& cs = firstNonEmptySection->cellAt(0, 0);
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            if (cs.hasCells()) {
88428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                const BorderValue& cb = cs.primaryCell()->style()->borderStart(); // FIXME: Make this work with perpendicualr and flipped cells.
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (cb.style() == BHIDDEN)
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return 0;
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                const BorderValue& rb = cs.primaryCell()->parent()->style()->borderStart();
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (rb.style() == BHIDDEN)
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return 0;
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (cb.style() > BHIDDEN)
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    borderWidth = max(borderWidth, static_cast<unsigned>(cb.width()));
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (rb.style() > BHIDDEN)
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    borderWidth = max(borderWidth, static_cast<unsigned>(rb.width()));
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
89828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return (borderWidth + (style()->isLeftToRightDirection() ? 0 : 1)) / 2;
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
90028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return RenderBlock::borderStart();
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
90228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
90328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::calcBorderEnd() const
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (collapseBorders()) {
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Determined by the last cell of the first row. See the CSS 2.1 spec, section 17.6.2.
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!numEffCols())
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned borderWidth = 0;
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
91228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        const BorderValue& tb = style()->borderEnd();
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tb.style() == BHIDDEN)
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (tb.style() > BHIDDEN)
916dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            borderWidth = tb.width();
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
91828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        int endColumn = numEffCols() - 1;
91928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (RenderTableCol* colGroup = colElement(endColumn)) {
92028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            const BorderValue& gb = colGroup->style()->borderEnd();
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (gb.style() == BHIDDEN)
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (gb.style() > BHIDDEN)
924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                borderWidth = max(borderWidth, static_cast<unsigned>(gb.width()));
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderTableSection* firstNonEmptySection = m_head ? m_head : (m_firstBody ? m_firstBody : m_foot);
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (firstNonEmptySection && !firstNonEmptySection->numRows())
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            firstNonEmptySection = sectionBelow(firstNonEmptySection, true);
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (firstNonEmptySection) {
93228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            const BorderValue& sb = firstNonEmptySection->style()->borderEnd();
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (sb.style() == BHIDDEN)
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return 0;
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (sb.style() > BHIDDEN)
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                borderWidth = max(borderWidth, static_cast<unsigned>(sb.width()));
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
93928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            const RenderTableSection::CellStruct& cs = firstNonEmptySection->cellAt(0, endColumn);
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            if (cs.hasCells()) {
94228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                const BorderValue& cb = cs.primaryCell()->style()->borderEnd(); // FIXME: Make this work with perpendicular and flipped cells.
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (cb.style() == BHIDDEN)
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return 0;
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
94628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                const BorderValue& rb = cs.primaryCell()->parent()->style()->borderEnd();
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (rb.style() == BHIDDEN)
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return 0;
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (cb.style() > BHIDDEN)
951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    borderWidth = max(borderWidth, static_cast<unsigned>(cb.width()));
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (rb.style() > BHIDDEN)
953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    borderWidth = max(borderWidth, static_cast<unsigned>(rb.width()));
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
95628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return (borderWidth + (style()->isLeftToRightDirection() ? 1 : 0)) / 2;
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
95828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return RenderBlock::borderEnd();
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
96128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid RenderTable::recalcBordersInRowDirection()
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
96328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_borderStart = calcBorderStart();
96428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_borderEnd = calcBorderEnd();
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
96728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::borderBefore() const
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (collapseBorders())
97028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return outerBorderBefore();
97128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return RenderBlock::borderBefore();
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
97428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::borderAfter() const
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (collapseBorders())
97728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return outerBorderAfter();
97828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return RenderBlock::borderAfter();
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
98128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::outerBorderBefore() const
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!collapseBorders())
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int borderWidth = 0;
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* topSection;
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_head)
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        topSection = m_head;
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (m_firstBody)
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        topSection = m_firstBody;
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (m_foot)
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        topSection = m_foot;
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        topSection = 0;
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (topSection) {
99628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        borderWidth = topSection->outerBorderBefore();
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (borderWidth == -1)
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;   // Overridden by hidden
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
100028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    const BorderValue& tb = style()->borderBefore();
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() == BHIDDEN)
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() > BHIDDEN)
1004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        borderWidth = max(borderWidth, static_cast<int>(tb.width() / 2));
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return borderWidth;
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
100828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::outerBorderAfter() const
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!collapseBorders())
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int borderWidth = 0;
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* bottomSection;
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_foot)
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bottomSection = m_foot;
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderObject* child;
10180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        for (child = lastChild(); child && !child->isTableSection(); child = child->previousSibling()) { }
10190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bottomSection = child ? toRenderTableSection(child) : 0;
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (bottomSection) {
102228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        borderWidth = bottomSection->outerBorderAfter();
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (borderWidth == -1)
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;   // Overridden by hidden
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
102628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    const BorderValue& tb = style()->borderAfter();
10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() == BHIDDEN)
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() > BHIDDEN)
1030dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        borderWidth = max(borderWidth, static_cast<int>((tb.width() + 1) / 2));
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return borderWidth;
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
103428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::outerBorderStart() const
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!collapseBorders())
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int borderWidth = 0;
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
104128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    const BorderValue& tb = style()->borderStart();
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() == BHIDDEN)
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() > BHIDDEN)
104528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        borderWidth = (tb.width() + (style()->isLeftToRightDirection() ? 0 : 1)) / 2;
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allHidden = true;
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!child->isTableSection())
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
105128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        int sw = toRenderTableSection(child)->outerBorderStart();
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sw == -1)
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allHidden = false;
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        borderWidth = max(borderWidth, sw);
10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allHidden)
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return borderWidth;
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
106428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint RenderTable::outerBorderEnd() const
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!collapseBorders())
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int borderWidth = 0;
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
107128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    const BorderValue& tb = style()->borderEnd();
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() == BHIDDEN)
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tb.style() > BHIDDEN)
107528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        borderWidth = (tb.width() + (style()->isLeftToRightDirection() ? 1 : 0)) / 2;
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool allHidden = true;
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!child->isTableSection())
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
108128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        int sw = toRenderTableSection(child)->outerBorderEnd();
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sw == -1)
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allHidden = false;
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        borderWidth = max(borderWidth, sw);
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allHidden)
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return borderWidth;
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableSection* RenderTable::sectionAbove(const RenderTableSection* section, bool skipEmptySections) const
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (section == m_head)
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* prevSection = section == m_foot ? lastChild() : section->previousSibling();
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (prevSection) {
11030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (prevSection->isTableSection() && prevSection != m_head && prevSection != m_foot && (!skipEmptySections || toRenderTableSection(prevSection)->numRows()))
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        prevSection = prevSection->previousSibling();
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!prevSection && m_head && (!skipEmptySections || m_head->numRows()))
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        prevSection = m_head;
11090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return toRenderTableSection(prevSection);
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableSection* RenderTable::sectionBelow(const RenderTableSection* section, bool skipEmptySections) const
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (section == m_foot)
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderObject* nextSection = section == m_head ? firstChild() : section->nextSibling();
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (nextSection) {
11210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (nextSection->isTableSection() && nextSection != m_head && nextSection != m_foot && (!skipEmptySections || toRenderTableSection(nextSection)->numRows()))
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nextSection = nextSection->nextSibling();
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!nextSection && m_foot && (!skipEmptySections || m_foot->numRows()))
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nextSection = m_foot;
11270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return toRenderTableSection(nextSection);
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableCell* RenderTable::cellAbove(const RenderTableCell* cell) const
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Find the section and row to look in
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int r = cell->row();
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* section = 0;
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rAbove = 0;
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r > 0) {
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // cell is not in the first row, so use the above row in its own section
11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        section = cell->section();
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rAbove = r - 1;
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        section = sectionAbove(cell->section(), true);
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (section)
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rAbove = section->numRows() - 1;
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Look up the cell in the section's grid, which requires effective col index
11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (section) {
11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int effCol = colToEffCol(cell->col());
11510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        RenderTableSection::CellStruct& aboveCell = section->cellAt(rAbove, effCol);
11520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return aboveCell.primaryCell();
11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableCell* RenderTable::cellBelow(const RenderTableCell* cell) const
11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Find the section and row to look in
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int r = cell->row() + cell->rowSpan() - 1;
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* section = 0;
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int rBelow = 0;
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r < cell->section()->numRows() - 1) {
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The cell is not in the last row, so use the next row in the section.
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        section = cell->section();
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rBelow = r + 1;
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        section = sectionBelow(cell->section(), true);
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (section)
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            rBelow = 0;
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Look up the cell in the section's grid, which requires effective col index
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (section) {
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int effCol = colToEffCol(cell->col());
11780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        RenderTableSection::CellStruct& belowCell = section->cellAt(rBelow, effCol);
11790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return belowCell.primaryCell();
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableCell* RenderTable::cellBefore(const RenderTableCell* cell) const
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* section = cell->section();
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int effCol = colToEffCol(cell->col());
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!effCol)
11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we hit a colspan back up to a real cell.
11940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    RenderTableSection::CellStruct& prevCell = section->cellAt(cell->row(), effCol - 1);
11950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return prevCell.primaryCell();
11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderTableCell* RenderTable::cellAfter(const RenderTableCell* cell) const
11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    recalcSectionsIfNeeded();
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int effCol = colToEffCol(cell->col() + cell->colSpan());
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (effCol >= numEffCols())
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
12050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return cell->section()->primaryCellAt(cell->row(), effCol);
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderBlock* RenderTable::firstLineBlock() const
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderTable::updateFirstLetter()
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianint RenderTable::firstLineBoxBaseline() const
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
121928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (isWritingModeRoot())
122028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return -1;
122128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
12222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    recalcSectionsIfNeeded();
12232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTableSection* firstNonEmptySection = m_head ? m_head : (m_firstBody ? m_firstBody : m_foot);
12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (firstNonEmptySection && !firstNonEmptySection->numRows())
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstNonEmptySection = sectionBelow(firstNonEmptySection, true);
12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!firstNonEmptySection)
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return -1;
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
123128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return firstNonEmptySection->logicalTop() + firstNonEmptySection->firstLineBoxBaseline();
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12342bde8e466a4451c7319e3a072d118917957d6554Steve BlockIntRect RenderTable::overflowClipRect(int tx, int ty, OverlayScrollbarSizeRelevancy relevancy)
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12362bde8e466a4451c7319e3a072d118917957d6554Steve Block    IntRect rect = RenderBlock::overflowClipRect(tx, ty, relevancy);
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we have a caption, expand the clip to include the caption.
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Technically this is wrong, but it's virtually impossible to fix this
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // for real until captions have been re-written.
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This code assumes (like all our other caption code) that only top/bottom are
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // supported.  When we actually support left/right and stop mapping them to top/bottom,
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we might have to hack this code first (depending on what order we do these bug fixes in).
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_caption) {
124528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style()->isHorizontalWritingMode()) {
124628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            rect.setHeight(height());
124728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            rect.setY(ty);
124828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        } else {
124928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            rect.setWidth(width());
125028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            rect.setX(tx);
125128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderTable::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int xPos, int yPos, int tx, int ty, HitTestAction action)
12588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
12598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    tx += x();
12608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ty += y();
12618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
12628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Check kids first.
1263a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!hasOverflowClip() || overflowClipRect(tx, ty).intersects(result.rectForPoint(xPos, yPos))) {
12648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        for (RenderObject* child = lastChild(); child; child = child->previousSibling()) {
12656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (child->isBox() && !toRenderBox(child)->hasSelfPaintingLayer() && (child->isTableSection() || child == m_caption)) {
12666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                IntPoint childPoint = flipForWritingMode(toRenderBox(child), IntPoint(tx, ty), ParentToChildFlippingAdjustment);
12676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (child->nodeAtPoint(request, result, xPos, yPos, childPoint.x(), childPoint.y(), action)) {
12686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    updateHitTestResult(result, IntPoint(xPos - childPoint.x(), yPos - childPoint.y()));
12696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return true;
12706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
12718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
12728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
12738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
12748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
12758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // Check our bounds next.
1276db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    IntRect boundsRect = IntRect(tx, ty, width(), height());
1277a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (visibleToHitTesting() && (action == HitTestBlockBackground || action == HitTestChildBlockBackground) && boundsRect.intersects(result.rectForPoint(xPos, yPos))) {
12786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        updateHitTestResult(result, flipForWritingMode(IntPoint(xPos - tx, yPos - ty)));
1279db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        if (!result.addNodeToRectBasedTestResult(node(), xPos, yPos, boundsRect))
1280db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return true;
12818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
12828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
12838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return false;
12848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
12858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1287