OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. 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 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 return; | 308 return; |
309 } | 309 } |
310 | 310 |
311 LayoutStateMaintainer statePusher(*this, locationOffset()); | 311 LayoutStateMaintainer statePusher(*this, locationOffset()); |
312 while (child) { | 312 while (child) { |
313 child->layoutIfNeeded(); | 313 child->layoutIfNeeded(); |
314 ASSERT(!child->needsLayout()); | 314 ASSERT(!child->needsLayout()); |
315 child = child->nextSibling(); | 315 child = child->nextSibling(); |
316 } | 316 } |
317 statePusher.pop(); | 317 statePusher.pop(); |
| 318 |
| 319 addVisualEffectOverflow(); |
318 invalidateBackgroundObscurationStatus(); | 320 invalidateBackgroundObscurationStatus(); |
| 321 |
319 clearNeedsLayout(); | 322 clearNeedsLayout(); |
320 } | 323 } |
321 | 324 |
322 // More IE extensions. clientWidth and clientHeight represent the interior of a
n object | 325 // More IE extensions. clientWidth and clientHeight represent the interior of a
n object |
323 // excluding border and scrollbar. | 326 // excluding border and scrollbar. |
324 LayoutUnit RenderBox::clientWidth() const | 327 LayoutUnit RenderBox::clientWidth() const |
325 { | 328 { |
326 return width() - borderLeft() - borderRight() - verticalScrollbarWidth(); | 329 return width() - borderLeft() - borderRight() - verticalScrollbarWidth(); |
327 } | 330 } |
328 | 331 |
(...skipping 1314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1643 RoundedRect clipRoundedRect(0, 0, 0, 0); | 1646 RoundedRect clipRoundedRect(0, 0, 0, 0); |
1644 bool hasBorderRadius = style()->hasBorderRadius(); | 1647 bool hasBorderRadius = style()->hasBorderRadius(); |
1645 if (hasBorderRadius) | 1648 if (hasBorderRadius) |
1646 clipRoundedRect = style()->getRoundedInnerBorderFor(LayoutRect(accumulat
edOffset, size())); | 1649 clipRoundedRect = style()->getRoundedInnerBorderFor(LayoutRect(accumulat
edOffset, size())); |
1647 | 1650 |
1648 if (contentsClipBehavior == SkipContentsClipIfPossible) { | 1651 if (contentsClipBehavior == SkipContentsClipIfPossible) { |
1649 LayoutRect contentsVisualOverflow = contentsVisualOverflowRect(); | 1652 LayoutRect contentsVisualOverflow = contentsVisualOverflowRect(); |
1650 if (contentsVisualOverflow.isEmpty()) | 1653 if (contentsVisualOverflow.isEmpty()) |
1651 return false; | 1654 return false; |
1652 | 1655 |
1653 // FIXME: Get rid of this slop from here and elsewhere. | |
1654 // Instead, properly include the outline in visual overflow. | |
1655 if (RenderView* view = this->view()) | |
1656 contentsVisualOverflow.inflate(view->maximalOutlineSize()); | |
1657 | |
1658 LayoutRect conservativeClipRect = clipRect; | 1656 LayoutRect conservativeClipRect = clipRect; |
1659 if (hasBorderRadius) | 1657 if (hasBorderRadius) |
1660 conservativeClipRect.intersect(clipRoundedRect.radiusCenterRect()); | 1658 conservativeClipRect.intersect(clipRoundedRect.radiusCenterRect()); |
1661 conservativeClipRect.moveBy(-accumulatedOffset); | 1659 conservativeClipRect.moveBy(-accumulatedOffset); |
1662 if (hasLayer()) | 1660 if (hasLayer()) |
1663 conservativeClipRect.move(scrolledContentOffset()); | 1661 conservativeClipRect.move(scrolledContentOffset()); |
1664 if (conservativeClipRect.contains(contentsVisualOverflow)) | 1662 if (conservativeClipRect.contains(contentsVisualOverflow)) |
1665 return false; | 1663 return false; |
1666 } | 1664 } |
1667 | 1665 |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1997 | 1995 |
1998 LayoutRect r = visualOverflowRect(); | 1996 LayoutRect r = visualOverflowRect(); |
1999 | 1997 |
2000 RenderView* v = view(); | 1998 RenderView* v = view(); |
2001 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && v) { | 1999 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && v) { |
2002 // FIXME: layoutDelta needs to be applied in parts before/after transfor
ms and | 2000 // FIXME: layoutDelta needs to be applied in parts before/after transfor
ms and |
2003 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 | 2001 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 |
2004 r.move(v->layoutDelta()); | 2002 r.move(v->layoutDelta()); |
2005 } | 2003 } |
2006 | 2004 |
2007 if (style()) { | |
2008 // We have to use maximalOutlineSize() because a child might have an out
line | |
2009 // that projects outside of our overflowRect. | |
2010 if (v) { | |
2011 ASSERT(style()->outlineSize() <= v->maximalOutlineSize()); | |
2012 r.inflate(v->maximalOutlineSize()); | |
2013 } | |
2014 } | |
2015 | |
2016 computeRectForRepaint(repaintContainer, r); | 2005 computeRectForRepaint(repaintContainer, r); |
2017 return r; | 2006 return r; |
2018 } | 2007 } |
2019 | 2008 |
2020 void RenderBox::computeRectForRepaint(const RenderLayerModelObject* repaintConta
iner, LayoutRect& rect, bool fixed) const | 2009 void RenderBox::computeRectForRepaint(const RenderLayerModelObject* repaintConta
iner, LayoutRect& rect, bool fixed) const |
2021 { | 2010 { |
2022 // The rect we compute at each step is shifted by our x/y offset in the pare
nt container's coordinate space. | 2011 // The rect we compute at each step is shifted by our x/y offset in the pare
nt container's coordinate space. |
2023 // Only when we cross a writing mode boundary will we have to possibly flipF
orWritingMode (to convert into a more appropriate | 2012 // Only when we cross a writing mode boundary will we have to possibly flipF
orWritingMode (to convert into a more appropriate |
2024 // offset corner for the enclosing container). This allows for a fully RL o
r BT document to repaint | 2013 // offset corner for the enclosing container). This allows for a fully RL o
r BT document to repaint |
2025 // properly even during layout, since the rect remains flipped all the way u
ntil the end. | 2014 // properly even during layout, since the rect remains flipped all the way u
ntil the end. |
(...skipping 2118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4144 return style()->width().isAuto(); | 4133 return style()->width().isAuto(); |
4145 } | 4134 } |
4146 | 4135 |
4147 bool RenderBox::avoidsFloats() const | 4136 bool RenderBox::avoidsFloats() const |
4148 { | 4137 { |
4149 return isReplaced() || hasOverflowClip() || isHR() || isLegend() || isWritin
gModeRoot() || isFlexItemIncludingDeprecated(); | 4138 return isReplaced() || hasOverflowClip() || isHR() || isLegend() || isWritin
gModeRoot() || isFlexItemIncludingDeprecated(); |
4150 } | 4139 } |
4151 | 4140 |
4152 void RenderBox::addVisualEffectOverflow() | 4141 void RenderBox::addVisualEffectOverflow() |
4153 { | 4142 { |
4154 if (!style()->boxShadow() && !style()->hasBorderImageOutsets()) | 4143 if (!style()->boxShadow() && !style()->hasBorderImageOutsets() && !style()->
hasOutline()) |
4155 return; | 4144 return; |
4156 | 4145 |
4157 bool isFlipped = style()->isFlippedBlocksWritingMode(); | 4146 bool isFlipped = style()->isFlippedBlocksWritingMode(); |
4158 bool isHorizontal = isHorizontalWritingMode(); | 4147 bool isHorizontal = isHorizontalWritingMode(); |
4159 | 4148 |
4160 LayoutRect borderBox = borderBoxRect(); | 4149 LayoutRect borderBox = borderBoxRect(); |
4161 LayoutUnit overflowMinX = borderBox.x(); | 4150 LayoutUnit overflowMinX = borderBox.x(); |
4162 LayoutUnit overflowMaxX = borderBox.maxX(); | 4151 LayoutUnit overflowMaxX = borderBox.maxX(); |
4163 LayoutUnit overflowMinY = borderBox.y(); | 4152 LayoutUnit overflowMinY = borderBox.y(); |
4164 LayoutUnit overflowMaxY = borderBox.maxY(); | 4153 LayoutUnit overflowMaxY = borderBox.maxY(); |
(...skipping 18 matching lines...) Expand all Loading... |
4183 LayoutBoxExtent borderOutsets = style()->borderImageOutsets(); | 4172 LayoutBoxExtent borderOutsets = style()->borderImageOutsets(); |
4184 | 4173 |
4185 // In flipped blocks writing modes, the physical sides are inverted. For
example in vertical-rl, the right | 4174 // In flipped blocks writing modes, the physical sides are inverted. For
example in vertical-rl, the right |
4186 // border is at the lower x coordinate value. | 4175 // border is at the lower x coordinate value. |
4187 overflowMinX = min(overflowMinX, borderBox.x() - ((!isFlipped || isHoriz
ontal) ? borderOutsets.left() : borderOutsets.right())); | 4176 overflowMinX = min(overflowMinX, borderBox.x() - ((!isFlipped || isHoriz
ontal) ? borderOutsets.left() : borderOutsets.right())); |
4188 overflowMaxX = max(overflowMaxX, borderBox.maxX() + ((!isFlipped || isHo
rizontal) ? borderOutsets.right() : borderOutsets.left())); | 4177 overflowMaxX = max(overflowMaxX, borderBox.maxX() + ((!isFlipped || isHo
rizontal) ? borderOutsets.right() : borderOutsets.left())); |
4189 overflowMinY = min(overflowMinY, borderBox.y() - ((!isFlipped || !isHori
zontal) ? borderOutsets.top() : borderOutsets.bottom())); | 4178 overflowMinY = min(overflowMinY, borderBox.y() - ((!isFlipped || !isHori
zontal) ? borderOutsets.top() : borderOutsets.bottom())); |
4190 overflowMaxY = max(overflowMaxY, borderBox.maxY() + ((!isFlipped || !isH
orizontal) ? borderOutsets.bottom() : borderOutsets.top())); | 4179 overflowMaxY = max(overflowMaxY, borderBox.maxY() + ((!isFlipped || !isH
orizontal) ? borderOutsets.bottom() : borderOutsets.top())); |
4191 } | 4180 } |
4192 | 4181 |
4193 // Add in the final overflow with shadows and outsets combined. | 4182 if (style()->hasOutline()) { |
| 4183 unsigned short outlineSize = style()->outlineSize(); |
| 4184 |
| 4185 overflowMinX = min(overflowMinX, borderBox.x() - outlineSize); |
| 4186 overflowMaxX = max(overflowMaxX, borderBox.maxX() + outlineSize); |
| 4187 overflowMinY = min(overflowMinY, borderBox.y() - outlineSize); |
| 4188 overflowMaxY = max(overflowMaxY, borderBox.maxY() + outlineSize); |
| 4189 } |
| 4190 |
| 4191 // Add in the final overflow with shadows, outsets and outline combined. |
4194 LayoutRect visualEffectOverflow(overflowMinX, overflowMinY, overflowMaxX - o
verflowMinX, overflowMaxY - overflowMinY); | 4192 LayoutRect visualEffectOverflow(overflowMinX, overflowMinY, overflowMaxX - o
verflowMinX, overflowMaxY - overflowMinY); |
4195 addVisualOverflow(visualEffectOverflow); | 4193 addVisualOverflow(visualEffectOverflow); |
4196 } | 4194 } |
4197 | 4195 |
4198 void RenderBox::addOverflowFromChild(RenderBox* child, const LayoutSize& delta) | 4196 void RenderBox::addOverflowFromChild(RenderBox* child, const LayoutSize& delta) |
4199 { | 4197 { |
4200 // Never allow flow threads to propagate overflow up to a parent. | 4198 // Never allow flow threads to propagate overflow up to a parent. |
4201 if (child->isRenderFlowThread()) | 4199 if (child->isRenderFlowThread()) |
4202 return; | 4200 return; |
4203 | 4201 |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4692 return 0; | 4690 return 0; |
4693 | 4691 |
4694 if (!layoutState && !flowThreadContainingBlock()) | 4692 if (!layoutState && !flowThreadContainingBlock()) |
4695 return 0; | 4693 return 0; |
4696 | 4694 |
4697 RenderBlock* containerBlock = containingBlock(); | 4695 RenderBlock* containerBlock = containingBlock(); |
4698 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); | 4696 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); |
4699 } | 4697 } |
4700 | 4698 |
4701 } // namespace WebCore | 4699 } // namespace WebCore |
OLD | NEW |