| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org) | 3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org) |
| 4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
| 5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. | 5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 | 198 |
| 199 if (adjustedPaintOffset.x() + visualOverflowRect().x() >= paintInfo.rect.max
X() || adjustedPaintOffset.x() + visualOverflowRect().maxX() <= paintInfo.rect.x
()) | 199 if (adjustedPaintOffset.x() + visualOverflowRect().x() >= paintInfo.rect.max
X() || adjustedPaintOffset.x() + visualOverflowRect().maxX() <= paintInfo.rect.x
()) |
| 200 return false; | 200 return false; |
| 201 | 201 |
| 202 if (top >= paintInfo.rect.maxY() || bottom <= paintInfo.rect.y()) | 202 if (top >= paintInfo.rect.maxY() || bottom <= paintInfo.rect.y()) |
| 203 return false; | 203 return false; |
| 204 | 204 |
| 205 return true; | 205 return true; |
| 206 } | 206 } |
| 207 | 207 |
| 208 static inline RenderBlock* firstContainingBlockWithLogicalWidth(const RenderRepl
aced* replaced) | |
| 209 { | |
| 210 // We have to lookup the containing block, which has an explicit width, whic
h must not be equal to our direct containing block. | |
| 211 // If the embedded document appears _after_ we performed the initial layout,
our intrinsic size is 300x150. If our containing | |
| 212 // block doesn't provide an explicit width, it's set to the 300 default, com
ing from the initial layout run. | |
| 213 RenderBlock* containingBlock = replaced->containingBlock(); | |
| 214 if (!containingBlock) | |
| 215 return 0; | |
| 216 | |
| 217 for (; !containingBlock->isRenderView() && !containingBlock->isBody(); conta
iningBlock = containingBlock->containingBlock()) { | |
| 218 if (containingBlock->style()->logicalWidth().isSpecified() | |
| 219 && containingBlock->style()->logicalMinWidth().isSpecified() | |
| 220 && (containingBlock->style()->logicalMaxWidth().isSpecified() || con
tainingBlock->style()->logicalMaxWidth().isUndefined())) | |
| 221 return containingBlock; | |
| 222 } | |
| 223 | |
| 224 return 0; | |
| 225 } | |
| 226 | |
| 227 bool RenderReplaced::hasReplacedLogicalHeight() const | 208 bool RenderReplaced::hasReplacedLogicalHeight() const |
| 228 { | 209 { |
| 229 if (style()->logicalHeight().isAuto()) | 210 if (style()->logicalHeight().isAuto()) |
| 230 return false; | 211 return false; |
| 231 | 212 |
| 232 if (style()->logicalHeight().isSpecified()) { | 213 if (style()->logicalHeight().isSpecified()) { |
| 233 if (hasAutoHeightOrContainingBlockWithAutoHeight()) | 214 if (hasAutoHeightOrContainingBlockWithAutoHeight()) |
| 234 return false; | 215 return false; |
| 235 return true; | 216 return true; |
| 236 } | 217 } |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 } | 362 } |
| 382 | 363 |
| 383 // If 'height' and 'width' both have computed values of 'auto' and t
he element has an intrinsic ratio but no intrinsic height or width, then the use
d value of | 364 // If 'height' and 'width' both have computed values of 'auto' and t
he element has an intrinsic ratio but no intrinsic height or width, then the use
d value of |
| 384 // 'width' is undefined in CSS 2.1. However, it is suggested that, i
f the containing block's width does not itself depend on the replaced element's
width, then | 365 // 'width' is undefined in CSS 2.1. However, it is suggested that, i
f the containing block's width does not itself depend on the replaced element's
width, then |
| 385 // the used value of 'width' is calculated from the constraint equat
ion used for block-level, non-replaced elements in normal flow. | 366 // the used value of 'width' is calculated from the constraint equat
ion used for block-level, non-replaced elements in normal flow. |
| 386 if (computedHeightIsAuto && !hasIntrinsicWidth && !hasIntrinsicHeigh
t) { | 367 if (computedHeightIsAuto && !hasIntrinsicWidth && !hasIntrinsicHeigh
t) { |
| 387 if (shouldComputePreferred == ComputePreferred) | 368 if (shouldComputePreferred == ComputePreferred) |
| 388 return 0; | 369 return 0; |
| 389 // The aforementioned 'constraint equation' used for block-level
, non-replaced elements in normal flow: | 370 // The aforementioned 'constraint equation' used for block-level
, non-replaced elements in normal flow: |
| 390 // 'margin-left' + 'border-left-width' + 'padding-left' + 'width
' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containin
g block | 371 // 'margin-left' + 'border-left-width' + 'padding-left' + 'width
' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containin
g block |
| 391 LayoutUnit logicalWidth; | 372 LayoutUnit logicalWidth = containingBlock()->availableLogicalWid
th(); |
| 392 // FIXME: This walking up the containgBlock chain to find the fi
rst one with a specified width is bonkers. | |
| 393 // If nothing else, it requires making sure that computeReplaced
LogicalWidthRespectingMinMaxWidth cannot | |
| 394 // depend on the width of the replaced element or we infinite lo
op. Right now we do that in | |
| 395 // firstContainingBlockWithLogicalWidth by checking that width/m
in-width/max-width are all specified. | |
| 396 // | |
| 397 // Firefox 27 seems to only do this if the <svg> has a viewbox. | |
| 398 if (RenderBlock* blockWithWidth = firstContainingBlockWithLogica
lWidth(this)) { | |
| 399 logicalWidth = blockWithWidth->computeReplacedLogicalWidthRe
spectingMinMaxWidth(blockWithWidth->computeReplacedLogicalWidthUsing(blockWithWi
dth->style()->logicalWidth()), shouldComputePreferred); | |
| 400 } else { | |
| 401 // FIXME: If shouldComputePreferred == ComputePreferred, the
n we're reading this during preferred width | |
| 402 // computation, at which point this is reading stale data fr
om a previous layout. | |
| 403 logicalWidth = containingBlock()->availableLogicalWidth(); | |
| 404 } | |
| 405 | 373 |
| 406 // This solves above equation for 'width' (== logicalWidth). | 374 // This solves above equation for 'width' (== logicalWidth). |
| 407 LayoutUnit marginStart = minimumValueForLength(style()->marginSt
art(), logicalWidth); | 375 LayoutUnit marginStart = minimumValueForLength(style()->marginSt
art(), logicalWidth); |
| 408 LayoutUnit marginEnd = minimumValueForLength(style()->marginEnd(
), logicalWidth); | 376 LayoutUnit marginEnd = minimumValueForLength(style()->marginEnd(
), logicalWidth); |
| 409 logicalWidth = std::max<LayoutUnit>(0, logicalWidth - (marginSta
rt + marginEnd + (width() - clientWidth()))); | 377 logicalWidth = std::max<LayoutUnit>(0, logicalWidth - (marginSta
rt + marginEnd + (width() - clientWidth()))); |
| 410 return computeReplacedLogicalWidthRespectingMinMaxWidth(logicalW
idth, shouldComputePreferred); | 378 return computeReplacedLogicalWidthRespectingMinMaxWidth(logicalW
idth, shouldComputePreferred); |
| 411 } | 379 } |
| 412 } | 380 } |
| 413 | 381 |
| 414 // Otherwise, if 'width' has a computed value of 'auto', and the element
has an intrinsic width, then that intrinsic width is the used value of 'width'. | 382 // Otherwise, if 'width' has a computed value of 'auto', and the element
has an intrinsic width, then that intrinsic width is the used value of 'width'. |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 return LayoutRect(); | 568 return LayoutRect(); |
| 601 | 569 |
| 602 // The selectionRect can project outside of the overflowRect, so take their
union | 570 // The selectionRect can project outside of the overflowRect, so take their
union |
| 603 // for repainting to avoid selection painting glitches. | 571 // for repainting to avoid selection painting glitches. |
| 604 LayoutRect r = isSelected() ? localSelectionRect() : visualOverflowRect(); | 572 LayoutRect r = isSelected() ? localSelectionRect() : visualOverflowRect(); |
| 605 mapRectToPaintInvalidationBacking(paintInvalidationContainer, r); | 573 mapRectToPaintInvalidationBacking(paintInvalidationContainer, r); |
| 606 return r; | 574 return r; |
| 607 } | 575 } |
| 608 | 576 |
| 609 } | 577 } |
| OLD | NEW |