Changeset 104645 in webkit


Ignore:
Timestamp:
Jan 10, 2012 3:52:56 PM (12 years ago)
Author:
tony@chromium.org
Message:

Need to handle absolutely positioned elements inside flexboxes
https://bugs.webkit.org/show_bug.cgi?id=70793

Reviewed by David Hyatt.

Source/WebCore:

Tests: css3/flexbox/insert-text-crash.html

css3/flexbox/position-absolute-child.html

  • rendering/RenderFlexibleBox.cpp:

(WebCore::RenderFlexibleBox::computePreferredMainAxisExtent): Skip the size of positioned elements.
(WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithm): Add placeholders for positioned elements.
(WebCore::RenderFlexibleBox::prepareChildForPositionedLayout): Positions the layer for the positioned child.
(WebCore::RenderFlexibleBox::layoutAndPlaceChildren): Handle positioned elements.
(WebCore::RenderFlexibleBox::layoutColumnReverse): Adjust the main axis offset of the layer for positioned elements.

  • rendering/RenderFlexibleBox.h:

LayoutTests:

  • css3/flexbox/insert-text-crash-expected.txt: Added.
  • css3/flexbox/insert-text-crash.html: Added.
  • css3/flexbox/position-absolute-child-expected.txt: Added.
  • css3/flexbox/position-absolute-child.html: Added.
Location:
trunk
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r104642 r104645  
     12012-01-10  Tony Chang  <tony@chromium.org>
     2
     3        Need to handle absolutely positioned elements inside flexboxes
     4        https://bugs.webkit.org/show_bug.cgi?id=70793
     5
     6        Reviewed by David Hyatt.
     7
     8        * css3/flexbox/insert-text-crash-expected.txt: Added.
     9        * css3/flexbox/insert-text-crash.html: Added.
     10        * css3/flexbox/position-absolute-child-expected.txt: Added.
     11        * css3/flexbox/position-absolute-child.html: Added.
     12
    1132012-01-10  Ryosuke Niwa  <rniwa@webkit.org>
    214
  • trunk/Source/WebCore/ChangeLog

    r104644 r104645  
     12012-01-10  Tony Chang  <tony@chromium.org>
     2
     3        Need to handle absolutely positioned elements inside flexboxes
     4        https://bugs.webkit.org/show_bug.cgi?id=70793
     5
     6        Reviewed by David Hyatt.
     7
     8        Tests: css3/flexbox/insert-text-crash.html
     9               css3/flexbox/position-absolute-child.html
     10
     11        * rendering/RenderFlexibleBox.cpp:
     12        (WebCore::RenderFlexibleBox::computePreferredMainAxisExtent): Skip the size of positioned elements.
     13        (WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithm): Add placeholders for positioned elements.
     14        (WebCore::RenderFlexibleBox::prepareChildForPositionedLayout): Positions the layer for the positioned child.
     15        (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): Handle positioned elements.
     16        (WebCore::RenderFlexibleBox::layoutColumnReverse): Adjust the main axis offset of the layer for positioned elements.
     17        * rendering/RenderFlexibleBox.h:
     18
    1192012-01-10  Nat Duca  <nduca@chromium.org>
    220
  • trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp

    r104625 r104645  
    3333
    3434#include "LayoutRepainter.h"
     35#include "RenderLayer.h"
    3536#include "RenderView.h"
    3637
     
    489490    LayoutUnit flexboxAvailableContentExtent = mainAxisContentExtent();
    490491    for (RenderBox* child = iterator.first(); child; child = iterator.next()) {
     492        if (child->isPositioned())
     493            continue;
     494
    491495        child->clearOverrideSize();
    492496        if (mainAxisLengthForChild(child).isAuto()) {
     
    524528    LayoutUnit flexboxAvailableContentExtent = mainAxisContentExtent();
    525529    for (RenderBox* child = iterator.first(); child; child = iterator.next()) {
     530        if (child->isPositioned()) {
     531            childSizes.append(0);
     532            continue;
     533        }
     534
    526535        LayoutUnit childPreferredSize;
    527536        if (inflexibleItems.contains(child))
     
    592601}
    593602
     603void RenderFlexibleBox::prepareChildForPositionedLayout(RenderBox* child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset)
     604{
     605    ASSERT(child->isPositioned());
     606    child->containingBlock()->insertPositionedObject(child);
     607    RenderLayer* childLayer = child->layer();
     608    LayoutUnit inlinePosition = isColumnFlow() ? crossAxisOffset : mainAxisOffset;
     609    if (style()->flexDirection() == FlowRowReverse)
     610        inlinePosition = mainAxisExtent() - mainAxisOffset;
     611    childLayer->setStaticInlinePosition(inlinePosition); // FIXME: Not right for regions.
     612
     613    LayoutUnit staticBlockPosition = isColumnFlow() ? mainAxisOffset : crossAxisOffset;
     614    if (childLayer->staticBlockPosition() != staticBlockPosition) {
     615        childLayer->setStaticBlockPosition(staticBlockPosition);
     616        if (child->style()->hasStaticBlockPosition(style()->isHorizontalWritingMode()))
     617            child->setChildNeedsLayout(true, false);
     618    }
     619}
     620
    594621void RenderFlexibleBox::layoutAndPlaceChildren(FlexOrderIterator& iterator, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)
    595622{
     
    603630    size_t i = 0;
    604631    for (RenderBox* child = iterator.first(); child; child = iterator.next(), ++i) {
     632        if (child->isPositioned()) {
     633            prepareChildForPositionedLayout(child, mainAxisOffset, crossAxisOffset);
     634            mainAxisOffset += packingSpaceBetweenChildren(availableFreeSpace, totalPositiveFlexibility, style()->flexPack(), childSizes.size());
     635            continue;
     636        }
    605637        LayoutUnit childPreferredSize = childSizes[i] + mainAxisBorderAndPaddingExtentForChild(child);
    606638        setLogicalOverrideSize(child, childPreferredSize);
     
    658690    size_t i = 0;
    659691    for (RenderBox* child = iterator.first(); child; child = iterator.next(), ++i) {
     692        if (child->isPositioned()) {
     693            child->layer()->setStaticBlockPosition(mainAxisOffset);
     694            mainAxisOffset -= packingSpaceBetweenChildren(availableFreeSpace, totalPositiveFlexibility, style()->flexPack(), childSizes.size());
     695            continue;
     696        }
    660697        mainAxisOffset -= mainAxisExtentForChild(child) + flowAwareMarginEndForChild(child);
    661698
  • trunk/Source/WebCore/rendering/RenderFlexibleBox.h

    r102090 r104645  
    9797    bool runFreeSpaceAllocationAlgorithm(FlexOrderIterator&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes);
    9898    void setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize);
     99    void prepareChildForPositionedLayout(RenderBox* child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset);
    99100    void layoutAndPlaceChildren(FlexOrderIterator&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);
    100101    void layoutColumnReverse(FlexOrderIterator&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);
Note: See TracChangeset for help on using the changeset viewer.