Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: Source/core/rendering/RenderTableCell.cpp

Issue 163513002: Have RenderBlockFlow sub-classes' methods call their super-class method properly. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 , m_intrinsicPaddingBefore(0) 59 , m_intrinsicPaddingBefore(0)
60 , m_intrinsicPaddingAfter(0) 60 , m_intrinsicPaddingAfter(0)
61 { 61 {
62 // We only update the flags when notified of DOM changes in colSpanOrRowSpan Changed() 62 // We only update the flags when notified of DOM changes in colSpanOrRowSpan Changed()
63 // so we need to set their initial values here in case something asks for co lSpan()/rowSpan() before then. 63 // so we need to set their initial values here in case something asks for co lSpan()/rowSpan() before then.
64 updateColAndRowSpanFlags(); 64 updateColAndRowSpanFlags();
65 } 65 }
66 66
67 void RenderTableCell::willBeRemovedFromTree() 67 void RenderTableCell::willBeRemovedFromTree()
68 { 68 {
69 RenderBlock::willBeRemovedFromTree(); 69 RenderBlockFlow::willBeRemovedFromTree();
70 70
71 section()->setNeedsCellRecalc(); 71 section()->setNeedsCellRecalc();
72 section()->removeCachedCollapsedBorders(this); 72 section()->removeCachedCollapsedBorders(this);
73 } 73 }
74 74
75 unsigned RenderTableCell::parseColSpanFromDOM() const 75 unsigned RenderTableCell::parseColSpanFromDOM() const
76 { 76 {
77 ASSERT(node()); 77 ASSERT(node());
78 if (node()->hasTagName(tdTag) || node()->hasTagName(thTag)) 78 if (node()->hasTagName(tdTag) || node()->hasTagName(thTag))
79 return min<unsigned>(toHTMLTableCellElement(node())->colSpan(), maxColum nIndex); 79 return min<unsigned>(toHTMLTableCellElement(node())->colSpan(), maxColum nIndex);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 return Length(colWidthSum, Fixed); 142 return Length(colWidthSum, Fixed);
143 } 143 }
144 144
145 void RenderTableCell::computePreferredLogicalWidths() 145 void RenderTableCell::computePreferredLogicalWidths()
146 { 146 {
147 // The child cells rely on the grids up in the sections to do their computeP referredLogicalWidths work. Normally the sections are set up early, as table 147 // The child cells rely on the grids up in the sections to do their computeP referredLogicalWidths work. Normally the sections are set up early, as table
148 // cells are added, but relayout can cause the cells to be freed, leaving st ale pointers in the sections' 148 // cells are added, but relayout can cause the cells to be freed, leaving st ale pointers in the sections'
149 // grids. We must refresh those grids before the child cells try to use the m. 149 // grids. We must refresh those grids before the child cells try to use the m.
150 table()->recalcSectionsIfNeeded(); 150 table()->recalcSectionsIfNeeded();
151 151
152 RenderBlock::computePreferredLogicalWidths(); 152 RenderBlockFlow::computePreferredLogicalWidths();
153 if (node() && style()->autoWrap()) { 153 if (node() && style()->autoWrap()) {
154 // See if nowrap was set. 154 // See if nowrap was set.
155 Length w = styleOrColLogicalWidth(); 155 Length w = styleOrColLogicalWidth();
156 const AtomicString& nowrap = toElement(node())->getAttribute(nowrapAttr) ; 156 const AtomicString& nowrap = toElement(node())->getAttribute(nowrapAttr) ;
157 if (!nowrap.isNull() && w.isFixed()) 157 if (!nowrap.isNull() && w.isFixed())
158 // Nowrap is set, but we didn't actually use it because of the 158 // Nowrap is set, but we didn't actually use it because of the
159 // fixed width set on the cell. Even so, it is a WinIE/Moz trait 159 // fixed width set on the cell. Even so, it is a WinIE/Moz trait
160 // to make the minwidth of the cell into the fixed width. They do t his 160 // to make the minwidth of the cell into the fixed width. They do t his
161 // even in strict mode, so do not make this a quirk. Affected the t op 161 // even in strict mode, so do not make this a quirk. Affected the t op
162 // of hiptop.com. 162 // of hiptop.com.
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 void RenderTableCell::setOverrideLogicalContentHeightFromRowHeight(LayoutUnit ro wHeight) 304 void RenderTableCell::setOverrideLogicalContentHeightFromRowHeight(LayoutUnit ro wHeight)
305 { 305 {
306 clearIntrinsicPadding(); 306 clearIntrinsicPadding();
307 setOverrideLogicalContentHeight(max<LayoutUnit>(0, rowHeight - borderAndPadd ingLogicalHeight())); 307 setOverrideLogicalContentHeight(max<LayoutUnit>(0, rowHeight - borderAndPadd ingLogicalHeight()));
308 } 308 }
309 309
310 LayoutSize RenderTableCell::offsetFromContainer(RenderObject* o, const LayoutPoi nt& point, bool* offsetDependsOnPoint) const 310 LayoutSize RenderTableCell::offsetFromContainer(RenderObject* o, const LayoutPoi nt& point, bool* offsetDependsOnPoint) const
311 { 311 {
312 ASSERT(o == container()); 312 ASSERT(o == container());
313 313
314 LayoutSize offset = RenderBlock::offsetFromContainer(o, point, offsetDepends OnPoint); 314 LayoutSize offset = RenderBlockFlow::offsetFromContainer(o, point, offsetDep endsOnPoint);
315 if (parent()) 315 if (parent())
316 offset -= parentBox()->locationOffset(); 316 offset -= parentBox()->locationOffset();
317 317
318 return offset; 318 return offset;
319 } 319 }
320 320
321 LayoutRect RenderTableCell::clippedOverflowRectForRepaint(const RenderLayerModel Object* repaintContainer) const 321 LayoutRect RenderTableCell::clippedOverflowRectForRepaint(const RenderLayerModel Object* repaintContainer) const
322 { 322 {
323 // If the table grid is dirty, we cannot get reliable information about adjo ining cells, 323 // If the table grid is dirty, we cannot get reliable information about adjo ining cells,
324 // so we ignore outside borders. This should not be a problem because it mea ns that 324 // so we ignore outside borders. This should not be a problem because it mea ns that
325 // the table is going to recalculate the grid, relayout and repaint its curr ent rect, which 325 // the table is going to recalculate the grid, relayout and repaint its curr ent rect, which
326 // includes any outside borders of this cell. 326 // includes any outside borders of this cell.
327 if (!table()->collapseBorders() || table()->needsSectionRecalc()) 327 if (!table()->collapseBorders() || table()->needsSectionRecalc())
328 return RenderBlock::clippedOverflowRectForRepaint(repaintContainer); 328 return RenderBlockFlow::clippedOverflowRectForRepaint(repaintContainer);
329 329
330 bool rtl = !styleForCellFlow()->isLeftToRightDirection(); 330 bool rtl = !styleForCellFlow()->isLeftToRightDirection();
331 int outlineSize = style()->outlineSize(); 331 int outlineSize = style()->outlineSize();
332 int left = max(borderHalfLeft(true), outlineSize); 332 int left = max(borderHalfLeft(true), outlineSize);
333 int right = max(borderHalfRight(true), outlineSize); 333 int right = max(borderHalfRight(true), outlineSize);
334 int top = max(borderHalfTop(true), outlineSize); 334 int top = max(borderHalfTop(true), outlineSize);
335 int bottom = max(borderHalfBottom(true), outlineSize); 335 int bottom = max(borderHalfBottom(true), outlineSize);
336 if ((left && !rtl) || (right && rtl)) { 336 if ((left && !rtl) || (right && rtl)) {
337 if (RenderTableCell* before = table()->cellBefore(this)) { 337 if (RenderTableCell* before = table()->cellBefore(this)) {
338 top = max(top, before->borderHalfTop(true)); 338 top = max(top, before->borderHalfTop(true));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 } 372 }
373 373
374 void RenderTableCell::computeRectForRepaint(const RenderLayerModelObject* repain tContainer, LayoutRect& r, bool fixed) const 374 void RenderTableCell::computeRectForRepaint(const RenderLayerModelObject* repain tContainer, LayoutRect& r, bool fixed) const
375 { 375 {
376 if (repaintContainer == this) 376 if (repaintContainer == this)
377 return; 377 return;
378 r.setY(r.y()); 378 r.setY(r.y());
379 RenderView* v = view(); 379 RenderView* v = view();
380 if ((!v || !v->layoutStateEnabled() || repaintContainer) && parent()) 380 if ((!v || !v->layoutStateEnabled() || repaintContainer) && parent())
381 r.moveBy(-parentBox()->location()); // Rows are in the same coordinate s pace, so don't add their offset in. 381 r.moveBy(-parentBox()->location()); // Rows are in the same coordinate s pace, so don't add their offset in.
382 RenderBlock::computeRectForRepaint(repaintContainer, r, fixed); 382 RenderBlockFlow::computeRectForRepaint(repaintContainer, r, fixed);
383 } 383 }
384 384
385 LayoutUnit RenderTableCell::cellBaselinePosition() const 385 LayoutUnit RenderTableCell::cellBaselinePosition() const
386 { 386 {
387 // <http://www.w3.org/TR/2007/CR-CSS21-20070719/tables.html#height-layout>: The baseline of a cell is the baseline of 387 // <http://www.w3.org/TR/2007/CR-CSS21-20070719/tables.html#height-layout>: The baseline of a cell is the baseline of
388 // the first in-flow line box in the cell, or the first in-flow table-row in the cell, whichever comes first. If there 388 // the first in-flow line box in the cell, or the first in-flow table-row in the cell, whichever comes first. If there
389 // is no such line box or table-row, the baseline is the bottom of content e dge of the cell box. 389 // is no such line box or table-row, the baseline is the bottom of content e dge of the cell box.
390 LayoutUnit firstLineBaseline = firstLineBoxBaseline(); 390 LayoutUnit firstLineBaseline = firstLineBoxBaseline();
391 if (firstLineBaseline != -1) 391 if (firstLineBaseline != -1)
392 return firstLineBaseline; 392 return firstLineBaseline;
393 return paddingBefore() + borderBefore() + contentLogicalHeight(); 393 return paddingBefore() + borderBefore() + contentLogicalHeight();
394 } 394 }
395 395
396 void RenderTableCell::styleDidChange(StyleDifference diff, const RenderStyle* ol dStyle) 396 void RenderTableCell::styleDidChange(StyleDifference diff, const RenderStyle* ol dStyle)
397 { 397 {
398 ASSERT(style()->display() == TABLE_CELL); 398 ASSERT(style()->display() == TABLE_CELL);
399 ASSERT(!row() || row()->rowIndexWasSet()); 399 ASSERT(!row() || row()->rowIndexWasSet());
400 400
401 RenderBlock::styleDidChange(diff, oldStyle); 401 RenderBlockFlow::styleDidChange(diff, oldStyle);
402 setHasBoxDecorations(true); 402 setHasBoxDecorations(true);
403 403
404 if (parent() && section() && oldStyle && style()->height() != oldStyle->heig ht()) 404 if (parent() && section() && oldStyle && style()->height() != oldStyle->heig ht())
405 section()->rowLogicalHeightChanged(rowIndex()); 405 section()->rowLogicalHeightChanged(rowIndex());
406 406
407 // Our intrinsic padding pushes us down to align with the baseline of other cells on the row. If our vertical-align 407 // Our intrinsic padding pushes us down to align with the baseline of other cells on the row. If our vertical-align
408 // has changed then so will the padding needed to align with other cells - c lear it so we can recalculate it from scratch. 408 // has changed then so will the padding needed to align with other cells - c lear it so we can recalculate it from scratch.
409 if (oldStyle && style()->verticalAlign() != oldStyle->verticalAlign()) 409 if (oldStyle && style()->verticalAlign() != oldStyle->verticalAlign())
410 clearIntrinsicPadding(); 410 clearIntrinsicPadding();
411 411
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 889
890 inline CollapsedBorderValue RenderTableCell::cachedCollapsedBottomBorder(const R enderStyle* styleForCellFlow) const 890 inline CollapsedBorderValue RenderTableCell::cachedCollapsedBottomBorder(const R enderStyle* styleForCellFlow) const
891 { 891 {
892 if (styleForCellFlow->isHorizontalWritingMode()) 892 if (styleForCellFlow->isHorizontalWritingMode())
893 return styleForCellFlow->isFlippedBlocksWritingMode() ? section()->cache dCollapsedBorder(this, CBSBefore) : section()->cachedCollapsedBorder(this, CBSAf ter); 893 return styleForCellFlow->isFlippedBlocksWritingMode() ? section()->cache dCollapsedBorder(this, CBSBefore) : section()->cachedCollapsedBorder(this, CBSAf ter);
894 return styleForCellFlow->isLeftToRightDirection() ? section()->cachedCollaps edBorder(this, CBSEnd) : section()->cachedCollapsedBorder(this, CBSStart); 894 return styleForCellFlow->isLeftToRightDirection() ? section()->cachedCollaps edBorder(this, CBSEnd) : section()->cachedCollapsedBorder(this, CBSStart);
895 } 895 }
896 896
897 int RenderTableCell::borderLeft() const 897 int RenderTableCell::borderLeft() const
898 { 898 {
899 return table()->collapseBorders() ? borderHalfLeft(false) : RenderBlock::bor derLeft(); 899 return table()->collapseBorders() ? borderHalfLeft(false) : RenderBlockFlow: :borderLeft();
900 } 900 }
901 901
902 int RenderTableCell::borderRight() const 902 int RenderTableCell::borderRight() const
903 { 903 {
904 return table()->collapseBorders() ? borderHalfRight(false) : RenderBlock::bo rderRight(); 904 return table()->collapseBorders() ? borderHalfRight(false) : RenderBlockFlow ::borderRight();
905 } 905 }
906 906
907 int RenderTableCell::borderTop() const 907 int RenderTableCell::borderTop() const
908 { 908 {
909 return table()->collapseBorders() ? borderHalfTop(false) : RenderBlock::bord erTop(); 909 return table()->collapseBorders() ? borderHalfTop(false) : RenderBlockFlow:: borderTop();
910 } 910 }
911 911
912 int RenderTableCell::borderBottom() const 912 int RenderTableCell::borderBottom() const
913 { 913 {
914 return table()->collapseBorders() ? borderHalfBottom(false) : RenderBlock::b orderBottom(); 914 return table()->collapseBorders() ? borderHalfBottom(false) : RenderBlockFlo w::borderBottom();
915 } 915 }
916 916
917 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=46191, make the collapsed bord er drawing 917 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=46191, make the collapsed bord er drawing
918 // work with different block flow values instead of being hard-coded to top-to-b ottom. 918 // work with different block flow values instead of being hard-coded to top-to-b ottom.
919 int RenderTableCell::borderStart() const 919 int RenderTableCell::borderStart() const
920 { 920 {
921 return table()->collapseBorders() ? borderHalfStart(false) : RenderBlock::bo rderStart(); 921 return table()->collapseBorders() ? borderHalfStart(false) : RenderBlockFlow ::borderStart();
922 } 922 }
923 923
924 int RenderTableCell::borderEnd() const 924 int RenderTableCell::borderEnd() const
925 { 925 {
926 return table()->collapseBorders() ? borderHalfEnd(false) : RenderBlock::bord erEnd(); 926 return table()->collapseBorders() ? borderHalfEnd(false) : RenderBlockFlow:: borderEnd();
927 } 927 }
928 928
929 int RenderTableCell::borderBefore() const 929 int RenderTableCell::borderBefore() const
930 { 930 {
931 return table()->collapseBorders() ? borderHalfBefore(false) : RenderBlock::b orderBefore(); 931 return table()->collapseBorders() ? borderHalfBefore(false) : RenderBlockFlo w::borderBefore();
932 } 932 }
933 933
934 int RenderTableCell::borderAfter() const 934 int RenderTableCell::borderAfter() const
935 { 935 {
936 return table()->collapseBorders() ? borderHalfAfter(false) : RenderBlock::bo rderAfter(); 936 return table()->collapseBorders() ? borderHalfAfter(false) : RenderBlockFlow ::borderAfter();
937 } 937 }
938 938
939 int RenderTableCell::borderHalfLeft(bool outer) const 939 int RenderTableCell::borderHalfLeft(bool outer) const
940 { 940 {
941 const RenderStyle* styleForCellFlow = this->styleForCellFlow(); 941 const RenderStyle* styleForCellFlow = this->styleForCellFlow();
942 if (styleForCellFlow->isHorizontalWritingMode()) 942 if (styleForCellFlow->isHorizontalWritingMode())
943 return styleForCellFlow->isLeftToRightDirection() ? borderHalfStart(oute r) : borderHalfEnd(outer); 943 return styleForCellFlow->isLeftToRightDirection() ? borderHalfStart(oute r) : borderHalfEnd(outer);
944 return styleForCellFlow->isFlippedBlocksWritingMode() ? borderHalfAfter(oute r) : borderHalfBefore(outer); 944 return styleForCellFlow->isFlippedBlocksWritingMode() ? borderHalfAfter(oute r) : borderHalfBefore(outer);
945 } 945 }
946 946
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
996 { 996 {
997 CollapsedBorderValue border = collapsedAfterBorder(DoNotIncludeBorderColor); 997 CollapsedBorderValue border = collapsedAfterBorder(DoNotIncludeBorderColor);
998 if (border.exists()) 998 if (border.exists())
999 return (border.width() + ((styleForCellFlow()->isFlippedBlocksWritingMod e() ^ outer) ? 1 : 0)) / 2; 999 return (border.width() + ((styleForCellFlow()->isFlippedBlocksWritingMod e() ^ outer) ? 1 : 0)) / 2;
1000 return 0; 1000 return 0;
1001 } 1001 }
1002 1002
1003 void RenderTableCell::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset ) 1003 void RenderTableCell::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset )
1004 { 1004 {
1005 ASSERT(paintInfo.phase != PaintPhaseCollapsedTableBorders); 1005 ASSERT(paintInfo.phase != PaintPhaseCollapsedTableBorders);
1006 RenderBlock::paint(paintInfo, paintOffset); 1006 RenderBlockFlow::paint(paintInfo, paintOffset);
1007 } 1007 }
1008 1008
1009 static EBorderStyle collapsedBorderStyle(EBorderStyle style) 1009 static EBorderStyle collapsedBorderStyle(EBorderStyle style)
1010 { 1010 {
1011 if (style == OUTSET) 1011 if (style == OUTSET)
1012 return GROOVE; 1012 return GROOVE;
1013 if (style == INSET) 1013 if (style == INSET)
1014 return RIDGE; 1014 return RIDGE;
1015 return style; 1015 return style;
1016 } 1016 }
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 1275
1276 RenderTableCell* RenderTableCell::createAnonymousWithParentRenderer(const Render Object* parent) 1276 RenderTableCell* RenderTableCell::createAnonymousWithParentRenderer(const Render Object* parent)
1277 { 1277 {
1278 RenderTableCell* newCell = RenderTableCell::createAnonymous(&parent->documen t()); 1278 RenderTableCell* newCell = RenderTableCell::createAnonymous(&parent->documen t());
1279 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay( parent->style(), TABLE_CELL); 1279 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay( parent->style(), TABLE_CELL);
1280 newCell->setStyle(newStyle.release()); 1280 newCell->setStyle(newStyle.release());
1281 return newCell; 1281 return newCell;
1282 } 1282 }
1283 1283
1284 } // namespace WebCore 1284 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderTableCaption.cpp ('k') | Source/core/rendering/RenderTextControl.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698