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 4177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4188 return; | 4188 return; |
4189 | 4189 |
4190 if (!hasVisualOverflow() && contentsVisualOverflowRect().isEmpty()) { | 4190 if (!hasVisualOverflow() && contentsVisualOverflowRect().isEmpty()) { |
4191 clearAllOverflows(); | 4191 clearAllOverflows(); |
4192 return; | 4192 return; |
4193 } | 4193 } |
4194 | 4194 |
4195 m_overflow->setLayoutOverflow(noOverflowRect()); | 4195 m_overflow->setLayoutOverflow(noOverflowRect()); |
4196 } | 4196 } |
4197 | 4197 |
4198 bool LayoutBox::logicalWidthIsResolvableFromBlock(const LayoutBlock* containingB
lock) | 4198 static bool logicalWidthIsResolvable(const LayoutBox& layoutBox) |
4199 { | 4199 { |
4200 const LayoutBlock* cb = containingBlock; | 4200 const LayoutBox* box = &layoutBox; |
4201 while (!cb->isLayoutView() && !cb->isOutOfFlowPositioned() && (cb->style()->
logicalWidth().isAuto() || cb->isAnonymousBlock())) | 4201 while (!box->isLayoutView() && !box->isOutOfFlowPositioned() |
4202 cb = cb->containingBlock(); | 4202 && (box->style()->logicalWidth().isAuto() || box->isAnonymousBlock()) |
| 4203 && !box->hasOverrideContainingBlockLogicalWidth()) |
| 4204 box = box->containingBlock(); |
4203 | 4205 |
4204 if (cb->style()->logicalWidth().isFixed()) | 4206 if (box->style()->logicalWidth().isFixed()) |
4205 return true; | 4207 return true; |
4206 if (cb->isLayoutView()) | 4208 if (box->isLayoutView()) |
4207 return true; | 4209 return true; |
4208 if (cb->isOutOfFlowPositioned()) | 4210 // The size of the containing block of an absolutely positioned element is a
lways definite with respect to that |
| 4211 // element (http://dev.w3.org/csswg/css-sizing-3/#definite). |
| 4212 if (box->isOutOfFlowPositioned()) |
4209 return true; | 4213 return true; |
4210 if (cb->style()->logicalWidth().isPercent()) | 4214 if (box->hasOverrideContainingBlockLogicalWidth()) |
4211 return logicalWidthIsResolvableFromBlock(cb->containingBlock()); | 4215 return box->overrideContainingBlockContentLogicalWidth() != -1; |
| 4216 if (box->style()->logicalWidth().isPercent()) |
| 4217 return logicalWidthIsResolvable(*box->containingBlock()); |
4212 | 4218 |
4213 return false; | 4219 return false; |
4214 } | 4220 } |
4215 | 4221 |
4216 bool LayoutBox::hasDefiniteLogicalWidth() const | 4222 bool LayoutBox::hasDefiniteLogicalWidth() const |
4217 { | 4223 { |
4218 const Length& logicalWidth = style()->logicalWidth(); | 4224 return logicalWidthIsResolvable(*this); |
4219 if (logicalWidth.isIntrinsic() || logicalWidth.isLegacyIntrinsic()) | |
4220 return false; | |
4221 if (logicalWidth.isFixed()) | |
4222 return true; | |
4223 // The size of the containing block of an absolutely positioned element is a
lways definite with respect to that | |
4224 // element (http://dev.w3.org/csswg/css-sizing-3/#definite). | |
4225 if (isOutOfFlowPositioned()) | |
4226 return true; | |
4227 | |
4228 return LayoutBox::logicalWidthIsResolvableFromBlock(containingBlock()); | |
4229 } | 4225 } |
4230 | 4226 |
4231 inline static bool percentageLogicalHeightIsResolvable(const LayoutBox* box) | 4227 inline static bool percentageLogicalHeightIsResolvable(const LayoutBox* box) |
4232 { | 4228 { |
4233 return LayoutBox::percentageLogicalHeightIsResolvableFromBlock(box->containi
ngBlock(), box->isOutOfFlowPositioned()); | 4229 return LayoutBox::percentageLogicalHeightIsResolvableFromBlock(box->containi
ngBlock(), box->isOutOfFlowPositioned()); |
4234 } | 4230 } |
4235 | 4231 |
4236 bool LayoutBox::percentageLogicalHeightIsResolvableFromBlock(const LayoutBlock*
containingBlock, bool isOutOfFlowPositioned) | 4232 bool LayoutBox::percentageLogicalHeightIsResolvableFromBlock(const LayoutBlock*
containingBlock, bool isOutOfFlowPositioned) |
4237 { | 4233 { |
4238 // In quirks mode, blocks with auto height are skipped, and we keep looking
for an enclosing | 4234 // In quirks mode, blocks with auto height are skipped, and we keep looking
for an enclosing |
4239 // block that may have a specified height and then use it. In strict mode, t
his violates the | 4235 // block that may have a specified height and then use it. In strict mode, t
his violates the |
4240 // specification, which states that percentage heights just revert to auto i
f the containing | 4236 // specification, which states that percentage heights just revert to auto i
f the containing |
4241 // block has an auto height. We still skip anonymous containing blocks in bo
th modes, though, and look | 4237 // block has an auto height. We still skip anonymous containing blocks in bo
th modes, though, and look |
4242 // only at explicit containers. | 4238 // only at explicit containers. |
4243 const LayoutBlock* cb = containingBlock; | 4239 const LayoutBlock* cb = containingBlock; |
4244 bool inQuirksMode = cb->document().inQuirksMode(); | 4240 bool inQuirksMode = cb->document().inQuirksMode(); |
4245 while (!cb->isLayoutView() && !cb->isBody() && !cb->isTableCell() && !cb->is
OutOfFlowPositioned() && cb->style()->logicalHeight().isAuto()) { | 4241 while (!cb->isLayoutView() && !cb->isBody() && !cb->isTableCell() && !cb->is
OutOfFlowPositioned() && cb->style()->logicalHeight().isAuto()) { |
4246 if (!inQuirksMode && !cb->isAnonymousBlock()) | 4242 if (!inQuirksMode && !cb->isAnonymousBlock()) |
4247 break; | 4243 break; |
| 4244 if (cb->hasOverrideContainingBlockLogicalHeight()) |
| 4245 return cb->overrideContainingBlockContentLogicalHeight() != -1; |
| 4246 |
4248 cb = cb->containingBlock(); | 4247 cb = cb->containingBlock(); |
4249 } | 4248 } |
4250 | 4249 |
4251 // A positioned element that specified both top/bottom or that specifies hei
ght should be treated as though it has a height | 4250 // A positioned element that specified both top/bottom or that specifies hei
ght should be treated as though it has a height |
4252 // explicitly specified that can be used for any percentage computations. | 4251 // explicitly specified that can be used for any percentage computations. |
4253 // FIXME: We can't just check top/bottom here. | 4252 // FIXME: We can't just check top/bottom here. |
4254 // https://bugs.webkit.org/show_bug.cgi?id=46500 | 4253 // https://bugs.webkit.org/show_bug.cgi?id=46500 |
4255 bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned()
&& (!cb->style()->logicalHeight().isAuto() || (!cb->style()->top().isAuto() && !
cb->style()->bottom().isAuto())); | 4254 bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned()
&& (!cb->style()->logicalHeight().isAuto() || (!cb->style()->top().isAuto() && !
cb->style()->bottom().isAuto())); |
4256 | 4255 |
4257 // Table cells violate what the CSS spec says to do with heights. Basically
we | 4256 // Table cells violate what the CSS spec says to do with heights. Basically
we |
(...skipping 23 matching lines...) Expand all Loading... |
4281 { | 4280 { |
4282 const Length& logicalHeight = style()->logicalHeight(); | 4281 const Length& logicalHeight = style()->logicalHeight(); |
4283 if (logicalHeight.isIntrinsicOrAuto()) | 4282 if (logicalHeight.isIntrinsicOrAuto()) |
4284 return false; | 4283 return false; |
4285 if (logicalHeight.isFixed()) | 4284 if (logicalHeight.isFixed()) |
4286 return true; | 4285 return true; |
4287 // The size of the containing block of an absolutely positioned element is a
lways definite with respect to that | 4286 // The size of the containing block of an absolutely positioned element is a
lways definite with respect to that |
4288 // element (http://dev.w3.org/csswg/css-sizing-3/#definite). | 4287 // element (http://dev.w3.org/csswg/css-sizing-3/#definite). |
4289 if (isOutOfFlowPositioned()) | 4288 if (isOutOfFlowPositioned()) |
4290 return true; | 4289 return true; |
| 4290 if (hasOverrideContainingBlockLogicalHeight()) |
| 4291 return overrideContainingBlockContentLogicalHeight() != -1; |
4291 | 4292 |
4292 return percentageLogicalHeightIsResolvable(this); | 4293 return percentageLogicalHeightIsResolvable(this); |
4293 } | 4294 } |
4294 | 4295 |
4295 bool LayoutBox::hasUnsplittableScrollingOverflow() const | 4296 bool LayoutBox::hasUnsplittableScrollingOverflow() const |
4296 { | 4297 { |
4297 // We will paginate as long as we don't scroll overflow in the pagination di
rection. | 4298 // We will paginate as long as we don't scroll overflow in the pagination di
rection. |
4298 bool isHorizontal = isHorizontalWritingMode(); | 4299 bool isHorizontal = isHorizontalWritingMode(); |
4299 if ((isHorizontal && !scrollsOverflowY()) || (!isHorizontal && !scrollsOverf
lowX())) | 4300 if ((isHorizontal && !scrollsOverflowY()) || (!isHorizontal && !scrollsOverf
lowX())) |
4300 return false; | 4301 return false; |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4627 } | 4628 } |
4628 | 4629 |
4629 void LayoutBox::invalidateDisplayItemClients(DisplayItemList* displayItemList) c
onst | 4630 void LayoutBox::invalidateDisplayItemClients(DisplayItemList* displayItemList) c
onst |
4630 { | 4631 { |
4631 LayoutBoxModelObject::invalidateDisplayItemClients(displayItemList); | 4632 LayoutBoxModelObject::invalidateDisplayItemClients(displayItemList); |
4632 if (LayerScrollableArea* area = scrollableArea()) | 4633 if (LayerScrollableArea* area = scrollableArea()) |
4633 displayItemList->invalidate(area->displayItemClient()); | 4634 displayItemList->invalidate(area->displayItemClient()); |
4634 } | 4635 } |
4635 | 4636 |
4636 } // namespace blink | 4637 } // namespace blink |
OLD | NEW |