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

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

Issue 176953008: Include the outline into the visual overflow (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fixed dumb bug caught by Mac. Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderBox.h ('k') | Source/core/rendering/RenderDetailsMarker.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 clearNeedsLayout(); 307 clearNeedsLayout();
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
318 m_overflow.clear();
319 addVisualEffectOverflow();
320
317 statePusher.pop(); 321 statePusher.pop();
318 invalidateBackgroundObscurationStatus(); 322 invalidateBackgroundObscurationStatus();
319 clearNeedsLayout(); 323 clearNeedsLayout();
320 } 324 }
321 325
322 // More IE extensions. clientWidth and clientHeight represent the interior of a n object 326 // More IE extensions. clientWidth and clientHeight represent the interior of a n object
323 // excluding border and scrollbar. 327 // excluding border and scrollbar.
324 LayoutUnit RenderBox::clientWidth() const 328 LayoutUnit RenderBox::clientWidth() const
325 { 329 {
326 return width() - borderLeft() - borderRight() - verticalScrollbarWidth(); 330 return width() - borderLeft() - borderRight() - verticalScrollbarWidth();
(...skipping 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 RoundedRect clipRoundedRect(0, 0, 0, 0); 1653 RoundedRect clipRoundedRect(0, 0, 0, 0);
1650 bool hasBorderRadius = style()->hasBorderRadius(); 1654 bool hasBorderRadius = style()->hasBorderRadius();
1651 if (hasBorderRadius) 1655 if (hasBorderRadius)
1652 clipRoundedRect = style()->getRoundedInnerBorderFor(LayoutRect(accumulat edOffset, size())); 1656 clipRoundedRect = style()->getRoundedInnerBorderFor(LayoutRect(accumulat edOffset, size()));
1653 1657
1654 if (contentsClipBehavior == SkipContentsClipIfPossible) { 1658 if (contentsClipBehavior == SkipContentsClipIfPossible) {
1655 LayoutRect contentsVisualOverflow = contentsVisualOverflowRect(); 1659 LayoutRect contentsVisualOverflow = contentsVisualOverflowRect();
1656 if (contentsVisualOverflow.isEmpty()) 1660 if (contentsVisualOverflow.isEmpty())
1657 return false; 1661 return false;
1658 1662
1659 // FIXME: Get rid of this slop from here and elsewhere.
1660 // Instead, properly include the outline in visual overflow.
1661 if (RenderView* view = this->view())
1662 contentsVisualOverflow.inflate(view->maximalOutlineSize());
1663
1664 LayoutRect conservativeClipRect = clipRect; 1663 LayoutRect conservativeClipRect = clipRect;
1665 if (hasBorderRadius) 1664 if (hasBorderRadius)
1666 conservativeClipRect.intersect(clipRoundedRect.radiusCenterRect()); 1665 conservativeClipRect.intersect(clipRoundedRect.radiusCenterRect());
1667 conservativeClipRect.moveBy(-accumulatedOffset); 1666 conservativeClipRect.moveBy(-accumulatedOffset);
1668 if (hasLayer()) 1667 if (hasLayer())
1669 conservativeClipRect.move(scrolledContentOffset()); 1668 conservativeClipRect.move(scrolledContentOffset());
1670 if (conservativeClipRect.contains(contentsVisualOverflow)) 1669 if (conservativeClipRect.contains(contentsVisualOverflow))
1671 return false; 1670 return false;
1672 } 1671 }
1673 1672
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
2003 2002
2004 LayoutRect r = visualOverflowRect(); 2003 LayoutRect r = visualOverflowRect();
2005 2004
2006 RenderView* v = view(); 2005 RenderView* v = view();
2007 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && v) { 2006 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && v) {
2008 // FIXME: layoutDelta needs to be applied in parts before/after transfor ms and 2007 // FIXME: layoutDelta needs to be applied in parts before/after transfor ms and
2009 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308 2008 // repaint containers. https://bugs.webkit.org/show_bug.cgi?id=23308
2010 r.move(v->layoutDelta()); 2009 r.move(v->layoutDelta());
2011 } 2010 }
2012 2011
2013 if (style()) {
2014 // We have to use maximalOutlineSize() because a child might have an out line
2015 // that projects outside of our overflowRect.
2016 if (v) {
2017 ASSERT(style()->outlineSize() <= v->maximalOutlineSize());
2018 r.inflate(v->maximalOutlineSize());
2019 }
2020 }
2021
2022 computeRectForRepaint(repaintContainer, r); 2012 computeRectForRepaint(repaintContainer, r);
2023 return r; 2013 return r;
2024 } 2014 }
2025 2015
2026 void RenderBox::computeRectForRepaint(const RenderLayerModelObject* repaintConta iner, LayoutRect& rect, bool fixed) const 2016 void RenderBox::computeRectForRepaint(const RenderLayerModelObject* repaintConta iner, LayoutRect& rect, bool fixed) const
2027 { 2017 {
2028 // The rect we compute at each step is shifted by our x/y offset in the pare nt container's coordinate space. 2018 // The rect we compute at each step is shifted by our x/y offset in the pare nt container's coordinate space.
2029 // Only when we cross a writing mode boundary will we have to possibly flipF orWritingMode (to convert into a more appropriate 2019 // Only when we cross a writing mode boundary will we have to possibly flipF orWritingMode (to convert into a more appropriate
2030 // offset corner for the enclosing container). This allows for a fully RL o r BT document to repaint 2020 // offset corner for the enclosing container). This allows for a fully RL o r BT document to repaint
2031 // properly even during layout, since the rect remains flipped all the way u ntil the end. 2021 // properly even during layout, since the rect remains flipped all the way u ntil the end.
(...skipping 2121 matching lines...) Expand 10 before | Expand all | Expand 10 after
4153 { 4143 {
4154 ASSERT(!needsLayout()); 4144 ASSERT(!needsLayout());
4155 // If fragmentation height has changed, we need to lay out. No need to enter the renderer if it 4145 // If fragmentation height has changed, we need to lay out. No need to enter the renderer if it
4156 // is childless, though. 4146 // is childless, though.
4157 if (view()->layoutState()->pageLogicalHeightChanged() && firstChild()) 4147 if (view()->layoutState()->pageLogicalHeightChanged() && firstChild())
4158 layoutScope.setChildNeedsLayout(this); 4148 layoutScope.setChildNeedsLayout(this);
4159 } 4149 }
4160 4150
4161 void RenderBox::addVisualEffectOverflow() 4151 void RenderBox::addVisualEffectOverflow()
4162 { 4152 {
4163 if (!style()->boxShadow() && !style()->hasBorderImageOutsets()) 4153 if (!style()->boxShadow() && !style()->hasBorderImageOutsets() && !style()-> hasOutline())
4164 return; 4154 return;
4165 4155
4166 bool isFlipped = style()->isFlippedBlocksWritingMode(); 4156 bool isFlipped = style()->isFlippedBlocksWritingMode();
4167 bool isHorizontal = isHorizontalWritingMode(); 4157 bool isHorizontal = isHorizontalWritingMode();
4168 4158
4169 LayoutRect borderBox = borderBoxRect(); 4159 LayoutRect borderBox = borderBoxRect();
4170 LayoutUnit overflowMinX = borderBox.x(); 4160 LayoutUnit overflowMinX = borderBox.x();
4171 LayoutUnit overflowMaxX = borderBox.maxX(); 4161 LayoutUnit overflowMaxX = borderBox.maxX();
4172 LayoutUnit overflowMinY = borderBox.y(); 4162 LayoutUnit overflowMinY = borderBox.y();
4173 LayoutUnit overflowMaxY = borderBox.maxY(); 4163 LayoutUnit overflowMaxY = borderBox.maxY();
(...skipping 18 matching lines...) Expand all
4192 LayoutBoxExtent borderOutsets = style()->borderImageOutsets(); 4182 LayoutBoxExtent borderOutsets = style()->borderImageOutsets();
4193 4183
4194 // In flipped blocks writing modes, the physical sides are inverted. For example in vertical-rl, the right 4184 // In flipped blocks writing modes, the physical sides are inverted. For example in vertical-rl, the right
4195 // border is at the lower x coordinate value. 4185 // border is at the lower x coordinate value.
4196 overflowMinX = min(overflowMinX, borderBox.x() - ((!isFlipped || isHoriz ontal) ? borderOutsets.left() : borderOutsets.right())); 4186 overflowMinX = min(overflowMinX, borderBox.x() - ((!isFlipped || isHoriz ontal) ? borderOutsets.left() : borderOutsets.right()));
4197 overflowMaxX = max(overflowMaxX, borderBox.maxX() + ((!isFlipped || isHo rizontal) ? borderOutsets.right() : borderOutsets.left())); 4187 overflowMaxX = max(overflowMaxX, borderBox.maxX() + ((!isFlipped || isHo rizontal) ? borderOutsets.right() : borderOutsets.left()));
4198 overflowMinY = min(overflowMinY, borderBox.y() - ((!isFlipped || !isHori zontal) ? borderOutsets.top() : borderOutsets.bottom())); 4188 overflowMinY = min(overflowMinY, borderBox.y() - ((!isFlipped || !isHori zontal) ? borderOutsets.top() : borderOutsets.bottom()));
4199 overflowMaxY = max(overflowMaxY, borderBox.maxY() + ((!isFlipped || !isH orizontal) ? borderOutsets.bottom() : borderOutsets.top())); 4189 overflowMaxY = max(overflowMaxY, borderBox.maxY() + ((!isFlipped || !isH orizontal) ? borderOutsets.bottom() : borderOutsets.top()));
4200 } 4190 }
4201 4191
4202 // Add in the final overflow with shadows and outsets combined. 4192 if (style()->hasOutline()) {
4193 LayoutUnit outlineSize = style()->outlineSize();
4194
4195 overflowMinX = min(overflowMinX, borderBox.x() - outlineSize);
4196 overflowMaxX = max(overflowMaxX, borderBox.maxX() + outlineSize);
4197 overflowMinY = min(overflowMinY, borderBox.y() - outlineSize);
4198 overflowMaxY = max(overflowMaxY, borderBox.maxY() + outlineSize);
4199 }
4200
4201 // Add in the final overflow with shadows, outsets and outline combined.
4203 LayoutRect visualEffectOverflow(overflowMinX, overflowMinY, overflowMaxX - o verflowMinX, overflowMaxY - overflowMinY); 4202 LayoutRect visualEffectOverflow(overflowMinX, overflowMinY, overflowMaxX - o verflowMinX, overflowMaxY - overflowMinY);
4204 addVisualOverflow(visualEffectOverflow); 4203 addVisualOverflow(visualEffectOverflow);
4205 } 4204 }
4206 4205
4207 void RenderBox::addOverflowFromChild(RenderBox* child, const LayoutSize& delta) 4206 void RenderBox::addOverflowFromChild(RenderBox* child, const LayoutSize& delta)
4208 { 4207 {
4209 // Never allow flow threads to propagate overflow up to a parent. 4208 // Never allow flow threads to propagate overflow up to a parent.
4210 if (child->isRenderFlowThread()) 4209 if (child->isRenderFlowThread())
4211 return; 4210 return;
4212 4211
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
4705 return 0; 4704 return 0;
4706 4705
4707 if (!layoutState && !flowThreadContainingBlock()) 4706 if (!layoutState && !flowThreadContainingBlock())
4708 return 0; 4707 return 0;
4709 4708
4710 RenderBlock* containerBlock = containingBlock(); 4709 RenderBlock* containerBlock = containingBlock();
4711 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); 4710 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop();
4712 } 4711 }
4713 4712
4714 } // namespace WebCore 4713 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBox.h ('k') | Source/core/rendering/RenderDetailsMarker.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698