Changeset 97783 in webkit


Ignore:
Timestamp:
Oct 18, 2011 12:35:14 PM (12 years ago)
Author:
ojan@chromium.org
Message:

implement flex-flow:column
https://bugs.webkit.org/show_bug.cgi?id=70082

Reviewed by David Hyatt.

Source/WebCore:

There's still a bug with a FIXME where we don't compute the right
size for the container of the flexbox in the presence of
orthogonal flows. That's the cause of all the failing cases
in the tests.

Tests: css3/flexbox/flex-flow-border.html

css3/flexbox/flex-flow-margins.html
css3/flexbox/flex-flow-orientations.html
css3/flexbox/flex-flow-overflow.html
css3/flexbox/flex-flow-padding.html
css3/flexbox/flex-flow.html

  • rendering/RenderFlexibleBox.cpp:

(WebCore::RenderFlexibleBox::layoutBlock):
(WebCore::RenderFlexibleBox::hasOrthogonalFlow):
(WebCore::RenderFlexibleBox::isColumnFlow):
(WebCore::RenderFlexibleBox::isHorizontalFlow):
(WebCore::RenderFlexibleBox::isLeftToRightFlow):
Use isHorizontalFlow and isLeftToRightFlow so that methods like
flowAwareBorderStart look exactly like borderStart with
isHorizontalWritingMode and isLeftToRightDirection replaced.

(WebCore::RenderFlexibleBox::setFlowAwareLogicalHeight):
(WebCore::RenderFlexibleBox::flowAwareLogicalHeightForChild):
(WebCore::RenderFlexibleBox::flowAwareLogicalWidthForChild):
(WebCore::RenderFlexibleBox::flowAwareLogicalHeight):
(WebCore::RenderFlexibleBox::flowAwareLogicalWidth):
(WebCore::RenderFlexibleBox::flowAwareContentLogicalHeight):
(WebCore::RenderFlexibleBox::flowAwareContentLogicalWidth):
(WebCore::RenderFlexibleBox::transformedWritingMode):
Transform the writing-mode based of the flex-flow and direction
values. That methods like flowAwareBorderBefore look exactly like
borderBefore, except it switches over a different value.

(WebCore::RenderFlexibleBox::flowAwareBorderStart):
(WebCore::RenderFlexibleBox::flowAwareBorderBefore):
(WebCore::RenderFlexibleBox::flowAwareBorderAfter):
(WebCore::RenderFlexibleBox::flowAwarePaddingStart):
(WebCore::RenderFlexibleBox::flowAwarePaddingBefore):
(WebCore::RenderFlexibleBox::flowAwarePaddingAfter):
(WebCore::RenderFlexibleBox::flowAwareMarginStartForChild):
(WebCore::RenderFlexibleBox::flowAwareMarginEndForChild):
(WebCore::RenderFlexibleBox::flowAwareMarginBeforeForChild):
(WebCore::RenderFlexibleBox::flowAwareMarginAfterForChild):
(WebCore::RenderFlexibleBox::setFlowAwareMarginStartForChild):
(WebCore::RenderFlexibleBox::setFlowAwareMarginEndForChild):
(WebCore::RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection):
(WebCore::RenderFlexibleBox::alignChildrenBlockDirection):

  • rendering/RenderFlexibleBox.h:

LayoutTests:

  • css3/flexbox/flex-flow-border-expected.txt: Added.
  • css3/flexbox/flex-flow-border.html: Added.

Failures are due to not handling orthogonal flows correctly.

  • css3/flexbox/flex-flow-expected.txt: Added.
  • css3/flexbox/flex-flow-margins-expected.txt: Added.
  • css3/flexbox/flex-flow-margins.html: Added.
  • css3/flexbox/flex-flow-orientations-expected.txt: Added.
  • css3/flexbox/flex-flow-orientations.html: Added.
  • css3/flexbox/flex-flow-overflow-expected.txt: Added.
  • css3/flexbox/flex-flow-overflow.html: Added.
  • css3/flexbox/flex-flow-padding-expected.txt: Added.
  • css3/flexbox/flex-flow-padding.html: Added.

Failures are due to not handling orthogonal flows correctly.

  • css3/flexbox/flex-flow.html: Added.
  • css3/flexbox/resources/flexbox.js:

Added the ability to check offsets that include clientLeft/clientTop
and for checking clientWidth/clientHeight. This is neede dfor the border tests.

Location:
trunk
Files:
12 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r97775 r97783  
     12011-10-13  Ojan Vafai  <ojan@chromium.org>
     2
     3        implement flex-flow:column
     4        https://bugs.webkit.org/show_bug.cgi?id=70082
     5
     6        Reviewed by David Hyatt.
     7
     8        * css3/flexbox/flex-flow-border-expected.txt: Added.
     9        * css3/flexbox/flex-flow-border.html: Added.
     10        Failures are due to not handling orthogonal flows correctly.
     11        * css3/flexbox/flex-flow-expected.txt: Added.
     12        * css3/flexbox/flex-flow-margins-expected.txt: Added.
     13        * css3/flexbox/flex-flow-margins.html: Added.
     14        * css3/flexbox/flex-flow-orientations-expected.txt: Added.
     15        * css3/flexbox/flex-flow-orientations.html: Added.
     16        * css3/flexbox/flex-flow-overflow-expected.txt: Added.
     17        * css3/flexbox/flex-flow-overflow.html: Added.
     18        * css3/flexbox/flex-flow-padding-expected.txt: Added.
     19        * css3/flexbox/flex-flow-padding.html: Added.
     20        Failures are due to not handling orthogonal flows correctly.
     21        * css3/flexbox/flex-flow.html: Added.
     22        * css3/flexbox/resources/flexbox.js:
     23        Added the ability to check offsets that include clientLeft/clientTop
     24        and for checking clientWidth/clientHeight. This is neede dfor the border tests.
     25
    1262011-10-18  Cary Clark  <caryclark@google.com>
    227
  • trunk/LayoutTests/css3/flexbox/resources/flexbox.js

    r96851 r97783  
    4040            failures.push("Expected " + expectedOffset + " for offsetTop, but got " + node.offsetTop + ". ");
    4141    }
     42
     43    var expectedWidth = node.getAttribute && node.getAttribute("data-expected-client-width");
     44    if (expectedWidth) {
     45        if (node.clientWidth != parseInt(expectedWidth))
     46            failures.push("Expected " + expectedWidth + " for clientWidth, but got " + node.clientWidth + ". ");
     47    }
     48
     49    var expectedHeight = node.getAttribute && node.getAttribute("data-expected-client-height");
     50    if (expectedHeight) {
     51        if (node.clientHeight != parseInt(expectedHeight))
     52            failures.push("Expected " + expectedHeight + " for clientHeight, but got " + node.clientHeight + ". ");
     53    }
     54
     55    var expectedOffset = node.getAttribute && node.getAttribute("data-total-x");
     56    if (expectedOffset) {
     57        var totalLeft = node.clientLeft + node.offsetLeft;
     58        if (totalLeft != parseInt(expectedOffset))
     59            failures.push("Expected " + expectedOffset + " for clientLeft+offsetLeft, but got " + totalLeft + ", clientLeft: " + node.clientLeft + ", offsetLeft: " + node.offsetLeft + ". ");
     60    }
     61
     62    var expectedOffset = node.getAttribute && node.getAttribute("data-total-y");
     63    if (expectedOffset) {
     64        var totalTop = node.clientTop + node.offsetTop;
     65        if (totalTop != parseInt(expectedOffset))
     66            failures.push("Expected " + expectedOffset + " for clientTop+offsetTop, but got " + totalTop + ", clientTop: " + node.clientTop + ", + offsetTop: " + node.offsetTop + ". ");
     67    }
    4268}
    4369
     
    5076        checkSubtreeExpectedValues(flexbox, failures);
    5177
     78        var container = flexbox.parentNode.className == 'container' ? flexbox.parentNode : flexbox;
     79
    5280        var pre = document.createElement('pre');
    53         pre.appendChild(document.createTextNode(failures.length ? "FAIL:\n" + failures.join('\n') + '\n\n' + flexbox.outerHTML : "PASS"));
    54         insertAfter(pre, flexbox);
     81        if (failures.length)
     82            pre.className = 'FAIL';
     83        pre.appendChild(document.createTextNode(failures.length ? "FAIL:\n" + failures.join('\n') + '\n\n' + container.outerHTML : "PASS"));
     84        insertAfter(pre, container);
    5585    });
     86    var pre = document.querySelector('.FAIL');
     87    if (pre)
     88        setTimeout(function() { pre.previousSibling.scrollIntoView(); }, 0);
    5689}
  • trunk/Source/WebCore/ChangeLog

    r97780 r97783  
     12011-10-13  Ojan Vafai  <ojan@chromium.org>
     2
     3        implement flex-flow:column
     4        https://bugs.webkit.org/show_bug.cgi?id=70082
     5
     6        Reviewed by David Hyatt.
     7
     8        There's still a bug with a FIXME where we don't compute the right
     9        size for the container of the flexbox in the presence of
     10        orthogonal flows. That's the cause of all the failing cases
     11        in the tests.
     12
     13        Tests: css3/flexbox/flex-flow-border.html
     14               css3/flexbox/flex-flow-margins.html
     15               css3/flexbox/flex-flow-orientations.html
     16               css3/flexbox/flex-flow-overflow.html
     17               css3/flexbox/flex-flow-padding.html
     18               css3/flexbox/flex-flow.html
     19
     20        * rendering/RenderFlexibleBox.cpp:
     21        (WebCore::RenderFlexibleBox::layoutBlock):
     22        (WebCore::RenderFlexibleBox::hasOrthogonalFlow):
     23        (WebCore::RenderFlexibleBox::isColumnFlow):
     24        (WebCore::RenderFlexibleBox::isHorizontalFlow):
     25        (WebCore::RenderFlexibleBox::isLeftToRightFlow):
     26        Use isHorizontalFlow and isLeftToRightFlow so that methods like
     27        flowAwareBorderStart look exactly like borderStart with
     28        isHorizontalWritingMode and isLeftToRightDirection replaced.
     29
     30        (WebCore::RenderFlexibleBox::setFlowAwareLogicalHeight):
     31        (WebCore::RenderFlexibleBox::flowAwareLogicalHeightForChild):
     32        (WebCore::RenderFlexibleBox::flowAwareLogicalWidthForChild):
     33        (WebCore::RenderFlexibleBox::flowAwareLogicalHeight):
     34        (WebCore::RenderFlexibleBox::flowAwareLogicalWidth):
     35        (WebCore::RenderFlexibleBox::flowAwareContentLogicalHeight):
     36        (WebCore::RenderFlexibleBox::flowAwareContentLogicalWidth):
     37        (WebCore::RenderFlexibleBox::transformedWritingMode):
     38        Transform the writing-mode based of the flex-flow and direction
     39        values. That methods like flowAwareBorderBefore look exactly like
     40        borderBefore, except it switches over a different value.
     41
     42        (WebCore::RenderFlexibleBox::flowAwareBorderStart):
     43        (WebCore::RenderFlexibleBox::flowAwareBorderBefore):
     44        (WebCore::RenderFlexibleBox::flowAwareBorderAfter):
     45        (WebCore::RenderFlexibleBox::flowAwarePaddingStart):
     46        (WebCore::RenderFlexibleBox::flowAwarePaddingBefore):
     47        (WebCore::RenderFlexibleBox::flowAwarePaddingAfter):
     48        (WebCore::RenderFlexibleBox::flowAwareMarginStartForChild):
     49        (WebCore::RenderFlexibleBox::flowAwareMarginEndForChild):
     50        (WebCore::RenderFlexibleBox::flowAwareMarginBeforeForChild):
     51        (WebCore::RenderFlexibleBox::flowAwareMarginAfterForChild):
     52        (WebCore::RenderFlexibleBox::setFlowAwareMarginStartForChild):
     53        (WebCore::RenderFlexibleBox::setFlowAwareMarginEndForChild):
     54        (WebCore::RenderFlexibleBox::layoutAndPlaceChildrenInlineDirection):
     55        (WebCore::RenderFlexibleBox::alignChildrenBlockDirection):
     56        * rendering/RenderFlexibleBox.h:
     57
    1582011-10-18  Shawn Singh  <shawnsingh@chromium.org>
    259
  • trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp

    r97313 r97783  
    176176    layoutInlineDirection(relayoutChildren);
    177177
     178    // FIXME: We should only need to call one of these for a given flex-flow + writing-mode combination.
     179    // Is that true above as well?
     180    computeLogicalWidth();
    178181    computeLogicalHeight();
    179182
     
    190193bool RenderFlexibleBox::hasOrthogonalFlow(RenderBox* child) const
    191194{
    192     // FIXME: Is the child->isHorizontalWritingMode() check correct if the child is a flexbox?
    193     // Should it be using child->isHorizontalFlow in that case?
    194     // Or do we only care about the parent's writing mode?
     195    // FIXME: If the child is a flexbox, then we need to check isHorizontalFlow.
    195196    return isHorizontalFlow() != child->isHorizontalWritingMode();
    196197}
    197198
     199bool RenderFlexibleBox::isColumnFlow() const
     200{
     201    EFlexFlow flow = style()->flexFlow();
     202    return flow == FlowColumn || flow == FlowColumnReverse;
     203}
     204
    198205bool RenderFlexibleBox::isHorizontalFlow() const
    199206{
    200     // FIXME: Take flex-flow value into account.
    201     return isHorizontalWritingMode();
     207    if (isHorizontalWritingMode())
     208        return !isColumnFlow();
     209    return isColumnFlow();
    202210}
    203211
    204212bool RenderFlexibleBox::isLeftToRightFlow() const
    205213{
    206     // FIXME: Take flex-flow value into account.
     214    if (isColumnFlow())
     215        return style()->writingMode() == TopToBottomWritingMode || style()->writingMode() == LeftToRightWritingMode;
    207216    return style()->isLeftToRightDirection();
    208217}
    209 
    210 // FIXME: Make all these flow aware methods actually be flow aware.
    211218
    212219bool RenderFlexibleBox::isFlowAwareLogicalHeightAuto() const
     
    218225void RenderFlexibleBox::setFlowAwareLogicalHeight(LayoutUnit size)
    219226{
    220     setLogicalHeight(size);
     227    if (isHorizontalFlow())
     228        setHeight(size);
     229    else
     230        setWidth(size);
    221231}
    222232
    223233LayoutUnit RenderFlexibleBox::flowAwareLogicalHeightForChild(RenderBox* child)
    224234{
    225     return logicalHeightForChild(child);
     235    return isHorizontalFlow() ? child->height() : child->width();
    226236}
    227237
    228238LayoutUnit RenderFlexibleBox::flowAwareLogicalWidthForChild(RenderBox* child)
    229239{
    230     return logicalWidthForChild(child);
     240    return isHorizontalFlow() ? child->width() : child->height();
    231241}
    232242
    233243LayoutUnit RenderFlexibleBox::flowAwareLogicalHeight() const
    234244{
    235     return logicalHeight();
     245    return isHorizontalFlow() ? height() : width();
    236246}
    237247
    238248LayoutUnit RenderFlexibleBox::flowAwareLogicalWidth() const
    239249{
    240     return logicalWidth();
     250    return isHorizontalFlow() ? width() : height();
    241251}
    242252
    243253LayoutUnit RenderFlexibleBox::flowAwareContentLogicalHeight() const
    244254{
    245     return contentLogicalHeight();
     255    return isHorizontalFlow() ? contentHeight() : contentWidth();
    246256}
    247257
    248258LayoutUnit RenderFlexibleBox::flowAwareContentLogicalWidth() const
    249259{
    250     return contentLogicalWidth();
     260    return isHorizontalFlow() ? contentWidth() : contentHeight();
     261}
     262
     263WritingMode RenderFlexibleBox::transformedWritingMode() const
     264{
     265    WritingMode mode = style()->writingMode();
     266    if (!isColumnFlow())
     267        return mode;
     268
     269    switch (mode) {
     270    case TopToBottomWritingMode:
     271    case BottomToTopWritingMode:
     272        return style()->isLeftToRightDirection() ? LeftToRightWritingMode : RightToLeftWritingMode;
     273    case LeftToRightWritingMode:
     274    case RightToLeftWritingMode:
     275        return style()->isLeftToRightDirection() ? TopToBottomWritingMode : BottomToTopWritingMode;
     276    }
     277    ASSERT_NOT_REACHED();
     278    return TopToBottomWritingMode;
    251279}
    252280
    253281LayoutUnit RenderFlexibleBox::flowAwareBorderStart() const
    254282{
    255     return borderStart();
     283    if (isHorizontalFlow())
     284        return isLeftToRightFlow() ? borderLeft() : borderRight();
     285    return isLeftToRightFlow() ? borderTop() : borderBottom();
    256286}
    257287
    258288LayoutUnit RenderFlexibleBox::flowAwareBorderBefore() const
    259289{
    260     return borderBefore();
     290    switch (transformedWritingMode()) {
     291    case TopToBottomWritingMode:
     292        return borderTop();
     293    case BottomToTopWritingMode:
     294        return borderBottom();
     295    case LeftToRightWritingMode:
     296        return borderLeft();
     297    case RightToLeftWritingMode:
     298        return borderRight();
     299    }
     300    ASSERT_NOT_REACHED();
     301    return borderTop();
    261302}
    262303
    263304LayoutUnit RenderFlexibleBox::flowAwareBorderAfter() const
    264305{
    265     return borderAfter();
     306    switch (transformedWritingMode()) {
     307    case TopToBottomWritingMode:
     308        return borderBottom();
     309    case BottomToTopWritingMode:
     310        return borderTop();
     311    case LeftToRightWritingMode:
     312        return borderRight();
     313    case RightToLeftWritingMode:
     314        return borderLeft();
     315    }
     316    ASSERT_NOT_REACHED();
     317    return borderBottom();
    266318}
    267319
     
    274326LayoutUnit RenderFlexibleBox::flowAwarePaddingStart() const
    275327{
    276     return paddingStart();
     328    if (isHorizontalFlow())
     329        return isLeftToRightFlow() ? paddingLeft() : paddingRight();
     330    return isLeftToRightFlow() ? paddingTop() : paddingBottom();
    277331}
    278332
    279333LayoutUnit RenderFlexibleBox::flowAwarePaddingBefore() const
    280334{
    281     return paddingBefore();
     335    switch (transformedWritingMode()) {
     336    case TopToBottomWritingMode:
     337        return paddingTop();
     338    case BottomToTopWritingMode:
     339        return paddingBottom();
     340    case LeftToRightWritingMode:
     341        return paddingLeft();
     342    case RightToLeftWritingMode:
     343        return paddingRight();
     344    }
     345    ASSERT_NOT_REACHED();
     346    return paddingTop();
    282347}
    283348
    284349LayoutUnit RenderFlexibleBox::flowAwarePaddingAfter() const
    285350{
    286     return paddingAfter();
     351    switch (transformedWritingMode()) {
     352    case TopToBottomWritingMode:
     353        return paddingBottom();
     354    case BottomToTopWritingMode:
     355        return paddingTop();
     356    case LeftToRightWritingMode:
     357        return paddingRight();
     358    case RightToLeftWritingMode:
     359        return paddingLeft();
     360    }
     361    ASSERT_NOT_REACHED();
     362    return paddingBottom();
    287363}
    288364
    289365LayoutUnit RenderFlexibleBox::flowAwareMarginStartForChild(RenderBox* child) const
    290366{
    291     return marginStartForChild(child);
     367    if (isHorizontalFlow())
     368        return isLeftToRightFlow() ? child->marginLeft() : child->marginRight();
     369    return isLeftToRightFlow() ? child->marginTop() : child->marginBottom();
    292370}
    293371
    294372LayoutUnit RenderFlexibleBox::flowAwareMarginEndForChild(RenderBox* child) const
    295373{
    296     return marginStartForChild(child);
     374    if (isHorizontalFlow())
     375        return isLeftToRightFlow() ? child->marginRight() : child->marginLeft();
     376    return isLeftToRightFlow() ? child->marginBottom() : child->marginTop();
    297377}
    298378
    299379LayoutUnit RenderFlexibleBox::flowAwareMarginBeforeForChild(RenderBox* child) const
    300380{
    301     return marginBeforeForChild(child);
     381    switch (transformedWritingMode()) {
     382    case TopToBottomWritingMode:
     383        return child->marginTop();
     384    case BottomToTopWritingMode:
     385        return child->marginBottom();
     386    case LeftToRightWritingMode:
     387        return child->marginLeft();
     388    case RightToLeftWritingMode:
     389        return child->marginRight();
     390    }
     391    ASSERT_NOT_REACHED();
     392    return marginTop();
    302393}
    303394
    304395LayoutUnit RenderFlexibleBox::flowAwareMarginAfterForChild(RenderBox* child) const
    305396{
    306     return marginAfterForChild(child);
     397    switch (transformedWritingMode()) {
     398    case TopToBottomWritingMode:
     399        return child->marginBottom();
     400    case BottomToTopWritingMode:
     401        return child->marginTop();
     402    case LeftToRightWritingMode:
     403        return child->marginRight();
     404    case RightToLeftWritingMode:
     405        return child->marginLeft();
     406    }
     407    ASSERT_NOT_REACHED();
     408    return marginBottom();
    307409}
    308410
     
    320422void RenderFlexibleBox::setFlowAwareMarginStartForChild(RenderBox* child, LayoutUnit margin)
    321423{
    322     setMarginStartForChild(child, margin);
     424    if (isHorizontalFlow()) {
     425        if (isLeftToRightFlow())
     426            child->setMarginLeft(margin);
     427        else
     428            child->setMarginRight(margin);
     429    } else {
     430        if (isLeftToRightFlow())
     431            child->setMarginTop(margin);
     432        else
     433            child->setMarginBottom(margin);
     434    }
    323435}
    324436
    325437void RenderFlexibleBox::setFlowAwareMarginEndForChild(RenderBox* child, LayoutUnit margin)
    326438{
    327     setMarginEndForChild(child, margin);
     439    if (isHorizontalFlow()) {
     440        if (isLeftToRightFlow())
     441            child->setMarginRight(margin);
     442        else
     443            child->setMarginLeft(margin);
     444    } else {
     445        if (isLeftToRightFlow())
     446            child->setMarginBottom(margin);
     447        else
     448            child->setMarginTop(margin);
     449    }
    328450}
    329451
     
    548670
    549671        LayoutUnit childLogicalWidth = flowAwareLogicalWidthForChild(child);
    550         LayoutUnit logicalLeft = isLeftToRightFlow() ? startEdge : totalLogicalWidth - startEdge - childLogicalWidth;
     672        bool shouldFlipInlineDirection = isColumnFlow() ? true : isLeftToRightFlow();
     673        LayoutUnit logicalLeft = shouldFlipInlineDirection ? startEdge : totalLogicalWidth - startEdge - childLogicalWidth;
     674
    551675        // FIXME: Do repaintDuringLayoutIfMoved.
    552676        // FIXME: Supporting layout deltas.
    553677        setFlowAwareLogicalLocationForChild(child, IntPoint(logicalLeft, logicalTop + flowAwareMarginBeforeForChild(child)));
    554         startEdge += childLogicalWidth + marginEndForChild(child);
     678        startEdge += childLogicalWidth + flowAwareMarginEndForChild(child);
    555679
    556680        if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility) && style()->flexPack() == PackJustify && childSizes.size() > 1)
     
    568692void RenderFlexibleBox::alignChildrenBlockDirection(FlexOrderIterator& iterator, LayoutUnit maxAscent)
    569693{
     694    LayoutUnit logicalHeight = flowAwareLogicalHeight();
     695
    570696    for (RenderBox* child = iterator.first(); child; child = iterator.next()) {
     697        // direction:rtl + flex-flow:column means the cross-axis direction is flipped.
     698        if (!style()->isLeftToRightDirection() && isColumnFlow()) {
     699            LayoutPoint location = flowAwareLogicalLocationForChild(child);
     700            location.setY(logicalHeight - flowAwareLogicalHeightForChild(child) - location.y());
     701            setFlowAwareLogicalLocationForChild(child, location);
     702        }
     703
     704        // FIXME: Make sure this does the right thing with column flows.
    571705        switch (child->style()->flexAlign()) {
    572706        case AlignStretch: {
  • trunk/Source/WebCore/rendering/RenderFlexibleBox.h

    r97313 r97783  
    5454    typedef WTF::HashMap<const RenderBox*, LayoutUnit> InflexibleFlexItemSize;
    5555
     56    // FIXME: Implement computePreferredLogicalWidths since it needs to be flow-aware.
    5657    bool hasOrthogonalFlow(RenderBox* child) const;
     58    bool isColumnFlow() const;
    5759    bool isHorizontalFlow() const;
    5860    bool isLeftToRightFlow() const;
     
    6567    LayoutUnit flowAwareContentLogicalHeight() const;
    6668    LayoutUnit flowAwareContentLogicalWidth() const;
     69    WritingMode transformedWritingMode() const;
    6770    LayoutUnit flowAwareBorderStart() const;
    6871    LayoutUnit flowAwareBorderBefore() const;
Note: See TracChangeset for help on using the changeset viewer.