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