Title: [106977] trunk/Source
Revision
106977
Author
ander...@apple.com
Date
2012-02-07 12:45:52 -0800 (Tue, 07 Feb 2012)

Log Message

ScrollableAreaSet should be moved from Page to FrameView
https://bugs.webkit.org/show_bug.cgi?id=62762

Reviewed by Beth Dakin.

Source/WebCore:

It makes more sense for the set of scrollable areas to be per frame view instead of per page;
scrollable areas are associated with a containing frame view and their lifecycle follows the lifecycle of the
frame view much more closely. This could even fix a bunch of crashes where a scrollable area outlived its containing page.

* WebCore.exp.in:
Replace the Page member functions with FrameView member functions instead.

* page/EventHandler.cpp:
(WebCore::EventHandler::mouseMoved):
Check if the frame view contains the given layer.

(WebCore::EventHandler::updateMouseEventTargetNode):
Ditto.

* page/FocusController.cpp:
(WebCore::contentAreaDidShowOrHide):
Add helper function.

(WebCore::FocusController::setContainingWindowIsVisible):
Call contentAreaDidShowOrHide for the main frame view, and for all scrollable areas
inside all subframe views.

* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
Use early returns to make the code more clear. Also, don't add the scrollable area to the set here.

(WebCore::FrameView::~FrameView):
Don't remove the scrollable area here.

(WebCore::FrameView::zoomAnimatorTransformChanged):
m_page is gone so use m_frame->page() instead.

(WebCore::FrameView::setAnimatorsAreActive):
Call ScrollAnimator::setIsActive for all the scrollable areas in this frame view. Previously we used to do
this for all scrollable areas on the page, but since setAnimatorsAreActive will be called for each document,
this will be done implicitly.

(WebCore::FrameView::notifyPageThatContentAreaWillPaint):
Call ScrollableArea::contentDidPaint for this frame view and all its immediate scrollable areas. Previously, we used
to do this for all scrollable areas on the page, but we only need to do it for this frame view.

(WebCore::FrameView::scrollAnimatorEnabled):
Get the page from m_frame since m_page is gone.

(WebCore::FrameView::addScrollableArea):
(WebCore::FrameView::removeScrollableArea):
(WebCore::FrameView::containsScrollableArea):
Move these member functions here from Page.

(WebCore::FrameView::addChild):
If we are adding a frame view, add it to the scrollable area set.

(WebCore::FrameView::removeChild):
If we are removing a frame view, remove it from the scrollable area set.

* page/FrameView.h:
Move the member function declarations and the scrollable area set member variable here from Page.

* page/Page.cpp:
(WebCore::Page::~Page):
Don't call disconnectPage on the scrollable areas anymore.

* platform/ScrollView.h:
(ScrollView):
Make addChild and removeChild virtual.

* platform/ScrollableArea.h:
Remove disconnectFromPage.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::~RenderLayer):
(WebCore::RenderLayer::styleChanged):
The frame view now keeps track of the scrollable areas.

* rendering/RenderLayer.h:
Remove the page member variable and disconnectFromPage.

* rendering/RenderListBox.cpp:
(WebCore::RenderListBox::RenderListBox):
(WebCore::RenderListBox::~RenderListBox):
The frame view now keeps track of the scrollable areas.

* rendering/RenderListBox.h:
Remove the page member variable and disconnectFromPage.

Source/WebKit/chromium:

Update for changes to WebCore now that the scrollable area set is kept per frame view.

* src/ScrollbarGroup.cpp:
(WebKit::ScrollbarGroup::ScrollbarGroup):
(WebKit::ScrollbarGroup::~ScrollbarGroup):
* src/ScrollbarGroup.h:
(WebCore):
(ScrollbarGroup):
* src/WebPluginContainerImpl.cpp:
(WebKit::WebPluginContainerImpl::scrollbarGroup):

Source/WebKit2:

* WebProcess/Plugins/PDF/BuiltInPDFView.cpp:
(WebKit::BuiltInPDFView::initialize):
Call FrameView::addScrollableArea instead.

(WebKit::BuiltInPDFView::destroy):
Call FrameView::removeScrollableArea instead.

* WebProcess/Plugins/PDF/BuiltInPDFView.h:
Remove disconnectFromPage since it no longer exists on ScrollableArea.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (106976 => 106977)


--- trunk/Source/WebCore/ChangeLog	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/ChangeLog	2012-02-07 20:45:52 UTC (rev 106977)
@@ -1,3 +1,96 @@
+2012-02-06  Anders Carlsson  <ander...@apple.com>
+
+        ScrollableAreaSet should be moved from Page to FrameView
+        https://bugs.webkit.org/show_bug.cgi?id=62762
+
+        Reviewed by Beth Dakin.
+
+        It makes more sense for the set of scrollable areas to be per frame view instead of per page;
+        scrollable areas are associated with a containing frame view and their lifecycle follows the lifecycle of the
+        frame view much more closely. This could even fix a bunch of crashes where a scrollable area outlived its containing page.
+
+        * WebCore.exp.in:
+        Replace the Page member functions with FrameView member functions instead.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::mouseMoved):
+        Check if the frame view contains the given layer.
+
+        (WebCore::EventHandler::updateMouseEventTargetNode):
+        Ditto.
+
+        * page/FocusController.cpp:
+        (WebCore::contentAreaDidShowOrHide):
+        Add helper function.
+
+        (WebCore::FocusController::setContainingWindowIsVisible):
+        Call contentAreaDidShowOrHide for the main frame view, and for all scrollable areas
+        inside all subframe views.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::FrameView):
+        Use early returns to make the code more clear. Also, don't add the scrollable area to the set here.
+
+        (WebCore::FrameView::~FrameView):
+        Don't remove the scrollable area here.
+
+        (WebCore::FrameView::zoomAnimatorTransformChanged):
+        m_page is gone so use m_frame->page() instead.
+
+        (WebCore::FrameView::setAnimatorsAreActive):
+        Call ScrollAnimator::setIsActive for all the scrollable areas in this frame view. Previously we used to do
+        this for all scrollable areas on the page, but since setAnimatorsAreActive will be called for each document,
+        this will be done implicitly.
+
+        (WebCore::FrameView::notifyPageThatContentAreaWillPaint):
+        Call ScrollableArea::contentDidPaint for this frame view and all its immediate scrollable areas. Previously, we used
+        to do this for all scrollable areas on the page, but we only need to do it for this frame view.
+
+        (WebCore::FrameView::scrollAnimatorEnabled):
+        Get the page from m_frame since m_page is gone.
+
+        (WebCore::FrameView::addScrollableArea):
+        (WebCore::FrameView::removeScrollableArea):
+        (WebCore::FrameView::containsScrollableArea):
+        Move these member functions here from Page.
+
+        (WebCore::FrameView::addChild):
+        If we are adding a frame view, add it to the scrollable area set.
+
+        (WebCore::FrameView::removeChild):
+        If we are removing a frame view, remove it from the scrollable area set.
+
+        * page/FrameView.h:
+        Move the member function declarations and the scrollable area set member variable here from Page.
+
+        * page/Page.cpp:
+        (WebCore::Page::~Page):
+        Don't call disconnectPage on the scrollable areas anymore.
+
+        * platform/ScrollView.h:
+        (ScrollView):
+        Make addChild and removeChild virtual.
+
+        * platform/ScrollableArea.h:
+        Remove disconnectFromPage.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore::RenderLayer::~RenderLayer):
+        (WebCore::RenderLayer::styleChanged):
+        The frame view now keeps track of the scrollable areas.
+
+        * rendering/RenderLayer.h:
+        Remove the page member variable and disconnectFromPage.
+
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::RenderListBox):
+        (WebCore::RenderListBox::~RenderListBox):
+        The frame view now keeps track of the scrollable areas.
+
+        * rendering/RenderListBox.h:
+        Remove the page member variable and disconnectFromPage.
+
 2012-02-07  Matthew Delaney  <mdela...@apple.com>
 
         Remove redundant checks in CanvasRenderingContext2D.cpp

Modified: trunk/Source/WebCore/WebCore.exp.in (106976 => 106977)


--- trunk/Source/WebCore/WebCore.exp.in	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/WebCore.exp.in	2012-02-07 20:45:52 UTC (rev 106977)
@@ -764,12 +764,10 @@
 __ZN7WebCore4Page15didMoveOnscreenEv
 __ZN7WebCore4Page16setCanStartMediaEb
 __ZN7WebCore4Page16setDefersLoadingEb
-__ZN7WebCore4Page17addScrollableAreaEPNS_14ScrollableAreaE
 __ZN7WebCore4Page17willMoveOffscreenEv
 __ZN7WebCore4Page18removeSchedulePairEN3WTF10PassRefPtrINS_12SchedulePairEEE
 __ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointE
 __ZN7WebCore4Page19visitedStateChangedEPNS_9PageGroupEy
-__ZN7WebCore4Page20removeScrollableAreaEPNS_14ScrollableAreaE
 __ZN7WebCore4Page20setDeviceScaleFactorEf
 __ZN7WebCore4Page20unmarkAllTextMatchesEv
 __ZN7WebCore4Page21markAllMatchesForTextERKN3WTF6StringEjbj
@@ -1046,12 +1044,14 @@
 __ZN7WebCore9FrameView14setTransparentEb
 __ZN7WebCore9FrameView15setMarginHeightEi
 __ZN7WebCore9FrameView16setPaintBehaviorEj
+__ZN7WebCore9FrameView17addScrollableAreaEPNS_14ScrollableAreaE
 __ZN7WebCore9FrameView17paintControlTintsEv
 __ZN7WebCore9FrameView17setScrollPositionERKNS_8IntPointE
 __ZN7WebCore9FrameView17setTracksRepaintsEb
 __ZN7WebCore9FrameView18updateControlTintsEv
 __ZN7WebCore9FrameView19scrollElementToRectEPNS_7ElementERKNS_7IntRectE
 __ZN7WebCore9FrameView20enterCompositingModeEv
+__ZN7WebCore9FrameView20removeScrollableAreaEPNS_14ScrollableAreaE
 __ZN7WebCore9FrameView21flushDeferredRepaintsEv
 __ZN7WebCore9FrameView22setBaseBackgroundColorERKNS_5ColorE
 __ZN7WebCore9FrameView23updateCanHaveScrollbarsEv

Modified: trunk/Source/WebCore/page/EventHandler.cpp (106976 => 106977)


--- trunk/Source/WebCore/page/EventHandler.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -1656,8 +1656,10 @@
         return result;
 
     if (RenderLayer* layer = layerForNode(hoveredNode.innerNode())) {
-        if (page->containsScrollableArea(layer))
-            layer->mouseMovedInContentArea();
+        if (FrameView* frameView = m_frame->view()) {
+            if (frameView->containsScrollableArea(layer))
+                layer->mouseMovedInContentArea();
+        }
     }
 
     if (FrameView* frameView = m_frame->view())
@@ -2117,10 +2119,14 @@
             }
         } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {
             // The mouse has moved between layers.
-            if (page->containsScrollableArea(layerForLastNode))
-                layerForLastNode->mouseExitedContentArea();
+            if (Frame* frame = m_lastNodeUnderMouse->document()->frame()) {
+                if (FrameView* frameView = frame->view()) {
+                    if (frameView->containsScrollableArea(layerForLastNode))
+                        layerForLastNode->mouseExitedContentArea();
+                }
+            }
         }
-        
+
         if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse->document() != m_frame->document())) {
             // The mouse has moved between frames.
             if (Frame* frame = m_nodeUnderMouse->document()->frame()) {
@@ -2129,10 +2135,14 @@
             }
         } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {
             // The mouse has moved between layers.
-            if (page->containsScrollableArea(layerForNodeUnderMouse))
-                layerForNodeUnderMouse->mouseEnteredContentArea();
+            if (Frame* frame = m_nodeUnderMouse->document()->frame()) {
+                if (FrameView* frameView = frame->view()) {
+                    if (frameView->containsScrollableArea(layerForNodeUnderMouse))
+                        layerForNodeUnderMouse->mouseEnteredContentArea();
+                }
+            }
         }
-        
+
         if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame->document()) {
             m_lastNodeUnderMouse = 0;
             m_lastScrollbarUnderMouse = 0;

Modified: trunk/Source/WebCore/page/FocusController.cpp (106976 => 106977)


--- trunk/Source/WebCore/page/FocusController.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/page/FocusController.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -582,6 +582,14 @@
         dispatchEventsOnWindowAndFocusedNode(m_focusedFrame->document(), active);
 }
 
+static void contentAreaDidShowOrHide(ScrollableArea* scrollableArea, bool didShow)
+{
+    if (didShow)
+        scrollableArea->contentAreaDidShow();
+    else
+        scrollableArea->contentAreaDidHide();
+}
+
 void FocusController::setContainingWindowIsVisible(bool containingWindowIsVisible)
 {
     if (m_containingWindowIsVisible == containingWindowIsVisible)
@@ -593,13 +601,22 @@
     if (!view)
         return;
 
-    if (const HashSet<ScrollableArea*>* scrollableAreas = m_page->scrollableAreaSet()) {
-        HashSet<ScrollableArea*>::const_iterator end = scrollableAreas->end(); 
-        for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(); it != end; ++it) {
-            if (!containingWindowIsVisible)
-                (*it)->contentAreaDidHide();
-            else
-                (*it)->contentAreaDidShow();
+    contentAreaDidShowOrHide(view, containingWindowIsVisible);
+
+    for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
+        FrameView* frameView = frame->view();
+        if (!frameView)
+            continue;
+
+        const HashSet<ScrollableArea*>* scrollableAreas = frameView->scrollableAreas();
+        if (!scrollableAreas)
+            continue;
+
+        for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(), end = scrollableAreas->end(); it != end; ++it) {
+            ScrollableArea* scrollableArea = *it;
+            ASSERT(scrollableArea->isOnActivePage());
+
+            contentAreaDidShowOrHide(scrollableArea, containingWindowIsVisible);
         }
     }
 }

Modified: trunk/Source/WebCore/page/FrameView.cpp (106976 => 106977)


--- trunk/Source/WebCore/page/FrameView.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/page/FrameView.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -152,16 +152,17 @@
 {
     init();
 
-    if (m_frame) {
-        if (Page* page = m_frame->page()) {
-            m_page = page;
-            m_page->addScrollableArea(this);
+    // FIXME: Can m_frame ever be null here?
+    if (!m_frame)
+        return;
 
-            if (m_frame == m_page->mainFrame()) {
-                ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed);
-                ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed);
-            }
-        }
+    Page* page = m_frame->page();
+    if (!page)
+        return;
+
+    if (m_frame == page->mainFrame()) {
+        ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed);
+        ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed);
     }
 }
 
@@ -202,9 +203,6 @@
     ASSERT(!m_scrollCorner);
     ASSERT(m_actionScheduler->isEmpty());
 
-    if (m_page)
-        m_page->removeScrollableArea(this);
-
     if (m_frame) {
         ASSERT(m_frame->view() != this || !m_frame->contentRenderer());
         RenderPart* renderer = m_frame->ownerRenderer();
@@ -1242,8 +1240,8 @@
 void FrameView::zoomAnimatorTransformChanged(float scale, float x, float y, ZoomAnimationState state)
 {
     if (state == ZoomAnimationFinishing) {
-        m_page->setPageScaleFactor(m_page->pageScaleFactor() * scale,
-                                   IntPoint(scale * scrollX() - x, scale * scrollY() - y));
+        if (Page* page = m_frame->page())
+            page->setPageScaleFactor(page->pageScaleFactor() * scale, IntPoint(scale * scrollX() - x, scale * scrollY() - y));
         scrollAnimator()->resetZoom();
     }
 
@@ -2575,18 +2573,16 @@
     if (!page)
         return;
 
-    const HashSet<ScrollableArea*>* scrollableAreas = page->scrollableAreaSet();
-    if (!scrollableAreas)
+    scrollAnimator()->setIsActive();
+
+    if (!m_scrollableAreas)
         return;
 
-    HashSet<ScrollableArea*>::const_iterator end = scrollableAreas->end(); 
-    for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(); it != end; ++it) {
-        // FIXME: This extra check to make sure the ScrollableArea is on an active page needs 
-        // to be here as long as the ScrollableArea HashSet lives on Page. But it should really be
-        // moved to the top-level Document or a similar class that really represents a single 
-        // web page. https://bugs.webkit.org/show_bug.cgi?id=62762
-        if ((*it)->isOnActivePage())
-            (*it)->scrollAnimator()->setIsActive();
+    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
+        ScrollableArea* scrollableArea = *it;
+
+        ASSERT(scrollableArea->isOnActivePage());
+        scrollableArea->scrollAnimator()->setIsActive();
     }
 }
 
@@ -2596,21 +2592,26 @@
     if (!page)
         return;
 
-    const HashSet<ScrollableArea*>* scrollableAreas = page->scrollableAreaSet();
-    if (!scrollableAreas)
+    contentAreaWillPaint();
+
+    if (!m_scrollableAreas)
         return;
 
-    HashSet<ScrollableArea*>::const_iterator end = scrollableAreas->end(); 
-    for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(); it != end; ++it)
-        (*it)->contentAreaWillPaint();
+    for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) {
+        ScrollableArea* scrollableArea = *it;
+
+        ASSERT(scrollableArea->isOnActivePage());
+        scrollableArea->contentAreaWillPaint();
+    }
 }
 
 bool FrameView::scrollAnimatorEnabled() const
 {
 #if ENABLE(SMOOTH_SCROLLING)
-    if (m_page && m_page->settings())
-        return m_page->settings()->scrollAnimatorEnabled();
+    if (Page* page = m_frame->page())
+        return page->settings()->scrollAnimatorEnabled();
 #endif
+
     return false;
 }
 
@@ -3262,6 +3263,43 @@
     m_isTrackingRepaints = trackRepaints;
 }
 
+void FrameView::addScrollableArea(ScrollableArea* scrollableArea)
+{
+    if (!m_scrollableAreas)
+        m_scrollableAreas = adoptPtr(new ScrollableAreaSet);
+    m_scrollableAreas->add(scrollableArea);
+}
+
+void FrameView::removeScrollableArea(ScrollableArea* scrollableArea)
+{
+    if (!m_scrollableAreas)
+        return;
+    m_scrollableAreas->remove(scrollableArea);
+}
+
+bool FrameView::containsScrollableArea(ScrollableArea* scrollableArea) const
+{
+    if (!m_scrollableAreas)
+        return false;
+    return m_scrollableAreas->contains(scrollableArea);
+}
+
+void FrameView::addChild(PassRefPtr<Widget> widget)
+{
+    if (widget->isFrameView())
+        addScrollableArea(static_cast<FrameView*>(widget.get()));
+
+    ScrollView::addChild(widget);
+}
+
+void FrameView::removeChild(Widget* widget)
+{
+    if (widget->isFrameView())
+        removeScrollableArea(static_cast<FrameView*>(widget));
+
+    ScrollView::removeChild(widget);
+}
+
 bool FrameView::isVerticalDocument() const
 {
     RenderView* root = rootRenderer(this);

Modified: trunk/Source/WebCore/page/FrameView.h (106976 => 106977)


--- trunk/Source/WebCore/page/FrameView.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/page/FrameView.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -308,6 +308,15 @@
     void resetTrackedRepaints() { m_trackedRepaintRects.clear(); }
     const Vector<IntRect>& trackedRepaintRects() const { return m_trackedRepaintRects; }
 
+    typedef HashSet<ScrollableArea*> ScrollableAreaSet;
+    void addScrollableArea(ScrollableArea*);
+    void removeScrollableArea(ScrollableArea*);
+    bool containsScrollableArea(ScrollableArea*) const;
+    const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); }
+
+    virtual void addChild(PassRefPtr<Widget>) OVERRIDE;
+    virtual void removeChild(Widget*) OVERRIDE;
+
 protected:
     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
     virtual void scrollContentsSlowPath(const IntRect& updateRect);
@@ -373,7 +382,6 @@
 #endif
 
     virtual void notifyPageThatContentAreaWillPaint() const;
-    virtual void disconnectFromPage() { m_page = 0; }
 
     virtual bool scrollAnimatorEnabled() const;
 
@@ -476,8 +484,6 @@
     // Renderer to hold our custom scroll corner.
     RenderScrollbarPart* m_scrollCorner;
 
-    Page* m_page;
-
     // If true, automatically resize the frame view around its content.
     bool m_shouldAutoSize;
     bool m_inAutoSize;
@@ -486,6 +492,8 @@
     // The upper bound on the size when autosizing.
     IntSize m_maxAutoSize;
 
+    OwnPtr<ScrollableAreaSet> m_scrollableAreas;
+
     static double s_deferredRepaintDelay;
     static double s_initialDeferredRepaintDelayDuringLoading;
     static double s_maxDeferredRepaintDelayDuringLoading;

Modified: trunk/Source/WebCore/page/Page.cpp (106976 => 106977)


--- trunk/Source/WebCore/page/Page.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/page/Page.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -211,12 +211,6 @@
     for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
         frame->pageDestroyed();
 
-    if (m_scrollableAreaSet) {
-        ScrollableAreaSet::const_iterator end = m_scrollableAreaSet->end(); 
-        for (ScrollableAreaSet::const_iterator it = m_scrollableAreaSet->begin(); it != end; ++it)
-            (*it)->disconnectFromPage();
-    }
-
     m_editorClient->pageDestroyed();
 
 #if ENABLE(INSPECTOR)
@@ -1026,27 +1020,6 @@
         pluginViewBases[i]->privateBrowsingStateChanged(privateBrowsingEnabled);
 }
 
-void Page::addScrollableArea(ScrollableArea* scrollableArea)
-{
-    if (!m_scrollableAreaSet)
-        m_scrollableAreaSet = adoptPtr(new ScrollableAreaSet);
-    m_scrollableAreaSet->add(scrollableArea);
-}
-
-void Page::removeScrollableArea(ScrollableArea* scrollableArea)
-{
-    if (!m_scrollableAreaSet)
-        return;
-    m_scrollableAreaSet->remove(scrollableArea);
-}
-
-bool Page::containsScrollableArea(ScrollableArea* scrollableArea) const
-{
-    if (!m_scrollableAreaSet)
-        return false;
-    return m_scrollableAreaSet->contains(scrollableArea);
-}
-
 #if !ASSERT_DISABLED
 void Page::checkFrameCountConsistency() const
 {

Modified: trunk/Source/WebCore/page/Page.h (106976 => 106977)


--- trunk/Source/WebCore/page/Page.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/page/Page.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -333,12 +333,6 @@
         void setJavaScriptURLsAreAllowed(bool);
         bool _javascript_URLsAreAllowed() const;
 
-        typedef HashSet<ScrollableArea*> ScrollableAreaSet;
-        void addScrollableArea(ScrollableArea*);
-        void removeScrollableArea(ScrollableArea*);
-        bool containsScrollableArea(ScrollableArea*) const;
-        const ScrollableAreaSet* scrollableAreaSet() const { return m_scrollableAreaSet.get(); }
-
         // Don't allow more than a certain number of frames in a page.
         // This seems like a reasonable upper bound, and otherwise mutually
         // recursive frameset pages can quickly bring the program to its knees
@@ -465,8 +459,6 @@
 
         double m_minimumTimerInterval;
 
-        OwnPtr<ScrollableAreaSet> m_scrollableAreaSet;
-
         bool m_isEditable;
 
 #if ENABLE(PAGE_VISIBILITY_API)

Modified: trunk/Source/WebCore/platform/ScrollView.h (106976 => 106977)


--- trunk/Source/WebCore/platform/ScrollView.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/platform/ScrollView.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -72,8 +72,8 @@
 
     // Functions for child manipulation and inspection.
     const HashSet<RefPtr<Widget> >* children() const { return &m_children; }
-    void addChild(PassRefPtr<Widget>);
-    void removeChild(Widget*);
+    virtual void addChild(PassRefPtr<Widget>);
+    virtual void removeChild(Widget*);
     
     // If the scroll view does not use a native widget, then it will have cross-platform Scrollbars. These functions
     // can be used to obtain those scrollbars.

Modified: trunk/Source/WebCore/platform/ScrollableArea.h (106976 => 106977)


--- trunk/Source/WebCore/platform/ScrollableArea.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/platform/ScrollableArea.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -161,8 +161,6 @@
 
     virtual bool shouldRubberBandInDirection(ScrollDirection) const { return true; }
 
-    virtual void disconnectFromPage() { }
-
     virtual bool scrollAnimatorEnabled() const { return false; }
 
     // NOTE: Only called from Internals for testing.

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (106976 => 106977)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -185,7 +185,6 @@
     , m_reflection(0)
     , m_scrollCorner(0)
     , m_resizer(0)
-    , m_scrollableAreaPage(0)
 {
     m_isNormalFlowOnly = shouldBeNormalFlowOnly();
 
@@ -204,8 +203,10 @@
             frame->eventHandler()->resizeLayerDestroyed();
     }
 
-    if (m_scrollableAreaPage)
-        m_scrollableAreaPage->removeScrollableArea(this);
+    if (Frame* frame = renderer()->frame()) {
+        if (FrameView* frameView = frame->view())
+            frameView->removeScrollableArea(this);
+    }
 
     destroyScrollbar(HorizontalScrollbar);
     destroyScrollbar(VerticalScrollbar);
@@ -4346,19 +4347,14 @@
 #if ENABLE(CSS_FILTERS)
     updateOrRemoveFilterEffect();
 #endif
-    
-    if (scrollsOverflow()) {
-        if (!m_scrollableAreaPage) {
-            if (Frame* frame = renderer()->frame()) {
-                if (Page* page = frame->page()) {
-                    m_scrollableAreaPage = page;
-                    m_scrollableAreaPage->addScrollableArea(this);
-                }
-            }
+
+    if (Frame* frame = renderer()->frame()) {
+        if (FrameView* frameView = frame->view()) {
+            if (scrollsOverflow())
+                frameView->addScrollableArea(this);
+            else
+                frameView->removeScrollableArea(this);
         }
-    } else if (m_scrollableAreaPage) {
-        m_scrollableAreaPage->removeScrollableArea(this);
-        m_scrollableAreaPage = 0;
     }
     
     // FIXME: Need to detect a swap from custom to native scrollbars (and vice versa).

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (106976 => 106977)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -668,8 +668,6 @@
     // Rectangle encompassing the scroll corner and resizer rect.
     IntRect scrollCornerAndResizerRect() const;
 
-    virtual void disconnectFromPage() { m_scrollableAreaPage = 0; }
-
     // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
     void scrollTo(int, int);
 
@@ -868,8 +866,6 @@
 #if USE(ACCELERATED_COMPOSITING)
     OwnPtr<RenderLayerBacking> m_backing;
 #endif
-
-    Page* m_scrollableAreaPage; // Page on which this is registered as a scrollable area.
 };
 
 inline void RenderLayer::updateZOrderLists()

Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (106976 => 106977)


--- trunk/Source/WebCore/rendering/RenderListBox.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -92,17 +92,17 @@
     ASSERT(element);
     ASSERT(element->isHTMLElement());
     ASSERT(element->hasTagName(HTMLNames::selectTag));
-    if (Page* page = frame()->page()) {
-        m_page = page;
-        m_page->addScrollableArea(this);
-    }
+
+    if (FrameView* frameView = frame()->view())
+        frameView->addScrollableArea(this);
 }
 
 RenderListBox::~RenderListBox()
 {
     setHasVerticalScrollbar(false);
-    if (m_page)
-        m_page->removeScrollableArea(this);
+
+    if (FrameView* frameView = frame()->view())
+        frameView->removeScrollableArea(this);
 }
 
 void RenderListBox::updateFromElement()

Modified: trunk/Source/WebCore/rendering/RenderListBox.h (106976 => 106977)


--- trunk/Source/WebCore/rendering/RenderListBox.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebCore/rendering/RenderListBox.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -121,8 +121,6 @@
 
     virtual ScrollableArea* enclosingScrollableArea() const;
 
-    virtual void disconnectFromPage() { m_page = 0; }
-
     // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
     void scrollTo(int newOffset);
 
@@ -147,8 +145,6 @@
     int m_indexOffset;
 
     RefPtr<Scrollbar> m_vBar;
-
-    Page* m_page;
 };
 
 inline RenderListBox* toRenderListBox(RenderObject* object)

Modified: trunk/Source/WebKit/chromium/ChangeLog (106976 => 106977)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-02-07 20:45:52 UTC (rev 106977)
@@ -1,3 +1,21 @@
+2012-02-07  Anders Carlsson  <ander...@apple.com>
+
+        ScrollableAreaSet should be moved from Page to FrameView
+        https://bugs.webkit.org/show_bug.cgi?id=62762
+
+        Reviewed by Beth Dakin.
+
+        Update for changes to WebCore now that the scrollable area set is kept per frame view.
+
+        * src/ScrollbarGroup.cpp:
+        (WebKit::ScrollbarGroup::ScrollbarGroup):
+        (WebKit::ScrollbarGroup::~ScrollbarGroup):
+        * src/ScrollbarGroup.h:
+        (WebCore):
+        (ScrollbarGroup):
+        * src/WebPluginContainerImpl.cpp:
+        (WebKit::WebPluginContainerImpl::scrollbarGroup):
+
 2012-02-07  Hans Wennborg  <h...@chromium.org>
 
         Chromium: remove WebSpeechInputResult::set

Modified: trunk/Source/WebKit/chromium/src/ScrollbarGroup.cpp (106976 => 106977)


--- trunk/Source/WebKit/chromium/src/ScrollbarGroup.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit/chromium/src/ScrollbarGroup.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -26,7 +26,7 @@
 #include "config.h"
 #include "ScrollbarGroup.h"
 
-#include "Page.h"
+#include "FrameView.h"
 #include "Scrollbar.h"
 #include "ScrollbarTheme.h"
 #include "platform/WebRect.h"
@@ -36,20 +36,19 @@
 
 namespace WebKit {
 
-ScrollbarGroup::ScrollbarGroup(Page* page)
-    : m_page(page)
+ScrollbarGroup::ScrollbarGroup(FrameView* frameView)
+    : m_frameView(frameView)
     , m_horizontalScrollbar(0)
     , m_verticalScrollbar(0)
 {
-    m_page->addScrollableArea(this);
+    m_frameView->addScrollableArea(this);
 }
 
 ScrollbarGroup::~ScrollbarGroup()
 {
     ASSERT(!m_horizontalScrollbar);
     ASSERT(!m_verticalScrollbar);
-    if (m_page)
-        m_page->removeScrollableArea(this);
+    m_frameView->removeScrollableArea(this);
 }
 
 void ScrollbarGroup::scrollbarCreated(WebScrollbarImpl* scrollbar)
@@ -249,9 +248,4 @@
     return true;
 }
 
-void ScrollbarGroup::disconnectFromPage()
-{
-    m_page = 0;
-}
-
 } // namespace WebKit

Modified: trunk/Source/WebKit/chromium/src/ScrollbarGroup.h (106976 => 106977)


--- trunk/Source/WebKit/chromium/src/ScrollbarGroup.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit/chromium/src/ScrollbarGroup.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -31,7 +31,7 @@
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
-class Page;
+class FrameView;
 }
 
 namespace WebKit {
@@ -40,7 +40,7 @@
 
 class ScrollbarGroup : public WebCore::ScrollableArea {
 public:
-    explicit ScrollbarGroup(WebCore::Page*);
+    explicit ScrollbarGroup(WebCore::FrameView*);
     ~ScrollbarGroup();
 
     void scrollbarCreated(WebScrollbarImpl*);
@@ -72,10 +72,9 @@
     virtual bool shouldSuspendScrollAnimations() const;
     virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate);
     virtual bool isOnActivePage() const;
-    virtual void disconnectFromPage();
 
 private:
-    WebCore::Page* m_page;
+    WebCore::FrameView* m_frameView;
     WebCore::IntPoint m_lastMousePosition;
     WebScrollbarImpl* m_horizontalScrollbar;
     WebScrollbarImpl* m_verticalScrollbar;

Modified: trunk/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp (106976 => 106977)


--- trunk/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -493,7 +493,7 @@
 ScrollbarGroup* WebPluginContainerImpl::scrollbarGroup()
 {
     if (!m_scrollbarGroup)
-        m_scrollbarGroup = adoptPtr(new ScrollbarGroup(m_element->document()->frame()->page()));
+        m_scrollbarGroup = adoptPtr(new ScrollbarGroup(m_element->document()->frame()->view()));
     return m_scrollbarGroup.get();
 }
 

Modified: trunk/Source/WebKit2/ChangeLog (106976 => 106977)


--- trunk/Source/WebKit2/ChangeLog	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit2/ChangeLog	2012-02-07 20:45:52 UTC (rev 106977)
@@ -1,3 +1,20 @@
+2012-02-06  Anders Carlsson  <ander...@apple.com>
+
+        ScrollableAreaSet should be moved from Page to FrameView
+        https://bugs.webkit.org/show_bug.cgi?id=62762
+
+        Reviewed by Beth Dakin.
+
+        * WebProcess/Plugins/PDF/BuiltInPDFView.cpp:
+        (WebKit::BuiltInPDFView::initialize):
+        Call FrameView::addScrollableArea instead.
+
+        (WebKit::BuiltInPDFView::destroy):
+        Call FrameView::removeScrollableArea instead.
+
+        * WebProcess/Plugins/PDF/BuiltInPDFView.h:
+        Remove disconnectFromPage since it no longer exists on ScrollableArea.
+
 2012-02-07  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Add cut, copy and paste methods to WebKit2 GTK+ API

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.cpp (106976 => 106977)


--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.cpp	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.cpp	2012-02-07 20:45:52 UTC (rev 106977)
@@ -348,7 +348,7 @@
 
 bool BuiltInPDFView::initialize(const Parameters& parameters)
 {
-    m_frame->coreFrame()->page()->addScrollableArea(this);
+    m_frame->coreFrame()->view()->addScrollableArea(this);
 
     // Load the src URL if needed.
     m_sourceURL = parameters.url;
@@ -361,8 +361,8 @@
 void BuiltInPDFView::destroy()
 {
     if (m_frame) {
-        if (Page* page = m_frame->coreFrame()->page())
-            page->removeScrollableArea(this);
+        if (FrameView* frameView = m_frame->coreFrame()->view())
+            frameView->removeScrollableArea(this);
     }
 
     destroyScrollbar(HorizontalScrollbar);

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h (106976 => 106977)


--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h	2012-02-07 20:40:08 UTC (rev 106976)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h	2012-02-07 20:45:52 UTC (rev 106977)
@@ -138,7 +138,6 @@
     virtual WebCore::Scrollbar* horizontalScrollbar() const  { return m_horizontalScrollbar.get(); }
     virtual WebCore::Scrollbar* verticalScrollbar() const { return m_verticalScrollbar.get(); }
     virtual bool isOnActivePage() const;
-    virtual void disconnectFromPage() { m_frame = 0; }
     virtual bool shouldSuspendScrollAnimations() const { return false; } // If we return true, ScrollAnimatorMac will keep cycling a timer forever, waiting for a good time to animate.
     virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate);
     virtual void zoomAnimatorTransformChanged(float, float, float, ZoomAnimationState) { }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to