Changeset 13346 in webkit
- Timestamp:
- Mar 17, 2006, 1:50:35 AM (19 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r13344 r13346 1 2006-03-17 David Hyatt <hyatt@apple.com> 2 3 Give table rows and sections accurate dimensions. Fix absolutePosition 4 to work for table cells properly. Add an absolutePositionForContent method 5 to make sure callers that want to deal with the content of a cell handle 6 the cell's extra space correctly. 7 8 Reviewed by darin 9 10 Existing layout tests cover this change. 11 12 * bridge/mac/WebCoreFrameBridge.mm: 13 (-[WebCoreFrameBridge copyRenderNode:copier:]): 14 * dom/ContainerNodeImpl.cpp: 15 (WebCore::ContainerNodeImpl::getUpperLeftCorner): 16 (WebCore::ContainerNodeImpl::getLowerRightCorner): 17 * dom/NodeImpl.cpp: 18 (WebCore::NodeImpl::getRect): 19 * editing/SelectionController.cpp: 20 (WebCore::SelectionController::layout): 21 (WebCore::SelectionController::caretRect): 22 * editing/visible_units.cpp: 23 (WebCore::previousLinePosition): 24 (WebCore::nextLinePosition): 25 * khtml/html/HTMLInputElementImpl.cpp: 26 (WebCore::HTMLInputElementImpl::defaultEventHandler): 27 * kwq/KWQRenderTreeDebug.cpp: 28 (operator<<): 29 * rendering/RenderBlock.cpp: 30 (WebCore::RenderBlock::selectionGapRects): 31 (WebCore::RenderBlock::positionForCoordinates): 32 * rendering/RenderContainer.cpp: 33 (WebCore::RenderContainer::positionForCoordinates): 34 (WebCore::RenderContainer::lineBoxRects): 35 * rendering/RenderTableCell.cpp: 36 (WebCore::RenderTableCell::computeAbsoluteRepaintRect): 37 (WebCore::RenderTableCell::absolutePosition): 38 * rendering/RenderTableRow.cpp: 39 (WebCore::RenderTableRow::addChild): 40 (WebCore::RenderTableRow::getAbsoluteRepaintRect): 41 (WebCore::RenderTableRow::nodeAtPoint): 42 * rendering/RenderTableRow.h: 43 * rendering/RenderTableSection.cpp: 44 (WebCore::RenderTableSection::ensureRows): 45 (WebCore::RenderTableSection::addCell): 46 (WebCore::RenderTableSection::layoutRows): 47 (WebCore::RenderTableSection::recalcCells): 48 (WebCore::RenderTableSection::nodeAtPoint): 49 * rendering/RenderTableSection.h: 50 * rendering/RenderText.cpp: 51 (WebCore::RenderText::lineBoxRects): 52 (WebCore::RenderText::positionForCoordinates): 53 (WebCore::RenderText::caretRect): 54 (WebCore::RenderText::posOfChar): 55 (WebCore::RenderText::selectionRect): 56 * rendering/render_box.cpp: 57 (WebCore::RenderBox::absolutePosition): 58 (WebCore::RenderBox::caretRect): 59 * rendering/render_br.cpp: 60 (WebCore::RenderBR::caretRect): 61 * rendering/render_canvas.h: 62 * rendering/render_flow.cpp: 63 (WebCore::RenderFlow::caretRect): 64 * rendering/render_frames.cpp: 65 (WebCore::RenderPart::updateWidgetPosition): 66 * rendering/render_layer.cpp: 67 (WebCore::RenderLayer::updateLayerPosition): 68 * rendering/render_object.cpp: 69 (WebCore::RenderObject::absoluteRects): 70 (WebCore::RenderObject::absoluteBoundingBoxRect): 71 (WebCore::RenderObject::absolutePosition): 72 * rendering/render_object.h: 73 (WebCore::RenderObject::absolutePositionForContent): 74 (WebCore::RenderObject::offsetHeight): 75 * rendering/render_replaced.cpp: 76 (WebCore::RenderWidget::updateWidgetPosition): 77 1 78 2006-03-17 Adele Peterson <adele@apple.com> 2 79 -
trunk/WebCore/bridge/mac/WebCoreFrameBridge.mm
r13342 r13346 990 990 991 991 int nx, ny; 992 node->absolutePosition(nx, ny);992 node->absolutePosition(nx, ny); 993 993 NSObject *copiedNode = [copier nodeWithName:name 994 994 position:NSMakePoint(nx,ny) -
trunk/WebCore/dom/ContainerNodeImpl.cpp
r13167 r13346 630 630 xPos = yPos = 0; 631 631 if (!o->isInline() || o->isReplaced()) { 632 o->absolutePosition( xPos, yPos);632 o->absolutePosition(xPos, yPos); 633 633 return true; 634 634 } … … 654 654 655 655 if (!o->isInline() || o->isReplaced()) { 656 o->absolutePosition( xPos, yPos);656 o->absolutePosition(xPos, yPos); 657 657 return true; 658 658 } … … 661 661 // do nothing - skip unrendered whitespace that is a child or next sibling of the anchor 662 662 } else if ((o->isText() && !o->isBR()) || o->isReplaced()) { 663 o->container()->absolutePosition( xPos, yPos);663 o->container()->absolutePosition(xPos, yPos); 664 664 if (o->isText() && static_cast<RenderText *>(o)->firstTextBox()) { 665 665 xPos += static_cast<RenderText *>(o)->minXPos(); … … 691 691 if (!o->isInline() || o->isReplaced()) 692 692 { 693 o->absolutePosition( xPos, yPos);693 o->absolutePosition(xPos, yPos); 694 694 xPos += o->width(); 695 yPos += o->height() ;695 yPos += o->height() + o->borderTopExtra() + o->borderBottomExtra(); 696 696 return true; 697 697 } … … 711 711 o = prev; 712 712 } 713 if (o->isText() || o->isReplaced()) {713 if (o->isText() || o->isReplaced()) { 714 714 o->container()->absolutePosition(xPos, yPos); 715 715 if (o->isText()) -
trunk/WebCore/dom/NodeImpl.cpp
r13342 r13346 341 341 int _x, _y; 342 342 if (renderer() && renderer()->absolutePosition(_x, _y)) 343 return IntRect( _x, _y, renderer()->width(), renderer()->height() );343 return IntRect( _x, _y, renderer()->width(), renderer()->height() + renderer()->borderTopExtra() + renderer()->borderBottomExtra()); 344 344 345 345 return IntRect(); -
trunk/WebCore/editing/SelectionController.cpp
r13167 r13346 756 756 757 757 int x, y; 758 pos.node()->renderer()->absolutePosition (x, y);758 pos.node()->renderer()->absolutePositionForContent(x, y); 759 759 m_caretPositionOnLayout = IntPoint(x, y); 760 760 } … … 773 773 if (m_sel.start().node() && m_sel.start().node()->renderer()) { 774 774 int x, y; 775 m_sel.start().node()->renderer()->absolutePosition (x, y);775 m_sel.start().node()->renderer()->absolutePositionForContent(x, y); 776 776 caret.move(IntPoint(x, y) - m_caretPositionOnLayout); 777 777 } -
trunk/WebCore/editing/visible_units.cpp
r13187 r13346 425 425 if (root) { 426 426 int absx, absy; 427 containingBlock->absolutePosition (absx, absy);427 containingBlock->absolutePositionForContent(absx, absy); 428 428 RenderObject *renderer = root->closestLeafChildForXPos(x, absx)->object(); 429 429 return renderer->positionForCoordinates(x, absy + root->topOverflow()); … … 488 488 if (root) { 489 489 int absx, absy; 490 containingBlock->absolutePosition (absx, absy);490 containingBlock->absolutePositionForContent(absx, absy); 491 491 RenderObject *renderer = root->closestLeafChildForXPos(x, absx)->object(); 492 492 return renderer->positionForCoordinates(x, absy + root->topOverflow()); -
trunk/WebCore/khtml/html/HTMLInputElementImpl.cpp
r13250 r13346 1047 1047 } else { 1048 1048 int offsetX, offsetY; 1049 renderer()->absolutePosition(offsetX, offsetY);1049 renderer()->absolutePosition(offsetX, offsetY); 1050 1050 xPos = me->clientX() - offsetX; 1051 1051 yPos = me->clientY() - offsetY; -
trunk/WebCore/kwq/KWQRenderTreeDebug.cpp
r13187 r13346 135 135 // FIXME: Will remove this <br> code once all layout tests pass. Until then, we can't really change 136 136 // all the results easily. 137 // FIXME: Will also remove the table row and section hacks once all layout tests pass. 137 138 bool usePositions = true; 139 bool useWidth = true; 140 bool useHeight = true; 138 141 if (o.isBR()) { 139 142 const RenderBR* br = static_cast<const RenderBR*>(&o); 140 143 usePositions = (br->firstTextBox() && br->firstTextBox()->isText()); 141 } 142 IntRect r(usePositions ? o.xPos() : 0, usePositions ? o.yPos() : 0, o.width(), o.height()); 144 } else if (o.isTableRow()) 145 usePositions = useWidth = useHeight = false; 146 else if (o.isTableSection()) 147 useWidth = false; 148 149 IntRect r(usePositions ? o.xPos() : 0, usePositions ? o.yPos() : 0, useWidth ? o.width() : 0, useHeight ? o.height() : 0); 143 150 ts << " " << r; 144 151 -
trunk/WebCore/rendering/RenderBlock.cpp
r13192 r13346 1455 1455 1456 1456 int tx, ty; 1457 absolutePosition (tx, ty);1457 absolutePositionForContent(tx, ty); 1458 1458 1459 1459 int lastTop = -borderTopExtra(); … … 2587 2587 2588 2588 int absx, absy; 2589 absolutePosition (absx, absy);2589 absolutePositionForContent(absx, absy); 2590 2590 2591 2591 int top = absy + borderTop() + paddingTop(); … … 2638 2638 if (renderer->height() == 0 || renderer->style()->visibility() != VISIBLE || renderer->isFloatingOrPositioned()) 2639 2639 continue; 2640 renderer->absolutePosition (absx, top);2640 renderer->absolutePositionForContent(absx, top); 2641 2641 RenderObject *next = renderer->nextSibling(); 2642 2642 while (next && next->isFloatingOrPositioned()) 2643 2643 next = next->nextSibling(); 2644 2644 if (next) 2645 next->absolutePosition (absx, bottom);2645 next->absolutePositionForContent(absx, bottom); 2646 2646 else 2647 2647 bottom = top + contentHeight(); -
trunk/WebCore/rendering/RenderContainer.cpp
r13102 r13346 488 488 489 489 int absx, absy; 490 renderer->absolutePosition (absx, absy);490 renderer->absolutePositionForContent(absx, absy); 491 491 492 492 int top = absy + borderTop() + paddingTop(); … … 513 513 QValueList<IntRect> rects; 514 514 int x = 0, y = 0; 515 absolutePosition (x, y);515 absolutePositionForContent(x, y); 516 516 absoluteRects(rects, x, y); 517 517 return rects; … … 525 525 if (child->isText() || child->isInline() || child->isAnonymousBlock()) { 526 526 int x = 0, y = 0; 527 child->absolutePosition (x, y);527 child->absolutePositionForContent(x, y); 528 528 child->absoluteRects(rects, x, y); 529 529 } -
trunk/WebCore/rendering/RenderTableCell.cpp
r13067 r13346 123 123 { 124 124 r.setY(r.y() + _topExtra); 125 r.move(-parent()->xPos(), -parent()->yPos()); // Rows are in the same coordinate space, so don't add their offset in. 125 126 RenderBlock::computeAbsoluteRepaintRect(r, f); 126 127 } … … 128 129 bool RenderTableCell::absolutePosition(int &xPos, int &yPos, bool f) 129 130 { 130 bool re t = RenderBlock::absolutePosition(xPos, yPos, f);131 if (ret)132 yPos += _topExtra;133 return re t;131 bool result = RenderBlock::absolutePosition(xPos, yPos, f); 132 xPos -= parent()->xPos(); // Rows are in the same coordinate space, so don't add their offset in. 133 yPos -= parent()->yPos(); 134 return result; 134 135 } 135 136 -
trunk/WebCore/rendering/RenderTableRow.cpp
r12746 r13346 93 93 RenderTableCell* cell = static_cast<RenderTableCell*>(child); 94 94 95 section()->addCell(cell );96 95 section()->addCell(cell, this); 96 97 97 RenderContainer::addChild(cell, beforeChild); 98 98 … … 123 123 { 124 124 // For now, just repaint the whole table. 125 // FIXME: Find a better way to do this. 125 // FIXME: Find a better way to do this, e.g., need to repaint all the cells that we 126 // might have propagated a background color into. 126 127 RenderTable* parentTable = table(); 127 128 if (parentTable) … … 131 132 } 132 133 134 // Hit Testing 135 bool RenderTableRow::nodeAtPoint(NodeInfo& info, int x, int y, int tx, int ty, HitTestAction action) 136 { 137 // Table rows cannot ever be hit tested. Effectively they do not exist. 138 // Just forward to our children always. 139 for (RenderObject* child = lastChild(); child; child = child->previousSibling()) { 140 // FIXME: We have to skip over inline flows, since they can show up inside table rows 141 // at the moment (a demoted inline <form> for example). If we ever implement a 142 // table-specific hit-test method (which we should do for performance reasons anyway), 143 // then we can remove this check. 144 if (!child->layer() && !child->isInlineFlow() && child->nodeAtPoint(info, x, y, tx, ty, action)) { 145 setInnerNode(info); 146 return true; 147 } 148 } 149 150 return false; 133 151 } 152 153 } -
trunk/WebCore/rendering/RenderTableRow.h
r13286 r13346 46 46 virtual void layout(); 47 47 virtual IntRect getAbsoluteRepaintRect(); 48 48 virtual bool nodeAtPoint(NodeInfo& info, int x, int y, int tx, int ty, HitTestAction action); 49 49 50 // FIXME: We can't support things like opacity on table rows because they have no dimensions. This can be removed when 50 51 // table rows really work right. -
trunk/WebCore/rendering/RenderTableSection.cpp
r12953 r13346 146 146 grid[r].row = new Row(nCols); 147 147 grid[r].row->fill(emptyCellStruct); 148 grid[r].rowRenderer = 0; 148 149 grid[r].baseLine = 0; 149 150 grid[r].height = Length(); … … 154 155 } 155 156 156 void RenderTableSection::addCell(RenderTableCell *cell )157 void RenderTableSection::addCell(RenderTableCell *cell, RenderObject* row) 157 158 { 158 159 int rSpan = cell->rowSpan(); … … 198 199 return; 199 200 201 grid[cRow].rowRenderer = row; 202 200 203 int col = cCol; 201 204 // tell the cell where it is … … 362 365 int hspacing = table()->hBorderSpacing(); 363 366 int vspacing = table()->vBorderSpacing(); 367 368 // Set the width of our section now. The rows will also be this width. 369 m_width = table()->contentWidth(); 364 370 365 371 if (toAdd && totalRows && (rowPos[totalRows] || !nextSibling())) { … … 430 436 Row *row = grid[r].row; 431 437 int totalCols = row->size(); 438 439 // Set the row's x/y position and width/height. 440 if (grid[r].rowRenderer) { 441 grid[r].rowRenderer->setPos(0, rowPos[r]); 442 grid[r].rowRenderer->setWidth(m_width); 443 grid[r].rowRenderer->setHeight(rowPos[r+1] - rowPos[r] - vspacing); 444 } 445 432 446 for (int c = 0; c < nEffCols; c++) { 433 447 CellStruct current = cellAt(r, c); … … 660 674 661 675 for (RenderObject *row = firstChild(); row; row = row->nextSibling()) { 662 cRow++; 663 cCol = 0; 664 ensureRows(cRow + 1); 665 for (RenderObject *cell = row->firstChild(); cell; cell = cell->nextSibling()) 666 if (cell->isTableCell()) 667 addCell(static_cast<RenderTableCell *>(cell)); 676 if (row->isTableRow()) { 677 cRow++; 678 cCol = 0; 679 ensureRows(cRow + 1); 680 for (RenderObject *cell = row->firstChild(); cell; cell = cell->nextSibling()) 681 if (cell->isTableCell()) 682 addCell(static_cast<RenderTableCell *>(cell), row); 683 } 668 684 } 669 685 needCellRecalc = false; … … 697 713 setNeedCellRecalc(); 698 714 return RenderContainer::removeChildNode(child); 715 } 716 717 // Hit Testing 718 bool RenderTableSection::nodeAtPoint(NodeInfo& info, int x, int y, int tx, int ty, HitTestAction action) 719 { 720 // Table sections cannot ever be hit tested. Effectively they do not exist. 721 // Just forward to our children always. 722 tx += m_x; 723 ty += m_y; 724 725 for (RenderObject* child = lastChild(); child; child = child->previousSibling()) { 726 // FIXME: We have to skip over inline flows, since they can show up inside table rows 727 // at the moment (a demoted inline <form> for example). If we ever implement a 728 // table-specific hit-test method (which we should do for performance reasons anyway), 729 // then we can remove this check. 730 if (!child->layer() && !child->isInlineFlow() && child->nodeAtPoint(info, x, y, tx, ty, action)) { 731 setInnerNode(info); 732 return true; 733 } 734 } 735 736 return false; 699 737 } 700 738 -
trunk/WebCore/rendering/RenderTableSection.h
r12758 r13346 56 56 #endif 57 57 58 void addCell(RenderTableCell *cell );58 void addCell(RenderTableCell *cell, RenderObject* row); 59 59 60 60 void setCellWidths(); … … 70 70 typedef Array<CellStruct> Row; 71 71 struct RowStruct { 72 Row *row; 72 Row* row; 73 RenderObject* rowRenderer; 73 74 int baseLine; 74 75 Length height; … … 98 99 virtual RenderObject* removeChildNode(RenderObject* child); 99 100 101 virtual bool nodeAtPoint(NodeInfo& info, int x, int y, int tx, int ty, HitTestAction action); 102 100 103 // this gets a cell grid data structure. changing the number of 101 104 // columns is done by the table -
trunk/WebCore/rendering/RenderText.cpp
r13300 r13346 216 216 QValueList<IntRect> rects; 217 217 int x = 0, y = 0; 218 absolutePosition (x, y);218 absolutePositionForContent(x, y); 219 219 absoluteRects(rects, x, y); 220 220 return rects; … … 250 250 int absx, absy; 251 251 RenderBlock *cb = containingBlock(); 252 cb->absolutePosition (absx, absy);252 cb->absolutePositionForContent(absx, absy); 253 253 if (cb->hasOverflowClip()) 254 254 cb->layer()->subtractScrollOffset(absx, absy); … … 400 400 401 401 int absx, absy; 402 absolutePosition (absx,absy);402 absolutePositionForContent(absx, absy); 403 403 left += absx; 404 404 top += absy; … … 418 418 void RenderText::posOfChar(int chr, int &x, int &y) 419 419 { 420 absolutePosition (x, y, false);420 absolutePositionForContent(x, y); 421 421 422 422 int pos; … … 1049 1049 1050 1050 int absx, absy; 1051 cb->absolutePosition (absx, absy);1051 cb->absolutePositionForContent(absx, absy); 1052 1052 RenderLayer* layer = cb->layer(); 1053 1053 if (layer) -
trunk/WebCore/rendering/render_box.cpp
r13344 r13346 653 653 RenderObject *o = container(); 654 654 if (o && o->absolutePosition(xPos, yPos, f)) { 655 yPos += o->borderTopExtra(); 655 656 if (style()->position() == AbsolutePosition && o->isRelPositioned() && o->isInlineFlow()) { 656 657 // When we have an enclosing relpositioned inline, we need to add in the offset of the first line … … 686 687 o->layer()->subtractScrollOffset(xPos, yPos); 687 688 688 if (!isInline() || isReplaced()) 689 xPos += m_x, yPos += m_y; 689 if (!isInline() || isReplaced()) { 690 xPos += m_x; 691 yPos += m_y; 692 } 690 693 691 694 if (isRelPositioned()) … … 1760 1763 int absx, absy; 1761 1764 RenderObject *cb = containingBlock(); 1762 if (cb && cb != this && cb->absolutePosition(absx, absy)) {1765 if (cb && cb != this && cb->absolutePosition(absx, absy)) { 1763 1766 _x += absx; 1764 1767 _y += absy; -
trunk/WebCore/rendering/render_br.cpp
r13134 r13346 114 114 115 115 int absx, absy; 116 absolutePosition(absx, absy);116 absolutePosition(absx, absy); 117 117 118 if (extraWidthToEndOfLine)118 if (extraWidthToEndOfLine) 119 119 *extraWidthToEndOfLine = containingBlockWidth() - xPos(); 120 120 -
trunk/WebCore/rendering/render_canvas.h
r12853 r13346 45 45 virtual void calcHeight(); 46 46 virtual void calcMinMaxWidth(); 47 virtual bool absolutePosition(int &xPos, int& yPos, bool f = false);47 virtual bool absolutePosition(int &xPos, int& yPos, bool f = false); 48 48 49 49 int docHeight() const; -
trunk/WebCore/rendering/render_flow.cpp
r13331 r13346 637 637 int myRight = _x + width; 638 638 int ignore; 639 absolutePosition (myRight, ignore);639 absolutePositionForContent(myRight, ignore); 640 640 641 641 int containerRight = containingBlock()->xPos() + containingBlockWidth(); 642 absolutePosition (containerRight, ignore);642 absolutePositionForContent(containerRight, ignore); 643 643 644 644 *extraWidthToEndOfLine = containerRight - myRight; … … 647 647 648 648 int absx, absy; 649 absolutePosition (absx, absy, false);649 absolutePositionForContent(absx, absy); 650 650 _x += absx + paddingLeft() + borderLeft(); 651 651 _y += absy + paddingTop() + borderTop(); -
trunk/WebCore/rendering/render_frames.cpp
r13257 r13346 929 929 930 930 int x, y, width, height; 931 absolutePosition(x, y);931 absolutePosition(x, y); 932 932 x += borderLeft() + paddingLeft(); 933 933 y += borderTop() + paddingTop(); -
trunk/WebCore/rendering/render_layer.cpp
r13302 r13346 229 229 RenderObject* curr = m_object->parent(); 230 230 while (curr && !curr->layer()) { 231 x += curr->xPos(); 232 y += curr->yPos(); 231 if (!curr->isTableRow()) { 232 // Rows and cells share the same coordinate space (that of the section). 233 // Omit them when computing our xpos/ypos. 234 x += curr->xPos(); 235 y += curr->yPos(); 236 } 233 237 curr = curr->parent(); 234 238 } -
trunk/WebCore/rendering/render_object.cpp
r13331 r13346 1276 1276 } 1277 1277 else 1278 rects.append(IntRect(_tx, _ty, width(), height() ));1278 rects.append(IntRect(_tx, _ty, width(), height() + borderTopExtra() + borderBottomExtra())); 1279 1279 } 1280 1280 1281 1281 IntRect RenderObject::absoluteBoundingBoxRect() 1282 1282 { 1283 int x , y;1283 int x = 0, y = 0; 1284 1284 absolutePosition(x, y); 1285 1285 QValueList<IntRect> rects; … … 1878 1878 if (o) { 1879 1879 o->absolutePosition(xPos, yPos, f); 1880 yPos += o->borderTopExtra(); 1880 1881 if (o->hasOverflowClip()) 1881 1882 o->layer()->subtractScrollOffset(xPos, yPos); -
trunk/WebCore/rendering/render_object.h
r13134 r13346 564 564 // calculate client position of box 565 565 virtual bool absolutePosition(int &/*xPos*/, int &/*yPos*/, bool fixed = false); 566 567 // This function is used to deal with the extra top space that can occur in table cells (called borderTopExtra). 568 // The children of the cell do not factor this space in, so we have to add it in. Any code that wants to 569 // accurately deal with the contents of a cell must call this function instad of absolutePosition. 570 void absolutePositionForContent(int& xPos, int& yPos, bool fixed = false) { 571 absolutePosition(xPos, yPos, fixed); 572 yPos += borderTopExtra(); 573 } 566 574 567 575 // width and height are without margins but include paddings and borders … … 585 593 // to return the remaining width on a given line (and the height of a single line). -dwh 586 594 virtual int offsetWidth() const { return width(); } 587 virtual int offsetHeight() const { return height() ; }595 virtual int offsetHeight() const { return height() + borderTopExtra() + borderBottomExtra(); } 588 596 589 597 // IE exxtensions. Also supported by Gecko. We override in render flow to get the -
trunk/WebCore/rendering/render_replaced.cpp
r13176 r13346 435 435 436 436 int x, y, width, height; 437 absolutePosition(x, y);437 absolutePosition(x, y); 438 438 x += borderLeft() + paddingLeft(); 439 439 y += borderTop() + paddingTop();
Note:
See TracChangeset
for help on using the changeset viewer.