⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 126943 in webkit


Ignore:
Timestamp:
Aug 28, 2012, 5:38:45 PM (14 years ago)
Author:
Simon Fraser
Message:

Handle sticky that overflows its container
https://bugs.webkit.org/show_bug.cgi?id=95260

Reviewed by Ojan Vafai.

Source/WebCore:

When an element with position:sticky overflows its container,
don't have the sticky code push it back inside that container.
It will just never get offset in the sticky direction.

Test: fast/css/sticky/sticky-overflowing.html

  • rendering/RenderBoxModelObject.cpp:

(WebCore::RenderBoxModelObject::stickyPositionOffset):

LayoutTests:

Testcase with sticky elements that overflow their containers.

  • fast/css/sticky/sticky-overflowing-expected.html: Added.
  • fast/css/sticky/sticky-overflowing.html: Added.
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r126942 r126943  
     12012-08-28  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Handle sticky that overflows its container
     4        https://bugs.webkit.org/show_bug.cgi?id=95260
     5
     6        Reviewed by Ojan Vafai.
     7
     8        Testcase with sticky elements that overflow their containers.
     9
     10        * fast/css/sticky/sticky-overflowing-expected.html: Added.
     11        * fast/css/sticky/sticky-overflowing.html: Added.
     12
    1132012-08-28  Xianzhu Wang  <wangxianzhu@chromium.org>
    214
  • trunk/Source/WebCore/ChangeLog

    r126939 r126943  
     12012-08-28  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Handle sticky that overflows its container
     4        https://bugs.webkit.org/show_bug.cgi?id=95260
     5
     6        Reviewed by Ojan Vafai.
     7
     8        When an element with position:sticky overflows its container,
     9        don't have the sticky code push it back inside that container.
     10        It will just never get offset in the sticky direction.
     11
     12        Test: fast/css/sticky/sticky-overflowing.html
     13
     14        * rendering/RenderBoxModelObject.cpp:
     15        (WebCore::RenderBoxModelObject::stickyPositionOffset):
     16
    1172012-08-28  Mark Pilgrim  <pilgrim@chromium.org>
    218
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r126926 r126943  
    586586    if (!style()->right().isAuto()) {
    587587        LayoutUnit rightLimit = viewportRect.maxX() - valueForLength(style()->right(), viewportRect.width(), view());
    588         if (absoluteStickyBoxRect.maxX() > rightLimit)
    589             absoluteStickyBoxRect.setX(rightLimit - absoluteStickyBoxRect.width());
    590            
    591         if (absoluteStickyBoxRect.x() < absContainerContentRect.x())
    592             absoluteStickyBoxRect.setX(absContainerContentRect.x());
     588        LayoutUnit rightDelta = min<float>(0, rightLimit.toFloat() - absoluteStickyBoxRect.maxX());
     589        LayoutUnit availableSpace = min<float>(0, absContainerContentRect.x() - absoluteStickyBoxRect.x());
     590        if (rightDelta < availableSpace)
     591            rightDelta = availableSpace;
     592
     593        absoluteStickyBoxRect.move(rightDelta, 0);
    593594    }
    594595
    595596    if (!style()->left().isAuto()) {
    596597        LayoutUnit leftLimit = viewportRect.x() + valueForLength(style()->left(), viewportRect.width(), view());
    597         if (absoluteStickyBoxRect.x() < leftLimit)
    598             absoluteStickyBoxRect.setX(leftLimit);
    599 
    600         if (absoluteStickyBoxRect.maxX() > absContainerContentRect.maxX())
    601             absoluteStickyBoxRect.setX(absContainerContentRect.maxX() - absoluteStickyBoxRect.width());
     598        LayoutUnit leftDelta = max<float>(0, leftLimit.toFloat() - absoluteStickyBoxRect.x());
     599        LayoutUnit availableSpace = max<float>(0, absContainerContentRect.maxX() - absoluteStickyBoxRect.maxX());
     600        if (leftDelta > availableSpace)
     601            leftDelta = availableSpace;
     602
     603        absoluteStickyBoxRect.move(leftDelta, 0);
    602604    }
    603605
     
    605607    if (!style()->bottom().isAuto()) {
    606608        LayoutUnit bottomLimit = viewportRect.maxY() - valueForLength(style()->bottom(), viewportRect.height(), view());
    607         if (absoluteStickyBoxRect.maxY() > bottomLimit)
    608             absoluteStickyBoxRect.setY(bottomLimit - absoluteStickyBoxRect.height());
    609            
    610         if (absoluteStickyBoxRect.y() < absContainerContentRect.y())
    611             absoluteStickyBoxRect.setY(absContainerContentRect.y());
     609        LayoutUnit bottomDelta = min<float>(0, bottomLimit.toFloat() - absoluteStickyBoxRect.maxY());
     610        LayoutUnit availableSpace = min<float>(0, absContainerContentRect.y() - absoluteStickyBoxRect.y());
     611        if (bottomDelta < availableSpace)
     612            bottomDelta = availableSpace;
     613
     614        absoluteStickyBoxRect.move(0, bottomDelta);
    612615    }
    613616
    614617    if (!style()->top().isAuto()) {
    615618        LayoutUnit topLimit = viewportRect.y() + valueForLength(style()->top(), viewportRect.height(), view());
    616         if (absoluteStickyBoxRect.y() < topLimit)
    617             absoluteStickyBoxRect.setY(topLimit);
    618 
    619         if (absoluteStickyBoxRect.maxY() > absContainerContentRect.maxY())
    620             absoluteStickyBoxRect.setY(absContainerContentRect.maxY() - absoluteStickyBoxRect.height());
     619        LayoutUnit topDelta = max<float>(0, topLimit.toFloat() - absoluteStickyBoxRect.y());
     620        LayoutUnit availableSpace = max<float>(0, absContainerContentRect.maxY() - absoluteStickyBoxRect.maxY());
     621        if (topDelta > availableSpace)
     622            topDelta = availableSpace;
     623
     624        absoluteStickyBoxRect.move(0, topDelta);
    621625    }
    622626   
Note: See TracChangeset for help on using the changeset viewer.