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

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

Issue 18720003: Correct overflow propagation in BTT and RTL writing-modes (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add FIXME, as requested. Created 7 years, 5 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
« no previous file with comments | « Source/core/rendering/RenderBox.h ('k') | no next file » | 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 4190 matching lines...) Expand 10 before | Expand all | Expand 10 after
4201 // overflow if we are clipping our own overflow. 4201 // overflow if we are clipping our own overflow.
4202 if (child->hasSelfPaintingLayer() || hasOverflowClip()) 4202 if (child->hasSelfPaintingLayer() || hasOverflowClip())
4203 return; 4203 return;
4204 LayoutRect childVisualOverflowRect = child->visualOverflowRectForPropagation (style()); 4204 LayoutRect childVisualOverflowRect = child->visualOverflowRectForPropagation (style());
4205 childVisualOverflowRect.move(delta); 4205 childVisualOverflowRect.move(delta);
4206 addVisualOverflow(childVisualOverflowRect); 4206 addVisualOverflow(childVisualOverflowRect);
4207 } 4207 }
4208 4208
4209 void RenderBox::addLayoutOverflow(const LayoutRect& rect) 4209 void RenderBox::addLayoutOverflow(const LayoutRect& rect)
4210 { 4210 {
4211 LayoutRect clientBox = clientBoxRect(); 4211 LayoutRect clientBox = noOverflowRect();
4212 if (clientBox.contains(rect) || rect.isEmpty()) 4212 if (clientBox.contains(rect) || rect.isEmpty())
4213 return; 4213 return;
4214 4214
4215 // For overflow clip objects, we don't want to propagate overflow into unrea chable areas. 4215 // For overflow clip objects, we don't want to propagate overflow into unrea chable areas.
4216 LayoutRect overflowRect(rect); 4216 LayoutRect overflowRect(rect);
4217 if (hasOverflowClip() || isRenderView()) { 4217 if (hasOverflowClip() || isRenderView()) {
4218 // Overflow is in the block's coordinate space and thus is flipped for h orizontal-bt and vertical-rl 4218 // Overflow is in the block's coordinate space and thus is flipped for h orizontal-bt and vertical-rl
4219 // writing modes. At this stage that is actually a simplification, sinc e we can treat horizontal-tb/bt as the same 4219 // writing modes. At this stage that is actually a simplification, sinc e we can treat horizontal-tb/bt as the same
4220 // and vertical-lr/rl as the same. 4220 // and vertical-lr/rl as the same.
4221 bool hasTopOverflow = !style()->isLeftToRightDirection() && !isHorizonta lWritingMode(); 4221 bool hasTopOverflow = !style()->isLeftToRightDirection() && !isHorizonta lWritingMode();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4256 m_overflow->addLayoutOverflow(overflowRect); 4256 m_overflow->addLayoutOverflow(overflowRect);
4257 } 4257 }
4258 4258
4259 void RenderBox::addVisualOverflow(const LayoutRect& rect) 4259 void RenderBox::addVisualOverflow(const LayoutRect& rect)
4260 { 4260 {
4261 LayoutRect borderBox = borderBoxRect(); 4261 LayoutRect borderBox = borderBoxRect();
4262 if (borderBox.contains(rect) || rect.isEmpty()) 4262 if (borderBox.contains(rect) || rect.isEmpty())
4263 return; 4263 return;
4264 4264
4265 if (!m_overflow) 4265 if (!m_overflow)
4266 m_overflow = adoptPtr(new RenderOverflow(clientBoxRect(), borderBox)); 4266 m_overflow = adoptPtr(new RenderOverflow(noOverflowRect(), borderBox));
4267 4267
4268 m_overflow->addVisualOverflow(rect); 4268 m_overflow->addVisualOverflow(rect);
4269 } 4269 }
4270 4270
4271 void RenderBox::clearLayoutOverflow() 4271 void RenderBox::clearLayoutOverflow()
4272 { 4272 {
4273 if (!m_overflow) 4273 if (!m_overflow)
4274 return; 4274 return;
4275 4275
4276 if (visualOverflowRect() == borderBoxRect()) { 4276 LayoutRect noOverflowRect = this->noOverflowRect();
4277 if (visualOverflowRect() == noOverflowRect) {
4277 m_overflow.clear(); 4278 m_overflow.clear();
4278 return; 4279 return;
4279 } 4280 }
4280 4281
4281 m_overflow->setLayoutOverflow(borderBoxRect()); 4282 m_overflow->setLayoutOverflow(noOverflowRect);
4282 } 4283 }
4283 4284
4284 inline static bool percentageLogicalHeightIsResolvable(const RenderBox* box) 4285 inline static bool percentageLogicalHeightIsResolvable(const RenderBox* box)
4285 { 4286 {
4286 return RenderBox::percentageLogicalHeightIsResolvableFromBlock(box->containi ngBlock(), box->isOutOfFlowPositioned()); 4287 return RenderBox::percentageLogicalHeightIsResolvableFromBlock(box->containi ngBlock(), box->isOutOfFlowPositioned());
4287 } 4288 }
4288 4289
4289 bool RenderBox::percentageLogicalHeightIsResolvableFromBlock(const RenderBlock* containingBlock, bool isOutOfFlowPositioned) 4290 bool RenderBox::percentageLogicalHeightIsResolvableFromBlock(const RenderBlock* containingBlock, bool isOutOfFlowPositioned)
4290 { 4291 {
4291 // In quirks mode, blocks with auto height are skipped, and we keep looking for an enclosing 4292 // In quirks mode, blocks with auto height are skipped, and we keep looking for an enclosing
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
4450 // We are putting ourselves into our parent's coordinate space. If there is a flipped block mismatch 4451 // We are putting ourselves into our parent's coordinate space. If there is a flipped block mismatch
4451 // in a particular axis, then we have to flip the rect along that axis. 4452 // in a particular axis, then we have to flip the rect along that axis.
4452 if (style()->writingMode() == RightToLeftWritingMode || parentStyle->writing Mode() == RightToLeftWritingMode) 4453 if (style()->writingMode() == RightToLeftWritingMode || parentStyle->writing Mode() == RightToLeftWritingMode)
4453 rect.setX(width() - rect.maxX()); 4454 rect.setX(width() - rect.maxX());
4454 else if (style()->writingMode() == BottomToTopWritingMode || parentStyle->wr itingMode() == BottomToTopWritingMode) 4455 else if (style()->writingMode() == BottomToTopWritingMode || parentStyle->wr itingMode() == BottomToTopWritingMode)
4455 rect.setY(height() - rect.maxY()); 4456 rect.setY(height() - rect.maxY());
4456 4457
4457 return rect; 4458 return rect;
4458 } 4459 }
4459 4460
4461 LayoutRect RenderBox::noOverflowRect() const
4462 {
4463 // Because of the special coodinate system used for overflow rectangles and many other
4464 // rectangles (not quite logical, not quite physical), we need to flip the b lock progression
4465 // coordinate in vertical-rl and horizontal-bt writing modes. In other words , the rectangle
4466 // returned is physical, except for the block direction progression coordina te (y in horizontal
4467 // writing modes, x in vertical writing modes), which is always "logical top ". Apart from the
4468 // flipping, this method does the same as clientBoxRect().
4469
4470 LayoutUnit left = borderLeft();
4471 LayoutUnit top = borderTop();
4472 LayoutUnit right = borderRight();
4473 LayoutUnit bottom = borderBottom();
4474 LayoutRect rect(left, top, width() - left - right, height() - top - bottom);
4475 flipForWritingMode(rect);
4476 // Subtract space occupied by scrollbars. Order is important here: first fli p, then subtract
4477 // scrollbars. This may seem backwards and weird, since one would think that a horizontal
4478 // scrollbar at the physical bottom in horizontal-bt ought to be at the logi cal top (physical
4479 // bottom), between the logical top (physical bottom) border and the logical top (physical
4480 // bottom) padding. But this is how the rest of the code expects us to behav e. This is highly
4481 // related to https://bugs.webkit.org/show_bug.cgi?id=76129
4482 // FIXME: when the above mentioned bug is fixed, it should hopefully be poss ible to call
4483 // clientBoxRect() or paddingBoxRect() in this method, rather than fiddling with the edges on
4484 // our own.
4485 rect.contract(verticalScrollbarWidth(), horizontalScrollbarHeight());
4486 return rect;
4487 }
4488
4460 LayoutRect RenderBox::overflowRectForPaintRejection() const 4489 LayoutRect RenderBox::overflowRectForPaintRejection() const
4461 { 4490 {
4462 LayoutRect overflowRect = visualOverflowRect(); 4491 LayoutRect overflowRect = visualOverflowRect();
4463 if (!m_overflow || !usesCompositedScrolling()) 4492 if (!m_overflow || !usesCompositedScrolling())
4464 return overflowRect; 4493 return overflowRect;
4465 4494
4466 overflowRect.unite(layoutOverflowRect()); 4495 overflowRect.unite(layoutOverflowRect());
4467 overflowRect.move(-scrolledContentOffset()); 4496 overflowRect.move(-scrolledContentOffset());
4468 return overflowRect; 4497 return overflowRect;
4469 } 4498 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
4628 } 4657 }
4629 4658
4630 if (didSplitParentAnonymousBoxes) 4659 if (didSplitParentAnonymousBoxes)
4631 markBoxForRelayoutAfterSplit(this); 4660 markBoxForRelayoutAfterSplit(this);
4632 4661
4633 ASSERT(beforeChild->parent() == this); 4662 ASSERT(beforeChild->parent() == this);
4634 return beforeChild; 4663 return beforeChild;
4635 } 4664 }
4636 4665
4637 } // namespace WebCore 4666 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBox.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698