| 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 2195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2206 computedValues.m_extent = logicalWidthLength.value() + borderAndPaddingL
ogicalWidth(); | 2206 computedValues.m_extent = logicalWidthLength.value() + borderAndPaddingL
ogicalWidth(); |
| 2207 else { | 2207 else { |
| 2208 LayoutUnit containerWidthInInlineDirection = containerLogicalWidth; | 2208 LayoutUnit containerWidthInInlineDirection = containerLogicalWidth; |
| 2209 if (hasPerpendicularContainingBlock) | 2209 if (hasPerpendicularContainingBlock) |
| 2210 containerWidthInInlineDirection = perpendicularContainingBlockLogica
lHeight(); | 2210 containerWidthInInlineDirection = perpendicularContainingBlockLogica
lHeight(); |
| 2211 LayoutUnit preferredWidth = computeLogicalWidthUsing(MainOrPreferredSize
, styleToUse->logicalWidth(), containerWidthInInlineDirection, cb); | 2211 LayoutUnit preferredWidth = computeLogicalWidthUsing(MainOrPreferredSize
, styleToUse->logicalWidth(), containerWidthInInlineDirection, cb); |
| 2212 computedValues.m_extent = constrainLogicalWidthByMinMax(preferredWidth,
containerWidthInInlineDirection, cb); | 2212 computedValues.m_extent = constrainLogicalWidthByMinMax(preferredWidth,
containerWidthInInlineDirection, cb); |
| 2213 } | 2213 } |
| 2214 | 2214 |
| 2215 // Margin calculations. | 2215 // Margin calculations. |
| 2216 computeMarginsForDirection(InlineDirection, cb, containerLogicalWidth, compu
tedValues.m_extent, computedValues.m_margins.m_start, | 2216 if (hasPerpendicularContainingBlock || isFloating() || isInline()) { |
| 2217 computedValues.m_margins.m_end, style()->marginStart(), style()->marginE
nd()); | 2217 computedValues.m_margins.m_start = minimumValueForLength(styleToUse->mar
ginStart(), containerLogicalWidth); |
| 2218 computedValues.m_margins.m_end = minimumValueForLength(styleToUse->margi
nEnd(), containerLogicalWidth); |
| 2219 } else { |
| 2220 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); |
| 2221 computeInlineDirectionMargins(cb, containerLogicalWidth, computedValues.
m_extent, |
| 2222 hasInvertedDirection ? computedValues.m_margins.m_end : computedValu
es.m_margins.m_start, |
| 2223 hasInvertedDirection ? computedValues.m_margins.m_start : computedVa
lues.m_margins.m_end); |
| 2224 } |
| 2218 | 2225 |
| 2219 if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLo
gicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + comp
utedValues.m_margins.m_end) | 2226 if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLo
gicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + comp
utedValues.m_margins.m_end) |
| 2220 && !isFloating() && !isInline() && !cb->isFlexibleBoxIncludingDeprecated
() && !cb->isRenderGrid()) { | 2227 && !isFloating() && !isInline() && !cb->isFlexibleBoxIncludingDeprecated
() && !cb->isRenderGrid()) { |
| 2221 LayoutUnit newMargin = containerLogicalWidth - computedValues.m_extent -
cb->marginStartForChild(this); | 2228 LayoutUnit newMargin = containerLogicalWidth - computedValues.m_extent -
cb->marginStartForChild(this); |
| 2222 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); | 2229 bool hasInvertedDirection = cb->style()->isLeftToRightDirection() != sty
le()->isLeftToRightDirection(); |
| 2223 if (hasInvertedDirection) | 2230 if (hasInvertedDirection) |
| 2224 computedValues.m_margins.m_start = newMargin; | 2231 computedValues.m_margins.m_start = newMargin; |
| 2225 else | 2232 else |
| 2226 computedValues.m_margins.m_end = newMargin; | 2233 computedValues.m_margins.m_end = newMargin; |
| 2227 } | 2234 } |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2375 | 2382 |
| 2376 return false; | 2383 return false; |
| 2377 } | 2384 } |
| 2378 | 2385 |
| 2379 bool RenderBox::autoWidthShouldFitContent() const | 2386 bool RenderBox::autoWidthShouldFitContent() const |
| 2380 { | 2387 { |
| 2381 return node() && (isHTMLInputElement(*node()) || isHTMLSelectElement(*node()
) || isHTMLButtonElement(*node()) | 2388 return node() && (isHTMLInputElement(*node()) || isHTMLSelectElement(*node()
) || isHTMLButtonElement(*node()) |
| 2382 || isHTMLTextAreaElement(*node()) || (isHTMLLegendElement(*node()) && !s
tyle()->hasOutOfFlowPosition())); | 2389 || isHTMLTextAreaElement(*node()) || (isHTMLLegendElement(*node()) && !s
tyle()->hasOutOfFlowPosition())); |
| 2383 } | 2390 } |
| 2384 | 2391 |
| 2385 void RenderBox::computeMarginsForDirection(MarginDirection forDirection, const R
enderBlock* containingBlock, LayoutUnit containerWidth, LayoutUnit childWidth, L
ayoutUnit& marginStart, LayoutUnit& marginEnd, Length marginStartLength, Length
marginEndLength) const | 2392 void RenderBox::computeInlineDirectionMargins(RenderBlock* containingBlock, Layo
utUnit containerWidth, LayoutUnit childWidth, LayoutUnit& marginStart, LayoutUni
t& marginEnd) const |
| 2386 { | 2393 { |
| 2387 if (forDirection == BlockDirection || isFloating() || isInline()) { | 2394 const RenderStyle* containingBlockStyle = containingBlock->style(); |
| 2388 if (isTableCell() && forDirection == BlockDirection) { | 2395 Length marginStartLength = style()->marginStartUsing(containingBlockStyle); |
| 2389 // FIXME: Not right if we allow cells to have different directionali
ty than the table. If we do allow this, though, | 2396 Length marginEndLength = style()->marginEndUsing(containingBlockStyle); |
| 2390 // we may just do it with an extra anonymous block inside the cell. | |
| 2391 marginStart = 0; | |
| 2392 marginEnd = 0; | |
| 2393 return; | |
| 2394 } | |
| 2395 | 2397 |
| 2396 // Margins are calculated with respect to the logical width of | 2398 if (isFloating() || isInline()) { |
| 2397 // the containing block (8.3) | |
| 2398 // Inline blocks/tables and floats don't have their margins increased. | 2399 // Inline blocks/tables and floats don't have their margins increased. |
| 2399 marginStart = minimumValueForLength(marginStartLength, containerWidth); | 2400 marginStart = minimumValueForLength(marginStartLength, containerWidth); |
| 2400 marginEnd = minimumValueForLength(marginEndLength, containerWidth); | 2401 marginEnd = minimumValueForLength(marginEndLength, containerWidth); |
| 2401 return; | 2402 return; |
| 2402 } | 2403 } |
| 2403 | 2404 |
| 2404 if (containingBlock->isFlexibleBox()) { | 2405 if (containingBlock->isFlexibleBox()) { |
| 2405 // We need to let flexbox handle the margin adjustment - otherwise, flex
box | 2406 // We need to let flexbox handle the margin adjustment - otherwise, flex
box |
| 2406 // will think we're wider than we actually are and calculate line sizes
wrong. | 2407 // will think we're wider than we actually are and calculate line sizes
wrong. |
| 2407 // See also http://dev.w3.org/csswg/css-flexbox/#auto-margins | 2408 // See also http://dev.w3.org/csswg/css-flexbox/#auto-margins |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2423 } | 2424 } |
| 2424 } | 2425 } |
| 2425 | 2426 |
| 2426 // CSS 2.1 (10.3.3): "If 'width' is not 'auto' and 'border-left-width' + 'pa
dding-left' + 'width' + 'padding-right' + 'border-right-width' | 2427 // CSS 2.1 (10.3.3): "If 'width' is not 'auto' and 'border-left-width' + 'pa
dding-left' + 'width' + 'padding-right' + 'border-right-width' |
| 2427 // (plus any of 'margin-left' or 'margin-right' that are not 'auto') is larg
er than the width of the containing block, then any 'auto' | 2428 // (plus any of 'margin-left' or 'margin-right' that are not 'auto') is larg
er than the width of the containing block, then any 'auto' |
| 2428 // values for 'margin-left' or 'margin-right' are, for the following rules,
treated as zero. | 2429 // values for 'margin-left' or 'margin-right' are, for the following rules,
treated as zero. |
| 2429 LayoutUnit marginBoxWidth = childWidth + (!style()->width().isAuto() ? margi
nStartWidth + marginEndWidth : LayoutUnit()); | 2430 LayoutUnit marginBoxWidth = childWidth + (!style()->width().isAuto() ? margi
nStartWidth + marginEndWidth : LayoutUnit()); |
| 2430 | 2431 |
| 2431 // CSS 2.1: "If both 'margin-left' and 'margin-right' are 'auto', their used
values are equal. This horizontally centers the element | 2432 // CSS 2.1: "If both 'margin-left' and 'margin-right' are 'auto', their used
values are equal. This horizontally centers the element |
| 2432 // with respect to the edges of the containing block." | 2433 // with respect to the edges of the containing block." |
| 2433 const RenderStyle* containingBlockStyle = containingBlock->style(); | |
| 2434 if ((marginStartLength.isAuto() && marginEndLength.isAuto() && marginBoxWidt
h < availableWidth) | 2434 if ((marginStartLength.isAuto() && marginEndLength.isAuto() && marginBoxWidt
h < availableWidth) |
| 2435 || (!marginStartLength.isAuto() && !marginEndLength.isAuto() && containi
ngBlockStyle->textAlign() == WEBKIT_CENTER)) { | 2435 || (!marginStartLength.isAuto() && !marginEndLength.isAuto() && containi
ngBlock->style()->textAlign() == WEBKIT_CENTER)) { |
| 2436 // Other browsers center the margin box for align=center elements so we
match them here. | 2436 // Other browsers center the margin box for align=center elements so we
match them here. |
| 2437 LayoutUnit centeredMarginBoxStart = max<LayoutUnit>(0, (availableWidth -
childWidth - marginStartWidth - marginEndWidth) / 2); | 2437 LayoutUnit centeredMarginBoxStart = max<LayoutUnit>(0, (availableWidth -
childWidth - marginStartWidth - marginEndWidth) / 2); |
| 2438 marginStart = centeredMarginBoxStart + marginStartWidth; | 2438 marginStart = centeredMarginBoxStart + marginStartWidth; |
| 2439 marginEnd = availableWidth - childWidth - marginStart + marginEndWidth; | 2439 marginEnd = availableWidth - childWidth - marginStart + marginEndWidth; |
| 2440 return; | 2440 return; |
| 2441 } | 2441 } |
| 2442 | 2442 |
| 2443 // CSS 2.1: "If there is exactly one value specified as 'auto', its used val
ue follows from the equality." | 2443 // CSS 2.1: "If there is exactly one value specified as 'auto', its used val
ue follows from the equality." |
| 2444 if (marginEndLength.isAuto() && marginBoxWidth < availableWidth) { | 2444 if (marginEndLength.isAuto() && marginBoxWidth < availableWidth) { |
| 2445 marginStart = marginStartWidth; | 2445 marginStart = marginStartWidth; |
| 2446 marginEnd = availableWidth - childWidth - marginStart; | 2446 marginEnd = availableWidth - childWidth - marginStart; |
| 2447 return; | 2447 return; |
| 2448 } | 2448 } |
| 2449 | 2449 |
| 2450 bool pushToEndFromTextAlign = !marginEndLength.isAuto() && ((!containingBloc
kStyle->isLeftToRightDirection() && containingBlockStyle->textAlign() == WEBKIT_
LEFT) | 2450 bool pushToEndFromTextAlign = !marginEndLength.isAuto() && ((!containingBloc
kStyle->isLeftToRightDirection() && containingBlockStyle->textAlign() == WEBKIT_
LEFT) |
| 2451 || (containingBlockStyle->isLeftToRightDirection() && containingBlockSty
le->textAlign() == WEBKIT_RIGHT)); | 2451 || (containingBlockStyle->isLeftToRightDirection() && containingBlockSty
le->textAlign() == WEBKIT_RIGHT)); |
| 2452 if ((marginStartLength.isAuto() && marginBoxWidth < availableWidth) || pushT
oEndFromTextAlign) { | 2452 if ((marginStartLength.isAuto() && marginBoxWidth < availableWidth) || pushT
oEndFromTextAlign) { |
| 2453 marginEnd = marginEndWidth; | 2453 marginEnd = marginEndWidth; |
| 2454 marginStart = availableWidth - childWidth - marginEnd; | 2454 marginStart = availableWidth - childWidth - marginEnd; |
| 2455 return; | 2455 return; |
| 2456 } | 2456 } |
| 2457 | 2457 |
| 2458 // Either no auto margins, or our margin box width is >= the container width
, auto margins will just turn into 0. | 2458 // Either no auto margins, or our margin box width is >= the container width
, auto margins will just turn into 0. |
| 2459 marginStart = marginStartWidth; | 2459 marginStart = marginStartWidth; |
| 2460 marginEnd = marginEndWidth; | 2460 marginEnd = marginEndWidth; |
| 2461 } | 2461 } |
| 2462 | 2462 |
| 2463 static bool shouldFlipBeforeAfterMargins(const RenderStyle* containingBlockStyle
, const RenderStyle* childStyle) |
| 2464 { |
| 2465 ASSERT(containingBlockStyle->isHorizontalWritingMode() != childStyle->isHori
zontalWritingMode()); |
| 2466 WritingMode childWritingMode = childStyle->writingMode(); |
| 2467 bool shouldFlip = false; |
| 2468 switch (containingBlockStyle->writingMode()) { |
| 2469 case TopToBottomWritingMode: |
| 2470 shouldFlip = (childWritingMode == RightToLeftWritingMode); |
| 2471 break; |
| 2472 case BottomToTopWritingMode: |
| 2473 shouldFlip = (childWritingMode == RightToLeftWritingMode); |
| 2474 break; |
| 2475 case RightToLeftWritingMode: |
| 2476 shouldFlip = (childWritingMode == BottomToTopWritingMode); |
| 2477 break; |
| 2478 case LeftToRightWritingMode: |
| 2479 shouldFlip = (childWritingMode == BottomToTopWritingMode); |
| 2480 break; |
| 2481 } |
| 2482 |
| 2483 if (!containingBlockStyle->isLeftToRightDirection()) |
| 2484 shouldFlip = !shouldFlip; |
| 2485 |
| 2486 return shouldFlip; |
| 2487 } |
| 2488 |
| 2463 void RenderBox::updateLogicalHeight() | 2489 void RenderBox::updateLogicalHeight() |
| 2464 { | 2490 { |
| 2465 m_intrinsicContentLogicalHeight = contentLogicalHeight(); | 2491 m_intrinsicContentLogicalHeight = contentLogicalHeight(); |
| 2466 | 2492 |
| 2467 LogicalExtentComputedValues computedValues; | 2493 LogicalExtentComputedValues computedValues; |
| 2468 computeLogicalHeight(logicalHeight(), logicalTop(), computedValues); | 2494 computeLogicalHeight(logicalHeight(), logicalTop(), computedValues); |
| 2469 | 2495 |
| 2470 setLogicalHeight(computedValues.m_extent); | 2496 setLogicalHeight(computedValues.m_extent); |
| 2471 setLogicalTop(computedValues.m_position); | 2497 setLogicalTop(computedValues.m_position); |
| 2472 setMarginBefore(computedValues.m_margins.m_before); | 2498 setMarginBefore(computedValues.m_margins.m_before); |
| 2473 setMarginAfter(computedValues.m_margins.m_after); | 2499 setMarginAfter(computedValues.m_margins.m_after); |
| 2474 } | 2500 } |
| 2475 | 2501 |
| 2476 void RenderBox::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logica
lTop, LogicalExtentComputedValues& computedValues) const | 2502 void RenderBox::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logica
lTop, LogicalExtentComputedValues& computedValues) const |
| 2477 { | 2503 { |
| 2478 computedValues.m_extent = logicalHeight; | 2504 computedValues.m_extent = logicalHeight; |
| 2479 computedValues.m_position = logicalTop; | 2505 computedValues.m_position = logicalTop; |
| 2480 | 2506 |
| 2481 // Cell height is managed by the table and inline non-replaced elements do n
ot support a height property. | 2507 // Cell height is managed by the table and inline non-replaced elements do n
ot support a height property. |
| 2482 if (isTableCell() || (isInline() && !isReplaced())) | 2508 if (isTableCell() || (isInline() && !isReplaced())) |
| 2483 return; | 2509 return; |
| 2484 | 2510 |
| 2485 Length h; | 2511 Length h; |
| 2486 if (isOutOfFlowPositioned()) | 2512 if (isOutOfFlowPositioned()) |
| 2487 computePositionedLogicalHeight(computedValues); | 2513 computePositionedLogicalHeight(computedValues); |
| 2488 else { | 2514 else { |
| 2489 RenderBlock* cb = containingBlock(); | 2515 RenderBlock* cb = containingBlock(); |
| 2516 bool hasPerpendicularContainingBlock = cb->isHorizontalWritingMode() !=
isHorizontalWritingMode(); |
| 2517 |
| 2518 if (!hasPerpendicularContainingBlock) { |
| 2519 bool shouldFlipBeforeAfter = cb->style()->writingMode() != style()->
writingMode(); |
| 2520 computeBlockDirectionMargins(cb, |
| 2521 shouldFlipBeforeAfter ? computedValues.m_margins.m_after : compu
tedValues.m_margins.m_before, |
| 2522 shouldFlipBeforeAfter ? computedValues.m_margins.m_before : comp
utedValues.m_margins.m_after); |
| 2523 } |
| 2490 | 2524 |
| 2491 // For tables, calculate margins only. | 2525 // For tables, calculate margins only. |
| 2492 if (isTable()) { | 2526 if (isTable()) { |
| 2493 computeMarginsForDirection(BlockDirection, cb, containingBlockLogica
lWidthForContent(), computedValues.m_extent, computedValues.m_margins.m_before, | 2527 if (hasPerpendicularContainingBlock) { |
| 2494 computedValues.m_margins.m_after, style()->marginBefore(), style
()->marginAfter()); | 2528 bool shouldFlipBeforeAfter = shouldFlipBeforeAfterMargins(cb->st
yle(), style()); |
| 2529 computeInlineDirectionMargins(cb, containingBlockLogicalWidthFor
Content(), computedValues.m_extent, |
| 2530 shouldFlipBeforeAfter ? computedValues.m_margins.m_after : c
omputedValues.m_margins.m_before, |
| 2531 shouldFlipBeforeAfter ? computedValues.m_margins.m_before :
computedValues.m_margins.m_after); |
| 2532 } |
| 2495 return; | 2533 return; |
| 2496 } | 2534 } |
| 2497 | 2535 |
| 2498 // FIXME: Account for block-flow in flexible boxes. | 2536 // FIXME: Account for block-flow in flexible boxes. |
| 2499 // https://bugs.webkit.org/show_bug.cgi?id=46418 | 2537 // https://bugs.webkit.org/show_bug.cgi?id=46418 |
| 2500 bool inHorizontalBox = parent()->isDeprecatedFlexibleBox() && parent()->
style()->boxOrient() == HORIZONTAL; | 2538 bool inHorizontalBox = parent()->isDeprecatedFlexibleBox() && parent()->
style()->boxOrient() == HORIZONTAL; |
| 2501 bool stretching = parent()->style()->boxAlign() == BSTRETCH; | 2539 bool stretching = parent()->style()->boxAlign() == BSTRETCH; |
| 2502 bool treatAsReplaced = shouldComputeSizeAsReplaced() && (!inHorizontalBo
x || !stretching); | 2540 bool treatAsReplaced = shouldComputeSizeAsReplaced() && (!inHorizontalBo
x || !stretching); |
| 2503 bool checkMinMaxHeight = false; | 2541 bool checkMinMaxHeight = false; |
| 2504 | 2542 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2531 heightResult = constrainLogicalHeightByMinMax(heightResult, computed
Values.m_extent - borderAndPaddingLogicalHeight()); | 2569 heightResult = constrainLogicalHeightByMinMax(heightResult, computed
Values.m_extent - borderAndPaddingLogicalHeight()); |
| 2532 } else { | 2570 } else { |
| 2533 // The only times we don't check min/max height are when a fixed len
gth has | 2571 // The only times we don't check min/max height are when a fixed len
gth has |
| 2534 // been given as an override. Just use that. The value has already
been adjusted | 2572 // been given as an override. Just use that. The value has already
been adjusted |
| 2535 // for box-sizing. | 2573 // for box-sizing. |
| 2536 ASSERT(h.isFixed()); | 2574 ASSERT(h.isFixed()); |
| 2537 heightResult = h.value() + borderAndPaddingLogicalHeight(); | 2575 heightResult = h.value() + borderAndPaddingLogicalHeight(); |
| 2538 } | 2576 } |
| 2539 | 2577 |
| 2540 computedValues.m_extent = heightResult; | 2578 computedValues.m_extent = heightResult; |
| 2541 // If we are perpendicular to our containing block then we need to resol
ve our block-start and block-end margins so that if they | 2579 |
| 2542 // are 'auto' we are centred or aligned within the inline flow containin
g block: this is done by computing the margins as though they are inline. | 2580 if (hasPerpendicularContainingBlock) { |
| 2543 // Note that in this 'sizing phase' we are using our own writing mode ra
ther than the containing block's. | 2581 bool shouldFlipBeforeAfter = shouldFlipBeforeAfterMargins(cb->style(
), style()); |
| 2544 // See http://www.w3.org/TR/2014/CR-css-writing-modes-3-20140320/#orthog
onal-flows | 2582 computeInlineDirectionMargins(cb, containingBlockLogicalWidthForCont
ent(), heightResult, |
| 2545 MarginDirection forDirection = isHorizontalWritingMode() != cb->isHorizo
ntalWritingMode() ? InlineDirection : BlockDirection; | 2583 shouldFlipBeforeAfter ? computedValues.m_margins.m_after : compu
tedValues.m_margins.m_before, |
| 2546 computeMarginsForDirection(forDirection, cb, containingBlockLogicalWidth
ForContent(), computedValues.m_extent, computedValues.m_margins.m_before, | 2584 shouldFlipBeforeAfter ? computedValues.m_margins.m_before : comp
utedValues.m_margins.m_after); |
| 2547 computedValues.m_margins.m_after, style()->marginBefore(), style()->
marginAfter()); | 2585 } |
| 2548 } | 2586 } |
| 2549 | 2587 |
| 2550 // WinIE quirk: The <html> block always fills the entire canvas in quirks mo
de. The <body> always fills the | 2588 // WinIE quirk: The <html> block always fills the entire canvas in quirks mo
de. The <body> always fills the |
| 2551 // <html> block in quirks mode. Only apply this quirk if the block is norma
l flow and no height | 2589 // <html> block in quirks mode. Only apply this quirk if the block is norma
l flow and no height |
| 2552 // is specified. When we're printing, we also need this quirk if the body or
root has a percentage | 2590 // is specified. When we're printing, we also need this quirk if the body or
root has a percentage |
| 2553 // height since we don't set a height in RenderView when we're printing. So
without this quirk, the | 2591 // height since we don't set a height in RenderView when we're printing. So
without this quirk, the |
| 2554 // height has nothing to be a percentage of, and it ends up being 0. That is
bad. | 2592 // height has nothing to be a percentage of, and it ends up being 0. That is
bad. |
| 2555 bool paginatedContentNeedsBaseHeight = document().printing() && h.isPercent(
) | 2593 bool paginatedContentNeedsBaseHeight = document().printing() && h.isPercent(
) |
| 2556 && (isDocumentElement() || (isBody() && document().documentElement()->re
nderer()->style()->logicalHeight().isPercent())) && !isInline(); | 2594 && (isDocumentElement() || (isBody() && document().documentElement()->re
nderer()->style()->logicalHeight().isPercent())) && !isInline(); |
| 2557 if (stretchesToViewport() || paginatedContentNeedsBaseHeight) { | 2595 if (stretchesToViewport() || paginatedContentNeedsBaseHeight) { |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2890 | 2928 |
| 2891 // FIXME: This is wrong if the containingBlock has a perpendicular writing m
ode. | 2929 // FIXME: This is wrong if the containingBlock has a perpendicular writing m
ode. |
| 2892 LayoutUnit availableHeight = containingBlockLogicalHeightForContent(heightTy
pe); | 2930 LayoutUnit availableHeight = containingBlockLogicalHeightForContent(heightTy
pe); |
| 2893 if (heightType == ExcludeMarginBorderPadding) { | 2931 if (heightType == ExcludeMarginBorderPadding) { |
| 2894 // FIXME: Margin collapsing hasn't happened yet, so this incorrectly rem
oves collapsed margins. | 2932 // FIXME: Margin collapsing hasn't happened yet, so this incorrectly rem
oves collapsed margins. |
| 2895 availableHeight -= marginBefore() + marginAfter() + borderAndPaddingLogi
calHeight(); | 2933 availableHeight -= marginBefore() + marginAfter() + borderAndPaddingLogi
calHeight(); |
| 2896 } | 2934 } |
| 2897 return availableHeight; | 2935 return availableHeight; |
| 2898 } | 2936 } |
| 2899 | 2937 |
| 2938 void RenderBox::computeBlockDirectionMargins(const RenderBlock* containingBlock,
LayoutUnit& marginBefore, LayoutUnit& marginAfter) const |
| 2939 { |
| 2940 if (isTableCell()) { |
| 2941 // FIXME: Not right if we allow cells to have different directionality t
han the table. If we do allow this, though, |
| 2942 // we may just do it with an extra anonymous block inside the cell. |
| 2943 marginBefore = 0; |
| 2944 marginAfter = 0; |
| 2945 return; |
| 2946 } |
| 2947 |
| 2948 // Margins are calculated with respect to the logical width of |
| 2949 // the containing block (8.3) |
| 2950 LayoutUnit cw = containingBlockLogicalWidthForContent(); |
| 2951 RenderStyle* containingBlockStyle = containingBlock->style(); |
| 2952 marginBefore = minimumValueForLength(style()->marginBeforeUsing(containingBl
ockStyle), cw); |
| 2953 marginAfter = minimumValueForLength(style()->marginAfterUsing(containingBloc
kStyle), cw); |
| 2954 } |
| 2955 |
| 2900 void RenderBox::computeAndSetBlockDirectionMargins(const RenderBlock* containing
Block) | 2956 void RenderBox::computeAndSetBlockDirectionMargins(const RenderBlock* containing
Block) |
| 2901 { | 2957 { |
| 2902 LayoutUnit marginBefore; | 2958 LayoutUnit marginBefore; |
| 2903 LayoutUnit marginAfter; | 2959 LayoutUnit marginAfter; |
| 2904 computeMarginsForDirection(BlockDirection, containingBlock, containingBlockL
ogicalWidthForContent(), logicalHeight(), marginBefore, marginAfter, | 2960 computeBlockDirectionMargins(containingBlock, marginBefore, marginAfter); |
| 2905 style()->marginBeforeUsing(containingBlock->style()), | |
| 2906 style()->marginAfterUsing(containingBlock->style())); | |
| 2907 // Note that in this 'positioning phase' of the layout we are using the cont
aining block's writing mode rather than our own when calculating margins. | |
| 2908 // See http://www.w3.org/TR/2014/CR-css-writing-modes-3-20140320/#orthogonal
-flows | |
| 2909 containingBlock->setMarginBeforeForChild(this, marginBefore); | 2961 containingBlock->setMarginBeforeForChild(this, marginBefore); |
| 2910 containingBlock->setMarginAfterForChild(this, marginAfter); | 2962 containingBlock->setMarginAfterForChild(this, marginAfter); |
| 2911 } | 2963 } |
| 2912 | 2964 |
| 2913 LayoutUnit RenderBox::containingBlockLogicalWidthForPositioned(const RenderBoxMo
delObject* containingBlock, bool checkForPerpendicularWritingMode) const | 2965 LayoutUnit RenderBox::containingBlockLogicalWidthForPositioned(const RenderBoxMo
delObject* containingBlock, bool checkForPerpendicularWritingMode) const |
| 2914 { | 2966 { |
| 2915 if (checkForPerpendicularWritingMode && containingBlock->isHorizontalWriting
Mode() != isHorizontalWritingMode()) | 2967 if (checkForPerpendicularWritingMode && containingBlock->isHorizontalWriting
Mode() != isHorizontalWritingMode()) |
| 2916 return containingBlockLogicalHeightForPositioned(containingBlock, false)
; | 2968 return containingBlockLogicalHeightForPositioned(containingBlock, false)
; |
| 2917 | 2969 |
| 2918 // Use viewport as container for top-level fixed-position elements. | 2970 // Use viewport as container for top-level fixed-position elements. |
| (...skipping 1712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4631 return 0; | 4683 return 0; |
| 4632 | 4684 |
| 4633 if (!layoutState && !flowThreadContainingBlock()) | 4685 if (!layoutState && !flowThreadContainingBlock()) |
| 4634 return 0; | 4686 return 0; |
| 4635 | 4687 |
| 4636 RenderBlock* containerBlock = containingBlock(); | 4688 RenderBlock* containerBlock = containingBlock(); |
| 4637 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); | 4689 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); |
| 4638 } | 4690 } |
| 4639 | 4691 |
| 4640 } // namespace WebCore | 4692 } // namespace WebCore |
| OLD | NEW |