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 |