Changeset 190330 in webkit
- Timestamp:
- Sep 29, 2015 3:56:20 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r190329 r190330 1 2015-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 1 16 2015-09-29 Commit Queue <commit-queue@webkit.org> 2 17 -
trunk/Source/WebCore/ChangeLog
r190327 r190330 1 2015-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 1 38 2015-09-29 Jer Noble <jer.noble@apple.com> 2 39 -
trunk/Source/WebCore/page/FrameView.cpp
r189144 r190330 1008 1008 return false; 1009 1009 } 1010 1011 void FrameView::updateScrollingCoordinatorScrollSnapProperties() const 1012 { 1013 renderView()->compositor().updateScrollSnapPropertiesWithFrameView(*this); 1014 } 1010 1015 #endif 1011 1016 -
trunk/Source/WebCore/page/FrameView.h
r189144 r190330 545 545 void updateSnapOffsets() override; 546 546 bool isScrollSnapInProgress() const override; 547 void updateScrollingCoordinatorScrollSnapProperties() const; 547 548 #endif 548 549 -
trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp
r185762 r190330 63 63 } 64 64 65 static inline void setStateScrollingNodeSnapOffsetsAsFloat(ScrollingStateScrollingNode& node, ScrollEventAxis axis, const Vector<LayoutUnit> &snapOffsets, float deviceScaleFactor)65 static inline void setStateScrollingNodeSnapOffsetsAsFloat(ScrollingStateScrollingNode& node, ScrollEventAxis axis, const Vector<LayoutUnit>* snapOffsets, float deviceScaleFactor) 66 66 { 67 67 // 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? 68 68 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 } 73 74 if (axis == ScrollEventAxis::Horizontal) 74 75 node.setHorizontalSnapOffsets(snapOffsetsAsFloat); … … 142 143 #if ENABLE(CSS_SCROLL_SNAP) 143 144 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); 152 146 #endif 153 147 … … 486 480 node->setScrollableAreaSize(scrollingGeometry->scrollableAreaSize); 487 481 #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()); 490 484 node->setCurrentHorizontalSnapPointIndex(scrollingGeometry->currentHorizontalSnapPointIndex); 491 485 node->setCurrentVerticalSnapPointIndex(scrollingGeometry->currentVerticalSnapPointIndex); … … 622 616 return scrollingTree()->isScrollSnapInProgress(); 623 617 } 618 619 void 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 } 624 628 #endif 625 629 -
trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h
r185762 r190330 61 61 void deferTestsForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const; 62 62 void removeTestDeferralForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const; 63 #endif 64 65 #if ENABLE(CSS_SCROLL_SNAP) 66 WEBCORE_EXPORT void updateScrollSnapPropertiesWithFrameView(const FrameView&) override; 63 67 #endif 64 68 -
trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h
r185762 r190330 180 180 virtual bool isRubberBandInProgress() const { return false; } 181 181 virtual bool isScrollSnapInProgress() const { return false; } 182 virtual void updateScrollSnapPropertiesWithFrameView(const FrameView&) { } 182 183 virtual void setScrollPinningBehavior(ScrollPinningBehavior) { } 183 184 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r189144 r190330 4265 4265 } 4266 4266 4267 #if ENABLE(CSS_SCROLL_SNAP) 4268 void RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView(const FrameView& frameView) 4269 { 4270 if (ScrollingCoordinator* coordinator = scrollingCoordinator()) 4271 coordinator->updateScrollSnapPropertiesWithFrameView(frameView); 4272 } 4273 #endif 4274 4267 4275 } // namespace WebCore -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r188530 r190330 314 314 Color rootExtendedBackgroundColor() const { return m_rootExtendedBackgroundColor; } 315 315 316 #if ENABLE(CSS_SCROLL_SNAP) 317 void updateScrollSnapPropertiesWithFrameView(const FrameView&); 318 #endif 319 316 320 // For testing. 317 321 WEBCORE_EXPORT void startTrackingLayerFlushes(); -
trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp
r182364 r190330 27 27 28 28 #include "RenderLayer.h" 29 #include "RenderLayerCompositor.h" 29 30 #include "RenderView.h" 30 31 … … 125 126 } 126 127 128 #if ENABLE(CSS_SCROLL_SNAP) 129 static 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 127 138 void RenderLayerModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 128 139 { … … 170 181 view().frameView().removeViewportConstrainedObject(this); 171 182 } 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 172 210 } 173 211
Note: See TracChangeset
for help on using the changeset viewer.