Changeset 190330 in webkit


Ignore:
Timestamp:
Sep 29, 2015 3:56:20 PM (9 years ago)
Author:
Wenson Hsieh
Message:

Snap offsets should update when style is programmatically changed
https://bugs.webkit.org/show_bug.cgi?id=135964
<rdar://problem/18162411>

Reviewed by Darin Adler.

Source/WebCore:

Tests: css3/scroll-snap/scroll-snap-style-changed-coordinates.html

css3/scroll-snap/scroll-snap-style-changed-repeat.html

Updating scroll snap style properties now programmatically updates the scroll snap container. Does not yet
handle the case of reparented elements with scroll snap coordinates. Adds some plumbing the FrameView and
RenderLayerCompositor to immediately update the scrolling coordinator when updating the FrameView due to
style changes.

  • page/FrameView.cpp:

(WebCore::FrameView::updateScrollingCoordinatorScrollSnapProperties): Calls on the compositor to reupdate scroll snap

properties on the FrameView.

  • page/FrameView.h:
  • page/scrolling/AsyncScrollingCoordinator.cpp: Sets snap offsets to an empty vector when appropriate.

(WebCore::setStateScrollingNodeSnapOffsetsAsFloat): Ditto.
(WebCore::AsyncScrollingCoordinator::frameViewLayoutUpdated): Ditto.
(WebCore::AsyncScrollingCoordinator::updateOverflowScrollingNode): Ditto.
(WebCore::AsyncScrollingCoordinator::updateScrollSnapPropertiesWithFrameView): Updates scroll snap properties

from a given FrameView.

  • page/scrolling/AsyncScrollingCoordinator.h:
  • page/scrolling/ScrollingCoordinator.h:

(WebCore::ScrollingCoordinator::updateScrollSnapPropertiesWithFrameView):

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView): Updates the scrolling coordinator's

scroll snap properties.

  • rendering/RenderLayerCompositor.h: Plumb scroll snap property updating to the FrameView.
  • rendering/RenderLayerModelObject.cpp: Checks for style changes and updates snap offsets when appropriate.

(WebCore::scrollSnapContainerRequiresUpdateForStyleUpdate): Ditto.
(WebCore::RenderLayerModelObject::styleDidChange): Ditto.

LayoutTests:

Tests style updates in both cases where -points and -coordinates are used to position snap points.

  • css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt: Added.
  • css3/scroll-snap/scroll-snap-style-changed-coordinates.html: Added.
  • css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt: Added.
  • css3/scroll-snap/scroll-snap-style-changed-repeat.html: Added.
Location:
trunk
Files:
4 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r190329 r190330  
     12015-09-29  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        Snap offsets should update when style is programmatically changed
     4        https://bugs.webkit.org/show_bug.cgi?id=135964
     5        <rdar://problem/18162411>
     6
     7        Reviewed by Darin Adler.
     8
     9        Tests style updates in both cases where -points and -coordinates are used to position snap points.
     10
     11        * css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt: Added.
     12        * css3/scroll-snap/scroll-snap-style-changed-coordinates.html: Added.
     13        * css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt: Added.
     14        * css3/scroll-snap/scroll-snap-style-changed-repeat.html: Added.
     15
    1162015-09-29  Commit Queue  <commit-queue@webkit.org>
    217
  • trunk/Source/WebCore/ChangeLog

    r190327 r190330  
     12015-09-29  Wenson Hsieh  <wenson_hsieh@apple.com>
     2
     3        Snap offsets should update when style is programmatically changed
     4        https://bugs.webkit.org/show_bug.cgi?id=135964
     5        <rdar://problem/18162411>
     6
     7        Reviewed by Darin Adler.
     8
     9        Tests:  css3/scroll-snap/scroll-snap-style-changed-coordinates.html
     10                css3/scroll-snap/scroll-snap-style-changed-repeat.html
     11
     12        Updating scroll snap style properties now programmatically updates the scroll snap container. Does not yet
     13        handle the case of reparented elements with scroll snap coordinates. Adds some plumbing the FrameView and
     14        RenderLayerCompositor to immediately update the scrolling coordinator when updating the FrameView due to
     15        style changes.
     16
     17        * page/FrameView.cpp:
     18        (WebCore::FrameView::updateScrollingCoordinatorScrollSnapProperties): Calls on the compositor to reupdate scroll snap
     19            properties on the FrameView.
     20        * page/FrameView.h:
     21        * page/scrolling/AsyncScrollingCoordinator.cpp: Sets snap offsets to an empty vector when appropriate.
     22        (WebCore::setStateScrollingNodeSnapOffsetsAsFloat): Ditto.
     23        (WebCore::AsyncScrollingCoordinator::frameViewLayoutUpdated): Ditto.
     24        (WebCore::AsyncScrollingCoordinator::updateOverflowScrollingNode): Ditto.
     25        (WebCore::AsyncScrollingCoordinator::updateScrollSnapPropertiesWithFrameView): Updates scroll snap properties
     26            from a given FrameView.
     27        * page/scrolling/AsyncScrollingCoordinator.h:
     28        * page/scrolling/ScrollingCoordinator.h:
     29        (WebCore::ScrollingCoordinator::updateScrollSnapPropertiesWithFrameView):
     30        * rendering/RenderLayerCompositor.cpp:
     31        (WebCore::RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView): Updates the scrolling coordinator's
     32            scroll snap properties.
     33        * rendering/RenderLayerCompositor.h: Plumb scroll snap property updating to the FrameView.
     34        * rendering/RenderLayerModelObject.cpp: Checks for style changes and updates snap offsets when appropriate.
     35        (WebCore::scrollSnapContainerRequiresUpdateForStyleUpdate): Ditto.
     36        (WebCore::RenderLayerModelObject::styleDidChange): Ditto.
     37
    1382015-09-29  Jer Noble  <jer.noble@apple.com>
    239
  • trunk/Source/WebCore/page/FrameView.cpp

    r189144 r190330  
    10081008    return false;
    10091009}
     1010
     1011void FrameView::updateScrollingCoordinatorScrollSnapProperties() const
     1012{
     1013    renderView()->compositor().updateScrollSnapPropertiesWithFrameView(*this);
     1014}
    10101015#endif
    10111016
  • trunk/Source/WebCore/page/FrameView.h

    r189144 r190330  
    545545    void updateSnapOffsets() override;
    546546    bool isScrollSnapInProgress() const override;
     547    void updateScrollingCoordinatorScrollSnapProperties() const;
    547548#endif
    548549
  • trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp

    r185762 r190330  
    6363}
    6464
    65 static inline void setStateScrollingNodeSnapOffsetsAsFloat(ScrollingStateScrollingNode& node, ScrollEventAxis axis, const Vector<LayoutUnit>& snapOffsets, float deviceScaleFactor)
     65static inline void setStateScrollingNodeSnapOffsetsAsFloat(ScrollingStateScrollingNode& node, ScrollEventAxis axis, const Vector<LayoutUnit>* snapOffsets, float deviceScaleFactor)
    6666{
    6767    // FIXME: Incorporate current page scale factor in snapping to device pixel. Perhaps we should just convert to float here and let UI process do the pixel snapping?
    6868    Vector<float> snapOffsetsAsFloat;
    69     snapOffsetsAsFloat.reserveInitialCapacity(snapOffsets.size());
    70     for (auto& offset : snapOffsets)
    71         snapOffsetsAsFloat.append(roundToDevicePixel(offset, deviceScaleFactor, false));
    72 
     69    if (snapOffsets) {
     70        snapOffsetsAsFloat.reserveInitialCapacity(snapOffsets->size());
     71        for (auto& offset : *snapOffsets)
     72            snapOffsetsAsFloat.uncheckedAppend(roundToDevicePixel(offset, deviceScaleFactor, false));
     73    }
    7374    if (axis == ScrollEventAxis::Horizontal)
    7475        node.setHorizontalSnapOffsets(snapOffsetsAsFloat);
     
    142143#if ENABLE(CSS_SCROLL_SNAP)
    143144    frameView.updateSnapOffsets();
    144     if (const Vector<LayoutUnit>* horizontalSnapOffsets = frameView.horizontalSnapOffsets())
    145         setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, *horizontalSnapOffsets, m_page->deviceScaleFactor());
    146 
    147     if (const Vector<LayoutUnit>* verticalSnapOffsets = frameView.verticalSnapOffsets())
    148         setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, *verticalSnapOffsets, m_page->deviceScaleFactor());
    149 
    150     node->setCurrentHorizontalSnapPointIndex(frameView.currentHorizontalSnapPointIndex());
    151     node->setCurrentVerticalSnapPointIndex(frameView.currentVerticalSnapPointIndex());
     145    updateScrollSnapPropertiesWithFrameView(frameView);
    152146#endif
    153147
     
    486480        node->setScrollableAreaSize(scrollingGeometry->scrollableAreaSize);
    487481#if ENABLE(CSS_SCROLL_SNAP)
    488         setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, scrollingGeometry->horizontalSnapOffsets, m_page->deviceScaleFactor());
    489         setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, scrollingGeometry->verticalSnapOffsets, m_page->deviceScaleFactor());
     482        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, &scrollingGeometry->horizontalSnapOffsets, m_page->deviceScaleFactor());
     483        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, &scrollingGeometry->verticalSnapOffsets, m_page->deviceScaleFactor());
    490484        node->setCurrentHorizontalSnapPointIndex(scrollingGeometry->currentHorizontalSnapPointIndex);
    491485        node->setCurrentVerticalSnapPointIndex(scrollingGeometry->currentVerticalSnapPointIndex);
     
    622616    return scrollingTree()->isScrollSnapInProgress();
    623617}
     618
     619void AsyncScrollingCoordinator::updateScrollSnapPropertiesWithFrameView(const FrameView& frameView)
     620{
     621    if (auto node = downcast<ScrollingStateFrameScrollingNode>(m_scrollingStateTree->stateNodeForID(frameView.scrollLayerID()))) {
     622        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, frameView.horizontalSnapOffsets(), m_page->deviceScaleFactor());
     623        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, frameView.verticalSnapOffsets(), m_page->deviceScaleFactor());
     624        node->setCurrentHorizontalSnapPointIndex(frameView.currentHorizontalSnapPointIndex());
     625        node->setCurrentVerticalSnapPointIndex(frameView.currentVerticalSnapPointIndex());
     626    }
     627}
    624628#endif
    625629   
  • trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h

    r185762 r190330  
    6161    void deferTestsForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const;
    6262    void removeTestDeferralForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const;
     63#endif
     64
     65#if ENABLE(CSS_SCROLL_SNAP)
     66    WEBCORE_EXPORT void updateScrollSnapPropertiesWithFrameView(const FrameView&) override;
    6367#endif
    6468
  • trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h

    r185762 r190330  
    180180    virtual bool isRubberBandInProgress() const { return false; }
    181181    virtual bool isScrollSnapInProgress() const { return false; }
     182    virtual void updateScrollSnapPropertiesWithFrameView(const FrameView&) { }
    182183    virtual void setScrollPinningBehavior(ScrollPinningBehavior) { }
    183184
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r189144 r190330  
    42654265}
    42664266
     4267#if ENABLE(CSS_SCROLL_SNAP)
     4268void RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView(const FrameView& frameView)
     4269{
     4270    if (ScrollingCoordinator* coordinator = scrollingCoordinator())
     4271        coordinator->updateScrollSnapPropertiesWithFrameView(frameView);
     4272}
     4273#endif
     4274
    42674275} // namespace WebCore
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r188530 r190330  
    314314    Color rootExtendedBackgroundColor() const { return m_rootExtendedBackgroundColor; }
    315315
     316#if ENABLE(CSS_SCROLL_SNAP)
     317    void updateScrollSnapPropertiesWithFrameView(const FrameView&);
     318#endif
     319
    316320    // For testing.
    317321    WEBCORE_EXPORT void startTrackingLayerFlushes();
  • trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp

    r182364 r190330  
    2727
    2828#include "RenderLayer.h"
     29#include "RenderLayerCompositor.h"
    2930#include "RenderView.h"
    3031
     
    125126}
    126127
     128#if ENABLE(CSS_SCROLL_SNAP)
     129static bool scrollSnapContainerRequiresUpdateForStyleUpdate(const RenderStyle& oldStyle, const RenderStyle& newStyle)
     130{
     131    return !(oldStyle.scrollSnapType() == newStyle.scrollSnapType()
     132        && oldStyle.scrollSnapPointsX() == newStyle.scrollSnapPointsX()
     133        && oldStyle.scrollSnapPointsY() == newStyle.scrollSnapPointsY()
     134        && oldStyle.scrollSnapDestination() == newStyle.scrollSnapDestination());
     135}
     136#endif
     137
    127138void RenderLayerModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
    128139{
     
    170181            view().frameView().removeViewportConstrainedObject(this);
    171182    }
     183
     184#if ENABLE(CSS_SCROLL_SNAP)
     185    const RenderStyle& newStyle = style();
     186    if (oldStyle && scrollSnapContainerRequiresUpdateForStyleUpdate(*oldStyle, newStyle)) {
     187        if (RenderLayer* renderLayer = layer()) {
     188            renderLayer->updateSnapOffsets();
     189            renderLayer->updateScrollSnapState();
     190        } else if (isBody() || isRoot()) {
     191            FrameView& frameView = view().frameView();
     192            frameView.updateSnapOffsets();
     193            frameView.updateScrollSnapState();
     194            frameView.updateScrollingCoordinatorScrollSnapProperties();
     195        }
     196    }
     197    if (oldStyle && oldStyle->scrollSnapCoordinates() != newStyle.scrollSnapCoordinates()) {
     198        const RenderBox* scrollSnapBox = enclosingBox().findEnclosingScrollableContainer();
     199        if (scrollSnapBox && scrollSnapBox->layer()) {
     200            const RenderStyle& style = scrollSnapBox->style();
     201            if (style.scrollSnapType() != ScrollSnapType::None) {
     202                scrollSnapBox->layer()->updateSnapOffsets();
     203                scrollSnapBox->layer()->updateScrollSnapState();
     204                if (scrollSnapBox->isBody() || scrollSnapBox->isRoot())
     205                    scrollSnapBox->view().frameView().updateScrollingCoordinatorScrollSnapProperties();
     206            }
     207        }
     208    }
     209#endif
    172210}
    173211
Note: See TracChangeset for help on using the changeset viewer.