Subframes with scrollable areas must be added to the non-fast scrollable region
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 23 Feb 2012 01:13:08 +0000 (01:13 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 23 Feb 2012 01:13:08 +0000 (01:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=79306
<rdar://problem/10915564>

Reviewed by Andreas Kling.

When computing the non-fast scrollable region, add subframes with scrollable regions to the region.

* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::computeNonFastScrollableRegion):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108579 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/page/scrolling/ScrollingCoordinator.cpp

index a442c2a..26825fb 100644 (file)
@@ -1,3 +1,16 @@
+2012-02-22  Anders Carlsson  <andersca@apple.com>
+
+        Subframes with scrollable areas must be added to the non-fast scrollable region
+        https://bugs.webkit.org/show_bug.cgi?id=79306
+        <rdar://problem/10915564>
+
+        Reviewed by Andreas Kling.
+
+        When computing the non-fast scrollable region, add subframes with scrollable regions to the region.
+
+        * page/scrolling/ScrollingCoordinator.cpp:
+        (WebCore::computeNonFastScrollableRegion):
+
 2012-02-22  Nate Chapin  <japhet@chromium.org>
 
         CachedResourceLoader ignores the Range header
index 00f5fef..8aec61e 100644 (file)
@@ -114,14 +114,22 @@ static Region computeNonFastScrollableRegion(FrameView* frameView)
 {
     Region nonFastScrollableRegion;
 
-        if (const FrameView::ScrollableAreaSet* scrollableAreas = frameView->scrollableAreas()) {
+    HashSet<FrameView*> childFrameViews;
+    for (HashSet<RefPtr<Widget> >::const_iterator it = frameView->children()->begin(), end = frameView->children()->end(); it != end; ++it) {
+        if ((*it)->isFrameView())
+            childFrameViews.add(static_cast<FrameView*>(it->get()));
+    }
+
+    if (const FrameView::ScrollableAreaSet* scrollableAreas = frameView->scrollableAreas()) {
         for (FrameView::ScrollableAreaSet::const_iterator it = scrollableAreas->begin(), end = scrollableAreas->end(); it != end; ++it) {
             ScrollableArea* scrollableArea = *it;
 
             // Check if this area can be scrolled at all.
+            // If this scrollable area is a frame view that itself has scrollable areas, then we need to add it to the region.
             if ((!scrollableArea->horizontalScrollbar() || !scrollableArea->horizontalScrollbar()->enabled())
-                && (!scrollableArea->verticalScrollbar() || !scrollableArea->verticalScrollbar()->enabled()))
-                continue;
+                && (!scrollableArea->verticalScrollbar() || !scrollableArea->verticalScrollbar()->enabled())
+                && (!childFrameViews.contains(static_cast<FrameView*>(scrollableArea)) || !static_cast<FrameView*>(scrollableArea)->scrollableAreas()))
+                    continue;
 
             nonFastScrollableRegion.unite(scrollableArea->scrollableAreaBoundingBox());
         }