Flesh out enclosingScrollableArea() implementations
https://bugs.webkit.org/show_bug.cgi?id=209953

Reviewed by Timothy Hatcher.

enclosingScrollableArea() is a virtual function on ScrollableArea. It's currently
only called in an unused iOS WebKit1 code path, but will soon be used for scroll
latching, so flesh out implementations.

Will be tested by future scroll latching tests.

* page/FrameView.cpp:
(WebCore::FrameView::enclosingScrollableArea const):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::enclosingScrollableArea const):
* rendering/RenderListBox.cpp:
(WebCore::RenderListBox::enclosingScrollableArea const):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@259445 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 77a0fa6..bd665f0 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,23 @@
+2020-04-03  Simon Fraser  <simon.fraser@apple.com>
+
+        Flesh out enclosingScrollableArea() implementations
+        https://bugs.webkit.org/show_bug.cgi?id=209953
+
+        Reviewed by Timothy Hatcher.
+
+        enclosingScrollableArea() is a virtual function on ScrollableArea. It's currently
+        only called in an unused iOS WebKit1 code path, but will soon be used for scroll
+        latching, so flesh out implementations.
+
+        Will be tested by future scroll latching tests.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::enclosingScrollableArea const):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::enclosingScrollableArea const):
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::enclosingScrollableArea const):
+
 2020-04-02  Simon Fraser  <simon.fraser@apple.com>
 
         Rename widgetDidHandleWheelEvent back to passWheelEventToWidget and make some functions private
diff --git a/Source/WebCore/page/FrameView.cpp b/Source/WebCore/page/FrameView.cpp
index 79a41e9..c68f5d3 100644
--- a/Source/WebCore/page/FrameView.cpp
+++ b/Source/WebCore/page/FrameView.cpp
@@ -3800,8 +3800,22 @@
 
 ScrollableArea* FrameView::enclosingScrollableArea() const
 {
-    // FIXME: Walk up the frame tree and look for a scrollable parent frame or RenderLayer.
-    return nullptr;
+    if (frame().isMainFrame())
+        return nullptr;
+
+    auto* ownerElement = frame().ownerElement();
+    if (!ownerElement)
+        return nullptr;
+
+    auto* ownerRenderer = ownerElement->renderer();
+    if (!ownerRenderer)
+        return nullptr;
+
+    auto* layer = ownerRenderer->enclosingLayer();
+    if (!layer)
+        return nullptr;
+
+    return layer->enclosingScrollableLayer(IncludeSelfOrNot::IncludeSelf, CrossFrameBoundaries::No);
 }
 
 IntRect FrameView::scrollableAreaBoundingBox(bool*) const
diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp
index aa07f6a..21f52b9 100644
--- a/Source/WebCore/rendering/RenderLayer.cpp
+++ b/Source/WebCore/rendering/RenderLayer.cpp
@@ -3598,12 +3598,10 @@
 
 ScrollableArea* RenderLayer::enclosingScrollableArea() const
 {
-    if (RenderLayer* scrollableLayer = enclosingScrollableLayer(IncludeSelfOrNot::ExcludeSelf, CrossFrameBoundaries::Yes))
+    if (auto* scrollableLayer = enclosingScrollableLayer(IncludeSelfOrNot::ExcludeSelf, CrossFrameBoundaries::No))
         return scrollableLayer;
 
-    // FIXME: We should return the frame view here (or possibly an ancestor frame view,
-    // if the frame view isn't scrollable.
-    return nullptr;
+    return &renderer().view().frameView();
 }
 
 bool RenderLayer::isScrollableOrRubberbandable()
diff --git a/Source/WebCore/rendering/RenderListBox.cpp b/Source/WebCore/rendering/RenderListBox.cpp
index fe002b3..778df38 100644
--- a/Source/WebCore/rendering/RenderListBox.cpp
+++ b/Source/WebCore/rendering/RenderListBox.cpp
@@ -878,8 +878,11 @@
 
 ScrollableArea* RenderListBox::enclosingScrollableArea() const
 {
-    // FIXME: Return a RenderLayer that's scrollable.
-    return nullptr;
+    auto* layer = enclosingLayer();
+    if (!layer)
+        return nullptr;
+
+    return layer->enclosingScrollableLayer(IncludeSelfOrNot::ExcludeSelf, CrossFrameBoundaries::No);
 }
 
 bool RenderListBox::isScrollableOrRubberbandable()