Changeset 79618 in webkit


Ignore:
Timestamp:
Feb 24, 2011 2:08:55 PM (13 years ago)
Author:
hyatt@apple.com
Message:

https://bugs.webkit.org/show_bug.cgi?id=46500, make positioned elements work with vertical text.

Reviewed by Simon Fraser.

Rework the logical height computation for positioned elements to work in terms of before and after. That way the offset is determined from
the correct container side in flipped block writing modes (e.g., vertical-rl).

Patch locationOffsetIncludingFlipping to use the containing block to flip so that it will behave correctly with absolute/fixed positioned
elements.

Patch offsetFromContainer to use the flipped location offset for absolute/fixed positioned elements so that localToAbsolute works properly.

Added twelve tests in fast/block/positioning/vertical-rl and fast/block/positioning/vertical-lr.

Source/WebCore:

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::offsetFromContainer):
(WebCore::RenderBox::computePositionedLogicalHeight):
(WebCore::RenderBox::computePositionedLogicalHeightUsing):
(WebCore::RenderBox::locationOffsetIncludingFlipping):

  • rendering/style/RenderStyle.h:

(WebCore::InheritedFlags::logicalTop):
(WebCore::InheritedFlags::logicalBottom):

LayoutTests:

  • fast/block/positioning/vertical-lr: Added.
  • fast/block/positioning/vertical-lr/001.html: Added.
  • fast/block/positioning/vertical-lr/002.html: Added.
  • fast/block/positioning/vertical-lr/003.html: Added.
  • fast/block/positioning/vertical-lr/004.html: Added.
  • fast/block/positioning/vertical-lr/005.html: Added.
  • fast/block/positioning/vertical-lr/006.html: Added.
  • fast/block/positioning/vertical-rl: Added.
  • fast/block/positioning/vertical-rl/001.html: Added.
  • fast/block/positioning/vertical-rl/002.html: Added.
  • fast/block/positioning/vertical-rl/003.html: Added.
  • fast/block/positioning/vertical-rl/004.html: Added.
  • fast/block/positioning/vertical-rl/005.html: Added.
  • fast/block/positioning/vertical-rl/006.html: Added.
  • platform/mac/fast/block/positioning/vertical-lr: Added.
  • platform/mac/fast/block/positioning/vertical-lr/001-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-lr/001-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-lr/001-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-lr/002-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-lr/002-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-lr/002-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-lr/003-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-lr/003-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-lr/003-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-lr/004-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-lr/004-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-lr/004-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-lr/005-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-lr/005-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-lr/005-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-lr/006-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-lr/006-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-lr/006-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-rl: Added.
  • platform/mac/fast/block/positioning/vertical-rl/001-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-rl/001-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-rl/001-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-rl/002-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-rl/002-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-rl/002-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-rl/003-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-rl/003-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-rl/003-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-rl/004-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-rl/004-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-rl/004-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-rl/005-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-rl/005-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-rl/005-expected.txt: Added.
  • platform/mac/fast/block/positioning/vertical-rl/006-expected.checksum: Added.
  • platform/mac/fast/block/positioning/vertical-rl/006-expected.png: Added.
  • platform/mac/fast/block/positioning/vertical-rl/006-expected.txt: Added.
Location:
trunk
Files:
52 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r79617 r79618  
     12011-02-24  David Hyatt  <hyatt@apple.com>
     2
     3        Reviewed by Simon Fraser.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=46500, make positioned elements work with vertical text.
     6
     7        Rework the logical height computation for positioned elements to work in terms of before and after.  That way the offset is determined from
     8        the correct container side in flipped block writing modes (e.g., vertical-rl).
     9       
     10        Patch locationOffsetIncludingFlipping to use the containing block to flip so that it will behave correctly with absolute/fixed positioned
     11        elements.
     12       
     13        Patch offsetFromContainer to use the flipped location offset for absolute/fixed positioned elements so that localToAbsolute works properly.
     14
     15        Added twelve tests in fast/block/positioning/vertical-rl and fast/block/positioning/vertical-lr.
     16
     17        * fast/block/positioning/vertical-lr: Added.
     18        * fast/block/positioning/vertical-lr/001.html: Added.
     19        * fast/block/positioning/vertical-lr/002.html: Added.
     20        * fast/block/positioning/vertical-lr/003.html: Added.
     21        * fast/block/positioning/vertical-lr/004.html: Added.
     22        * fast/block/positioning/vertical-lr/005.html: Added.
     23        * fast/block/positioning/vertical-lr/006.html: Added.
     24        * fast/block/positioning/vertical-rl: Added.
     25        * fast/block/positioning/vertical-rl/001.html: Added.
     26        * fast/block/positioning/vertical-rl/002.html: Added.
     27        * fast/block/positioning/vertical-rl/003.html: Added.
     28        * fast/block/positioning/vertical-rl/004.html: Added.
     29        * fast/block/positioning/vertical-rl/005.html: Added.
     30        * fast/block/positioning/vertical-rl/006.html: Added.
     31        * platform/mac/fast/block/positioning/vertical-lr: Added.
     32        * platform/mac/fast/block/positioning/vertical-lr/001-expected.checksum: Added.
     33        * platform/mac/fast/block/positioning/vertical-lr/001-expected.png: Added.
     34        * platform/mac/fast/block/positioning/vertical-lr/001-expected.txt: Added.
     35        * platform/mac/fast/block/positioning/vertical-lr/002-expected.checksum: Added.
     36        * platform/mac/fast/block/positioning/vertical-lr/002-expected.png: Added.
     37        * platform/mac/fast/block/positioning/vertical-lr/002-expected.txt: Added.
     38        * platform/mac/fast/block/positioning/vertical-lr/003-expected.checksum: Added.
     39        * platform/mac/fast/block/positioning/vertical-lr/003-expected.png: Added.
     40        * platform/mac/fast/block/positioning/vertical-lr/003-expected.txt: Added.
     41        * platform/mac/fast/block/positioning/vertical-lr/004-expected.checksum: Added.
     42        * platform/mac/fast/block/positioning/vertical-lr/004-expected.png: Added.
     43        * platform/mac/fast/block/positioning/vertical-lr/004-expected.txt: Added.
     44        * platform/mac/fast/block/positioning/vertical-lr/005-expected.checksum: Added.
     45        * platform/mac/fast/block/positioning/vertical-lr/005-expected.png: Added.
     46        * platform/mac/fast/block/positioning/vertical-lr/005-expected.txt: Added.
     47        * platform/mac/fast/block/positioning/vertical-lr/006-expected.checksum: Added.
     48        * platform/mac/fast/block/positioning/vertical-lr/006-expected.png: Added.
     49        * platform/mac/fast/block/positioning/vertical-lr/006-expected.txt: Added.
     50        * platform/mac/fast/block/positioning/vertical-rl: Added.
     51        * platform/mac/fast/block/positioning/vertical-rl/001-expected.checksum: Added.
     52        * platform/mac/fast/block/positioning/vertical-rl/001-expected.png: Added.
     53        * platform/mac/fast/block/positioning/vertical-rl/001-expected.txt: Added.
     54        * platform/mac/fast/block/positioning/vertical-rl/002-expected.checksum: Added.
     55        * platform/mac/fast/block/positioning/vertical-rl/002-expected.png: Added.
     56        * platform/mac/fast/block/positioning/vertical-rl/002-expected.txt: Added.
     57        * platform/mac/fast/block/positioning/vertical-rl/003-expected.checksum: Added.
     58        * platform/mac/fast/block/positioning/vertical-rl/003-expected.png: Added.
     59        * platform/mac/fast/block/positioning/vertical-rl/003-expected.txt: Added.
     60        * platform/mac/fast/block/positioning/vertical-rl/004-expected.checksum: Added.
     61        * platform/mac/fast/block/positioning/vertical-rl/004-expected.png: Added.
     62        * platform/mac/fast/block/positioning/vertical-rl/004-expected.txt: Added.
     63        * platform/mac/fast/block/positioning/vertical-rl/005-expected.checksum: Added.
     64        * platform/mac/fast/block/positioning/vertical-rl/005-expected.png: Added.
     65        * platform/mac/fast/block/positioning/vertical-rl/005-expected.txt: Added.
     66        * platform/mac/fast/block/positioning/vertical-rl/006-expected.checksum: Added.
     67        * platform/mac/fast/block/positioning/vertical-rl/006-expected.png: Added.
     68        * platform/mac/fast/block/positioning/vertical-rl/006-expected.txt: Added.
     69
    1702011-02-24  Kenneth Russell  <kbr@google.com>
    271
  • trunk/Source/WebCore/ChangeLog

    r79616 r79618  
     12011-02-24  David Hyatt  <hyatt@apple.com>
     2
     3        Reviewed by Simon Fraser.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=46500, make positioned elements work with vertical text.
     6
     7        Rework the logical height computation for positioned elements to work in terms of before and after.  That way the offset is determined from
     8        the correct container side in flipped block writing modes (e.g., vertical-rl).
     9       
     10        Patch locationOffsetIncludingFlipping to use the containing block to flip so that it will behave correctly with absolute/fixed positioned
     11        elements.
     12       
     13        Patch offsetFromContainer to use the flipped location offset for absolute/fixed positioned elements so that localToAbsolute works properly.
     14
     15        Added twelve tests in fast/block/positioning/vertical-rl and fast/block/positioning/vertical-lr.
     16
     17        * rendering/RenderBox.cpp:
     18        (WebCore::RenderBox::offsetFromContainer):
     19        (WebCore::RenderBox::computePositionedLogicalHeight):
     20        (WebCore::RenderBox::computePositionedLogicalHeightUsing):
     21        (WebCore::RenderBox::locationOffsetIncludingFlipping):
     22        * rendering/style/RenderStyle.h:
     23        (WebCore::InheritedFlags::logicalTop):
     24        (WebCore::InheritedFlags::logicalBottom):
     25
    1262011-02-23  Oliver Hunt  <oliver@apple.com>
    227
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r79497 r79618  
    12761276                offset += locationOffsetIncludingFlipping();
    12771277        } else
    1278             offset += locationOffset();
     1278            offset += locationOffsetIncludingFlipping();
    12791279    }
    12801280
     
    24592459
    24602460    bool isHorizontal = style()->isHorizontalWritingMode();
     2461    bool isFlipped = style()->isFlippedBlocksWritingMode();
    24612462    const int bordersPlusPadding = borderAndPaddingLogicalHeight();
    2462     const Length marginLogicalTop = isHorizontal ? style()->marginTop() : style()->marginLeft();
    2463     const Length marginLogicalBottom = isHorizontal ? style()->marginBottom() : style()->marginRight();
    2464     int& marginLogicalTopAlias = isHorizontal ? m_marginTop : m_marginLeft;
    2465     int& marginLogicalBottomAlias = isHorizontal ? m_marginBottom : m_marginRight;
     2463    const Length marginBefore = style()->marginBefore();
     2464    const Length marginAfter = style()->marginAfter();
     2465    int& marginBeforeAlias = isHorizontal ? (isFlipped ? m_marginBottom : m_marginTop) : (isFlipped ? m_marginRight: m_marginLeft);
     2466    int& marginAfterAlias = isHorizontal ? (isFlipped ? m_marginTop : m_marginBottom) : (isFlipped ? m_marginLeft: m_marginRight);
    24662467
    24672468    Length logicalTop = style()->logicalTop();
    24682469    Length logicalBottom = style()->logicalBottom();
    2469 
     2470       
    24702471    /*---------------------------------------------------------------------------*\
    24712472     * For the purposes of this section and the next, the term "static position"
     
    25042505    // Calculate constraint equation values for 'height' case.
    25052506    computePositionedLogicalHeightUsing(style()->logicalHeight(), containerBlock, containerLogicalHeight, bordersPlusPadding,
    2506                                         logicalTop, logicalBottom, marginLogicalTop, marginLogicalBottom,
    2507                                         logicalHeightResult, marginLogicalTopAlias, marginLogicalBottomAlias, logicalTopPos);
     2507                                        logicalTop, logicalBottom, marginBefore, marginAfter,
     2508                                        logicalHeightResult, marginBeforeAlias, marginAfterAlias, logicalTopPos);
    25082509    setLogicalTop(logicalTopPos);
    25092510
     
    25142515    if (!style()->logicalMaxHeight().isUndefined()) {
    25152516        int maxLogicalHeight;
    2516         int maxMarginLogicalTop;
    2517         int maxMarginLogicalBottom;
     2517        int maxMarginBefore;
     2518        int maxMarginAfter;
    25182519        int maxLogicalTopPos;
    25192520
    25202521        computePositionedLogicalHeightUsing(style()->logicalMaxHeight(), containerBlock, containerLogicalHeight, bordersPlusPadding,
    2521                                             logicalTop, logicalBottom, marginLogicalTop, marginLogicalBottom,
    2522                                             maxLogicalHeight, maxMarginLogicalTop, maxMarginLogicalBottom, maxLogicalTopPos);
     2522                                            logicalTop, logicalBottom, marginBefore, marginAfter,
     2523                                            maxLogicalHeight, maxMarginBefore, maxMarginAfter, maxLogicalTopPos);
    25232524
    25242525        if (logicalHeightResult > maxLogicalHeight) {
    25252526            logicalHeightResult = maxLogicalHeight;
    2526             marginLogicalTopAlias = maxMarginLogicalTop;
    2527             marginLogicalBottomAlias = maxMarginLogicalBottom;
     2527            marginBeforeAlias = maxMarginBefore;
     2528            marginAfterAlias = maxMarginAfter;
    25282529            setLogicalTop(maxLogicalTopPos);
    25292530        }
     
    25332534    if (!style()->logicalMinHeight().isZero()) {
    25342535        int minLogicalHeight;
    2535         int minMarginLogicalTop;
    2536         int minMarginLogicalBottom;
     2536        int minMarginBefore;
     2537        int minMarginAfter;
    25372538        int minLogicalTopPos;
    25382539
    25392540        computePositionedLogicalHeightUsing(style()->logicalMinHeight(), containerBlock, containerLogicalHeight, bordersPlusPadding,
    2540                                             logicalTop, logicalBottom, marginLogicalTop, marginLogicalBottom,
    2541                                             minLogicalHeight, minMarginLogicalTop, minMarginLogicalBottom, minLogicalTopPos);
     2541                                            logicalTop, logicalBottom, marginBefore, marginAfter,
     2542                                            minLogicalHeight, minMarginBefore, minMarginAfter, minLogicalTopPos);
    25422543
    25432544        if (logicalHeightResult < minLogicalHeight) {
    25442545            logicalHeightResult = minLogicalHeight;
    2545             marginLogicalTopAlias = minMarginLogicalTop;
    2546             marginLogicalBottomAlias = minMarginLogicalBottom;
     2546            marginBeforeAlias = minMarginBefore;
     2547            marginAfterAlias = minMarginAfter;
    25472548            setLogicalTop(minLogicalTopPos);
    25482549        }
     
    25552556void RenderBox::computePositionedLogicalHeightUsing(Length logicalHeightLength, const RenderBoxModelObject* containerBlock,
    25562557                                                    int containerLogicalHeight, int bordersPlusPadding,
    2557                                                     Length logicalTop, Length logicalBottom, Length marginLogicalTop, Length marginLogicalBottom,
    2558                                                     int& logicalHeightValue, int& marginLogicalTopValue, int& marginLogicalBottomValue, int& logicalTopPos)
     2558                                                    Length logicalTop, Length logicalBottom, Length marginBefore, Length marginAfter,
     2559                                                    int& logicalHeightValue, int& marginBeforeValue, int& marginAfterValue, int& logicalTopPos)
    25592560{
    25602561    // 'top' and 'bottom' cannot both be 'auto' because 'top would of been
     
    25942595
    25952596        // Margins are now the only unknown
    2596         if (marginLogicalTop.isAuto() && marginLogicalBottom.isAuto()) {
     2597        if (marginBefore.isAuto() && marginAfter.isAuto()) {
    25972598            // Both margins auto, solve for equality
    25982599            // NOTE: This may result in negative values.
    2599             marginLogicalTopValue = availableSpace / 2; // split the difference
    2600             marginLogicalBottomValue = availableSpace - marginLogicalTopValue; // account for odd valued differences
    2601         } else if (marginLogicalTop.isAuto()) {
     2600            marginBeforeValue = availableSpace / 2; // split the difference
     2601            marginAfterValue = availableSpace - marginBeforeValue; // account for odd valued differences
     2602        } else if (marginBefore.isAuto()) {
    26022603            // Solve for top margin
    2603             marginLogicalBottomValue = marginLogicalBottom.calcValue(containerLogicalHeight);
    2604             marginLogicalTopValue = availableSpace - marginLogicalBottomValue;
    2605         } else if (marginLogicalBottom.isAuto()) {
     2604            marginAfterValue = marginAfter.calcValue(containerLogicalHeight);
     2605            marginBeforeValue = availableSpace - marginAfterValue;
     2606        } else if (marginAfter.isAuto()) {
    26062607            // Solve for bottom margin
    2607             marginLogicalTopValue = marginLogicalTop.calcValue(containerLogicalHeight);
    2608             marginLogicalBottomValue = availableSpace - marginLogicalTopValue;
     2608            marginBeforeValue = marginBefore.calcValue(containerLogicalHeight);
     2609            marginAfterValue = availableSpace - marginBeforeValue;
    26092610        } else {
    26102611            // Over-constrained, (no need solve for bottom)
    2611             marginLogicalTopValue = marginLogicalTop.calcValue(containerLogicalHeight);
    2612             marginLogicalBottomValue = marginLogicalBottom.calcValue(containerLogicalHeight);
     2612            marginBeforeValue = marginBefore.calcValue(containerLogicalHeight);
     2613            marginAfterValue = marginAfter.calcValue(containerLogicalHeight);
    26132614        }
    26142615    } else {
     
    26392640
    26402641        // Calculate margins, 'auto' margins are ignored.
    2641         marginLogicalTopValue = marginLogicalTop.calcMinValue(containerLogicalHeight);
    2642         marginLogicalBottomValue = marginLogicalBottom.calcMinValue(containerLogicalHeight);
    2643 
    2644         const int availableSpace = containerLogicalHeight - (marginLogicalTopValue + marginLogicalBottomValue + bordersPlusPadding);
     2642        marginBeforeValue = marginBefore.calcMinValue(containerLogicalHeight);
     2643        marginAfterValue = marginAfter.calcMinValue(containerLogicalHeight);
     2644
     2645        const int availableSpace = containerLogicalHeight - (marginBeforeValue + marginAfterValue + bordersPlusPadding);
    26452646
    26462647        // Use rule/case that applies.
     
    26722673
    26732674    // Use computed values to calculate the vertical position.
    2674     logicalTopPos = logicalTopValue;
     2675    logicalTopPos = logicalTopValue + marginBeforeValue;
    26752676   
    26762677    // Our offset is from the logical bottom edge in a flipped environment, e.g., right for vertical-rl and bottom for horizontal-bt.
    26772678    if (style()->isFlippedBlocksWritingMode()) {
    2678         logicalTopPos += marginLogicalBottomValue;
    26792679        if (style()->isHorizontalWritingMode())
    26802680            logicalTopPos += containerBlock->borderBottom();
     
    26822682            logicalTopPos += containerBlock->borderRight();
    26832683    } else {
    2684         logicalTopPos += marginLogicalTopValue;
    26852684        if (style()->isHorizontalWritingMode())
    26862685            logicalTopPos += containerBlock->borderTop();
     
    34153414IntSize RenderBox::locationOffsetIncludingFlipping() const
    34163415{
    3417     if (!parent() || !parent()->isBox())
     3416    RenderBlock* containerBlock = containingBlock();
     3417    if (containerBlock == this)
    34183418        return locationOffset();
    34193419   
    34203420    IntRect rect(frameRect());
    3421     parentBox()->flipForWritingMode(rect);
     3421    containerBlock->flipForWritingMode(rect); // FIXME: This is wrong if we are an absolutely positioned object enclosed by a relative-positioned inline.
    34223422    return IntSize(rect.x(), rect.y());
    34233423}
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r79482 r79618  
    376376    Length logicalLeft() const { return isHorizontalWritingMode() ? left() : top(); }
    377377    Length logicalRight() const { return isHorizontalWritingMode() ? right() : bottom(); }
    378     Length logicalTop() const { return isHorizontalWritingMode() ? top() : left(); }
    379     Length logicalBottom() const { return isHorizontalWritingMode() ? bottom() : right(); }
     378    Length logicalTop() const { return isHorizontalWritingMode() ? (isFlippedBlocksWritingMode() ? bottom() : top()) : (isFlippedBlocksWritingMode() ? right() : left()); }
     379    Length logicalBottom() const { return isHorizontalWritingMode() ? (isFlippedBlocksWritingMode() ? top() : bottom()) : (isFlippedBlocksWritingMode() ? left() : right()); }
    380380
    381381    // Whether or not a positioned element requires normal flow x/y to be computed
Note: See TracChangeset for help on using the changeset viewer.