| Index: Source/core/rendering/RenderLayer.cpp
|
| diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp
|
| index 1fa7e9a28017efe08f6930bd7f70768475d379bd..15909fab3cd0dfe2dc242ef00dc3ae5e895f2fd7 100644
|
| --- a/Source/core/rendering/RenderLayer.cpp
|
| +++ b/Source/core/rendering/RenderLayer.cpp
|
| @@ -2154,8 +2154,13 @@ void RenderLayer::panScrollFromPoint(const IntPoint& sourcePoint)
|
|
|
| void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping clamp)
|
| {
|
| + scrollBy(delta, clamp, ShouldPropagateScroll);
|
| +}
|
| +
|
| +bool RenderLayer::scrollBy(const IntSize& delta, ScrollOffsetClamping clamp, ScrollPropagation shouldPropagate)
|
| +{
|
| if (delta.isZero())
|
| - return;
|
| + return false;
|
|
|
| bool restrictedByLineClamp = false;
|
| if (renderer()->parent())
|
| @@ -2165,24 +2170,36 @@ void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping
|
| IntSize newScrollOffset = adjustedScrollOffset() + delta;
|
| scrollToOffset(newScrollOffset, clamp);
|
|
|
| + if (shouldPropagate == DontPropagateScroll)
|
| + return true;
|
| +
|
| // If this layer can't do the scroll we ask the next layer up that can scroll to try
|
| IntSize remainingScrollOffset = newScrollOffset - adjustedScrollOffset();
|
| + bool didScroll = true;
|
| if (!remainingScrollOffset.isZero() && renderer()->parent()) {
|
| if (RenderLayer* scrollableLayer = enclosingScrollableLayer())
|
| - scrollableLayer->scrollByRecursively(remainingScrollOffset);
|
| + didScroll = scrollableLayer->scrollBy(remainingScrollOffset, clamp, shouldPropagate);
|
|
|
| Frame* frame = renderer()->frame();
|
| if (frame)
|
| frame->eventHandler()->updateAutoscrollRenderer();
|
| }
|
| + return didScroll;
|
| } else if (renderer()->view()->frameView()) {
|
| // If we are here, we were called on a renderer that can be programmatically scrolled, but doesn't
|
| // have an overflow clip. Which means that it is a document node that can be scrolled.
|
| - renderer()->view()->frameView()->scrollBy(delta);
|
| + FrameView* view = renderer()->view()->frameView();
|
| + IntPoint scrollPositionBefore = view->scrollPosition();
|
| + if (view->isScrollable())
|
| + view->scrollBy(delta);
|
| + IntPoint scrollPositionAfter = view->scrollPosition();
|
| + return scrollPositionBefore != scrollPositionAfter;
|
|
|
| // FIXME: If we didn't scroll the whole way, do we want to try looking at the frames ownerElement?
|
| // https://bugs.webkit.org/show_bug.cgi?id=28237
|
| }
|
| +
|
| + return false;
|
| }
|
|
|
| IntSize RenderLayer::clampScrollOffset(const IntSize& scrollOffset) const
|
|
|