Title: [257933] trunk/Source/WebCore
Revision
257933
Author
simon.fra...@apple.com
Date
2020-03-05 11:06:19 -0800 (Thu, 05 Mar 2020)

Log Message

Make m_viewportConstrainedObjects into a WeakHashSet
https://bugs.webkit.org/show_bug.cgi?id=208625

Reviewed by Ryosuke Niwa.

Use WeakHashSet<> for m_viewportConstrainedObjects.

* page/FrameView.cpp:
(WebCore::FrameView::didDestroyRenderTree):
(WebCore::FrameView::addViewportConstrainedObject):
(WebCore::FrameView::removeViewportConstrainedObject):
(WebCore::FrameView::scrollContentsFastPath):
(WebCore::FrameView::setViewportConstrainedObjectsNeedLayout):
* page/FrameView.h:
* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects const):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateCompositingLayers):
* rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::willBeDestroyed):
(WebCore::RenderLayerModelObject::styleDidChange):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (257932 => 257933)


--- trunk/Source/WebCore/ChangeLog	2020-03-05 19:02:53 UTC (rev 257932)
+++ trunk/Source/WebCore/ChangeLog	2020-03-05 19:06:19 UTC (rev 257933)
@@ -1,3 +1,27 @@
+2020-03-05  Simon Fraser  <simon.fra...@apple.com>
+
+        Make m_viewportConstrainedObjects into a WeakHashSet
+        https://bugs.webkit.org/show_bug.cgi?id=208625
+
+        Reviewed by Ryosuke Niwa.
+
+        Use WeakHashSet<> for m_viewportConstrainedObjects.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::didDestroyRenderTree):
+        (WebCore::FrameView::addViewportConstrainedObject):
+        (WebCore::FrameView::removeViewportConstrainedObject):
+        (WebCore::FrameView::scrollContentsFastPath):
+        (WebCore::FrameView::setViewportConstrainedObjectsNeedLayout):
+        * page/FrameView.h:
+        * page/scrolling/ScrollingCoordinator.cpp:
+        (WebCore::ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects const):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateCompositingLayers):
+        * rendering/RenderLayerModelObject.cpp:
+        (WebCore::RenderLayerModelObject::willBeDestroyed):
+        (WebCore::RenderLayerModelObject::styleDidChange):
+
 2020-03-05  Kenneth Russell  <k...@chromium.org>
 
         REGRESSION: [ Mac ] fast/canvas/webgl/texImage2D-video-flipY-false.html is Timing out

Modified: trunk/Source/WebCore/page/FrameView.cpp (257932 => 257933)


--- trunk/Source/WebCore/page/FrameView.cpp	2020-03-05 19:02:53 UTC (rev 257932)
+++ trunk/Source/WebCore/page/FrameView.cpp	2020-03-05 19:06:19 UTC (rev 257933)
@@ -589,7 +589,7 @@
     // Everything else should have removed itself as the tree was felled.
     ASSERT(!m_embeddedObjectsToUpdate || m_embeddedObjectsToUpdate->isEmpty() || (m_embeddedObjectsToUpdate->size() == 1 && m_embeddedObjectsToUpdate->first() == nullptr));
 
-    ASSERT(!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty());
+    ASSERT(!m_viewportConstrainedObjects || m_viewportConstrainedObjects->computesEmpty());
     ASSERT(!m_slowRepaintObjects || m_slowRepaintObjects->computesEmpty());
 
     ASSERT(!frame().animation().hasAnimations());
@@ -1514,10 +1514,10 @@
     }
 }
 
-void FrameView::addViewportConstrainedObject(RenderLayerModelObject* object)
+void FrameView::addViewportConstrainedObject(RenderLayerModelObject& object)
 {
     if (!m_viewportConstrainedObjects)
-        m_viewportConstrainedObjects = makeUnique<ViewportConstrainedObjectSet>();
+        m_viewportConstrainedObjects = makeUnique<WeakHashSet<RenderLayerModelObject>>();
 
     if (!m_viewportConstrainedObjects->contains(object)) {
         m_viewportConstrainedObjects->add(object);
@@ -1531,7 +1531,7 @@
     }
 }
 
-void FrameView::removeViewportConstrainedObject(RenderLayerModelObject* object)
+void FrameView::removeViewportConstrainedObject(RenderLayerModelObject& object)
 {
     if (m_viewportConstrainedObjects && m_viewportConstrainedObjects->remove(object)) {
         if (Page* page = frame().page()) {
@@ -2070,7 +2070,7 @@
 
 bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect)
 {
-    if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty()) {
+    if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->computesEmpty()) {
         frame().page()->chrome().scroll(scrollDelta, rectToScroll, clipRect);
         return true;
     }
@@ -2080,14 +2080,14 @@
     // Get the rects of the fixed objects visible in the rectToScroll
     Region regionToUpdate;
     for (auto& renderer : *m_viewportConstrainedObjects) {
-        if (!renderer->style().hasViewportConstrainedPosition())
+        if (!renderer.style().hasViewportConstrainedPosition())
             continue;
-        if (renderer->isComposited())
+        if (renderer.isComposited())
             continue;
 
         // Fixed items should always have layers.
-        ASSERT(renderer->hasLayer());
-        RenderLayer* layer = downcast<RenderBoxModelObject>(*renderer).layer();
+        ASSERT(renderer.hasLayer());
+        RenderLayer* layer = downcast<RenderBoxModelObject>(renderer).layer();
 
         if (layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotCompositedForBoundsOutOfView
             || layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotCompositedForNoVisibleContent) {
@@ -2436,9 +2436,9 @@
         return;
 
     for (auto& renderer : *m_viewportConstrainedObjects) {
-        renderer->setNeedsLayout();
-        if (renderer->hasLayer()) {
-            auto* layer = downcast<RenderBoxModelObject>(*renderer).layer();
+        renderer.setNeedsLayout();
+        if (renderer.hasLayer()) {
+            auto* layer = downcast<RenderBoxModelObject>(renderer).layer();
             layer->setNeedsCompositingGeometryUpdate();
         }
     }

Modified: trunk/Source/WebCore/page/FrameView.h (257932 => 257933)


--- trunk/Source/WebCore/page/FrameView.h	2020-03-05 19:02:53 UTC (rev 257932)
+++ trunk/Source/WebCore/page/FrameView.h	2020-03-05 19:06:19 UTC (rev 257933)
@@ -34,6 +34,7 @@
 #include "Pagination.h"
 #include "PaintPhase.h"
 #include "RenderElement.h"
+#include "RenderLayerModelObject.h"
 #include "RenderPtr.h"
 #include "ScrollView.h"
 #include "StyleColor.h"
@@ -292,14 +293,13 @@
     void addSlowRepaintObject(RenderElement&);
     void removeSlowRepaintObject(RenderElement&);
     bool hasSlowRepaintObject(const RenderElement& renderer) const { return m_slowRepaintObjects && m_slowRepaintObjects->contains(renderer); }
-    bool hasSlowRepaintObjects() const { return m_slowRepaintObjects && m_slowRepaintObjects->computeSize(); }
+    bool hasSlowRepaintObjects() const { return m_slowRepaintObjects && !m_slowRepaintObjects->computesEmpty(); }
 
     // Includes fixed- and sticky-position objects.
-    typedef HashSet<RenderLayerModelObject*> ViewportConstrainedObjectSet;
-    void addViewportConstrainedObject(RenderLayerModelObject*);
-    void removeViewportConstrainedObject(RenderLayerModelObject*);
-    const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); }
-    bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; }
+    void addViewportConstrainedObject(RenderLayerModelObject&);
+    void removeViewportConstrainedObject(RenderLayerModelObject&);
+    const WeakHashSet<RenderLayerModelObject>* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); }
+    bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && !m_viewportConstrainedObjects->computesEmpty(); }
     
     float frameScaleFactor() const;
 
@@ -886,7 +886,7 @@
     IntSize m_autoSizeContentSize;
 
     std::unique_ptr<ScrollableAreaSet> m_scrollableAreas;
-    std::unique_ptr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects;
+    std::unique_ptr<WeakHashSet<RenderLayerModelObject>> m_viewportConstrainedObjects;
 
     OptionSet<LayoutMilestone> m_milestonesPendingPaint;
 

Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp (257932 => 257933)


--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp	2020-03-05 19:02:53 UTC (rev 257932)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp	2020-03-05 19:06:19 UTC (rev 257933)
@@ -312,14 +312,14 @@
 
 bool ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects(const FrameView& frameView) const
 {
-    const FrameView::ViewportConstrainedObjectSet* viewportConstrainedObjects = frameView.viewportConstrainedObjects();
+    auto* viewportConstrainedObjects = frameView.viewportConstrainedObjects();
     if (!viewportConstrainedObjects)
         return false;
 
     for (auto& viewportConstrainedObject : *viewportConstrainedObjects) {
-        if (!is<RenderBoxModelObject>(*viewportConstrainedObject) || !viewportConstrainedObject->hasLayer())
+        if (!is<RenderBoxModelObject>(viewportConstrainedObject) || !viewportConstrainedObject.hasLayer())
             return true;
-        auto& layer = *downcast<RenderBoxModelObject>(*viewportConstrainedObject).layer();
+        auto& layer = *downcast<RenderBoxModelObject>(viewportConstrainedObject).layer();
         // Any explicit reason that a fixed position element is not composited shouldn't cause slow scrolling.
         if (!layer.isComposited() && layer.viewportConstrainedNotCompositedReason() == RenderLayer::NoNotCompositedReason)
             return true;

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (257932 => 257933)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2020-03-05 19:02:53 UTC (rev 257932)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2020-03-05 19:06:19 UTC (rev 257933)
@@ -719,8 +719,8 @@
         // We only get here if we didn't scroll on the scrolling thread, so this update needs to re-position viewport-constrained layers.
         if (m_renderView.settings().acceleratedCompositingForFixedPositionEnabled() && isPageScroll) {
             if (auto* viewportConstrainedObjects = m_renderView.frameView().viewportConstrainedObjects()) {
-                for (auto* renderer : *viewportConstrainedObjects) {
-                    if (auto* layer = renderer->layer())
+                for (auto& renderer : *viewportConstrainedObjects) {
+                    if (auto* layer = renderer.layer())
                         layer->setNeedsCompositingGeometryUpdate();
                 }
             }

Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp (257932 => 257933)


--- trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp	2020-03-05 19:02:53 UTC (rev 257932)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp	2020-03-05 19:06:19 UTC (rev 257933)
@@ -70,7 +70,7 @@
 {
     if (isPositioned()) {
         if (style().hasViewportConstrainedPosition())
-            view().frameView().removeViewportConstrainedObject(this);
+            view().frameView().removeViewportConstrainedObject(*this);
     }
 
     if (hasLayer()) {
@@ -200,9 +200,9 @@
     bool oldStyleIsViewportConstrained = oldStyle && oldStyle->hasViewportConstrainedPosition();
     if (newStyleIsViewportConstrained != oldStyleIsViewportConstrained) {
         if (newStyleIsViewportConstrained && layer())
-            view().frameView().addViewportConstrainedObject(this);
+            view().frameView().addViewportConstrainedObject(*this);
         else
-            view().frameView().removeViewportConstrainedObject(this);
+            view().frameView().removeViewportConstrainedObject(*this);
     }
 
 #if ENABLE(CSS_SCROLL_SNAP)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to