Title: [214443] trunk/Source/WebCore
Revision
214443
Author
[email protected]
Date
2017-03-27 17:06:28 -0700 (Mon, 27 Mar 2017)

Log Message

Move visibleInViewportStateChanged callback from Element to render tree
https://bugs.webkit.org/show_bug.cgi?id=170039

Reviewed by Zalan Bujtas.

Make it easier to use from the render tree.

Also for simplicity move the bits from RenderObject rare data to RenderElement.
There is plenty of space there.

* dom/Element.h:
(WebCore::Element::isVisibleInViewportChanged): Deleted.
* html/HTMLMediaElement.h:
* rendering/RenderElement.cpp:
(WebCore::RenderElement::RenderElement):
(WebCore::RenderElement::willBeDestroyed):
(WebCore::RenderElement::registerForVisibleInViewportCallback):
(WebCore::RenderElement::unregisterForVisibleInViewportCallback):
(WebCore::RenderElement::setVisibleInViewportState):
(WebCore::RenderElement::visibleInViewportStateChanged):
* rendering/RenderElement.h:
(WebCore::RenderElement::visibleInViewportState):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::setIsRegisteredForVisibleInViewportCallback): Deleted.
(WebCore::RenderObject::setVisibleInViewportState): Deleted.
* rendering/RenderObject.h:
(WebCore::RenderObject::hasOutlineAutoAncestor):
(WebCore::RenderObject::RenderObjectRareData::RenderObjectRareData):
(WebCore::RenderObject::isRegisteredForVisibleInViewportCallback): Deleted.
(WebCore::RenderObject::visibleInViewportState): Deleted.
* rendering/RenderVideo.cpp:
(WebCore::RenderVideo::visibleInViewportStateChanged):
* rendering/RenderVideo.h:
* rendering/RenderView.cpp:
(WebCore::RenderView::updateVisibleViewportRect):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (214442 => 214443)


--- trunk/Source/WebCore/ChangeLog	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/ChangeLog	2017-03-28 00:06:28 UTC (rev 214443)
@@ -1,3 +1,41 @@
+2017-03-27  Antti Koivisto  <[email protected]>
+
+        Move visibleInViewportStateChanged callback from Element to render tree
+        https://bugs.webkit.org/show_bug.cgi?id=170039
+
+        Reviewed by Zalan Bujtas.
+
+        Make it easier to use from the render tree.
+
+        Also for simplicity move the bits from RenderObject rare data to RenderElement.
+        There is plenty of space there.
+
+        * dom/Element.h:
+        (WebCore::Element::isVisibleInViewportChanged): Deleted.
+        * html/HTMLMediaElement.h:
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::RenderElement):
+        (WebCore::RenderElement::willBeDestroyed):
+        (WebCore::RenderElement::registerForVisibleInViewportCallback):
+        (WebCore::RenderElement::unregisterForVisibleInViewportCallback):
+        (WebCore::RenderElement::setVisibleInViewportState):
+        (WebCore::RenderElement::visibleInViewportStateChanged):
+        * rendering/RenderElement.h:
+        (WebCore::RenderElement::visibleInViewportState):
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::setIsRegisteredForVisibleInViewportCallback): Deleted.
+        (WebCore::RenderObject::setVisibleInViewportState): Deleted.
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::hasOutlineAutoAncestor):
+        (WebCore::RenderObject::RenderObjectRareData::RenderObjectRareData):
+        (WebCore::RenderObject::isRegisteredForVisibleInViewportCallback): Deleted.
+        (WebCore::RenderObject::visibleInViewportState): Deleted.
+        * rendering/RenderVideo.cpp:
+        (WebCore::RenderVideo::visibleInViewportStateChanged):
+        * rendering/RenderVideo.h:
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::updateVisibleViewportRect):
+
 2017-03-27  Youenn Fablet  <[email protected]>
 
         addIceCandidate should not throw if passed null or undefined

Modified: trunk/Source/WebCore/dom/Element.h (214442 => 214443)


--- trunk/Source/WebCore/dom/Element.h	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/dom/Element.h	2017-03-28 00:06:28 UTC (rev 214443)
@@ -550,8 +550,6 @@
     bool hasDisplayContents() const;
     void setHasDisplayContents(bool);
 
-    virtual void isVisibleInViewportChanged() { }
-
     using ContainerNode::setAttributeEventListener;
     void setAttributeEventListener(const AtomicString& eventType, const QualifiedName& attributeName, const AtomicString& value);
 

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (214442 => 214443)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2017-03-28 00:06:28 UTC (rev 214443)
@@ -497,6 +497,8 @@
 
     bool isTemporarilyAllowingInlinePlaybackAfterFullscreen() const {return m_temporarilyAllowingInlinePlaybackAfterFullscreen; }
 
+    void isVisibleInViewportChanged();
+
 protected:
     HTMLMediaElement(const QualifiedName&, Document&, bool createdByParser);
     virtual ~HTMLMediaElement();
@@ -813,7 +815,6 @@
 #endif
 
     bool isVideoTooSmallForInlinePlayback();
-    void isVisibleInViewportChanged() final;
     void updateShouldAutoplay();
 
     void pauseAfterDetachedTask();

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2017-03-28 00:06:28 UTC (rev 214443)
@@ -114,6 +114,8 @@
     , m_renderBlockShouldForceRelayoutChildren(false)
     , m_renderBlockFlowHasMarkupTruncation(false)
     , m_renderBlockFlowLineLayoutPath(RenderBlockFlow::UndeterminedPath)
+    , m_isRegisteredForVisibleInViewportCallback(false)
+    , m_visibleInViewportState(VisibilityUnknown)
     , m_firstChild(nullptr)
     , m_lastChild(nullptr)
     , m_style(WTFMove(style))
@@ -1106,8 +1108,7 @@
 
     destroyLeftoverChildren();
 
-    if (isRegisteredForVisibleInViewportCallback())
-        unregisterForVisibleInViewportCallback();
+    unregisterForVisibleInViewportCallback();
 
     if (hasCounterNodeMap())
         RenderCounter::destroyCounterNodes(*this);
@@ -1145,9 +1146,6 @@
     }
     if (m_hasPausedImageAnimations)
         view().removeRendererWithPausedImageAnimations(*this);
-
-    if (isRegisteredForVisibleInViewportCallback())
-        view().unregisterForVisibleInViewportCallback(*this);
 }
 
 void RenderElement::setNeedsPositionedMovementLayout(const RenderStyle* oldStyle)
@@ -1467,9 +1465,9 @@
 
 void RenderElement::registerForVisibleInViewportCallback()
 {
-    if (isRegisteredForVisibleInViewportCallback())
+    if (m_isRegisteredForVisibleInViewportCallback)
         return;
-    setIsRegisteredForVisibleInViewportCallback(true);
+    m_isRegisteredForVisibleInViewportCallback = true;
 
     view().registerForVisibleInViewportCallback(*this);
 }
@@ -1476,21 +1474,24 @@
 
 void RenderElement::unregisterForVisibleInViewportCallback()
 {
-    if (!isRegisteredForVisibleInViewportCallback())
+    if (!m_isRegisteredForVisibleInViewportCallback)
         return;
-    setIsRegisteredForVisibleInViewportCallback(false);
+    m_isRegisteredForVisibleInViewportCallback = false;
 
     view().unregisterForVisibleInViewportCallback(*this);
 }
 
-void RenderElement::visibleInViewportStateChanged(VisibleInViewportState state)
+void RenderElement::setVisibleInViewportState(VisibleInViewportState state)
 {
-    if (state == visibleInViewportState())
+    if (state == m_visibleInViewportState)
         return;
-    setVisibleInViewportState(state);
+    m_visibleInViewportState = state;
+    visibleInViewportStateChanged();
+}
 
-    if (element())
-        element()->isVisibleInViewportChanged();
+void RenderElement::visibleInViewportStateChanged()
+{
+    ASSERT_NOT_REACHED();
 }
 
 void RenderElement::newImageAnimationFrameAvailable(CachedImage& image)

Modified: trunk/Source/WebCore/rendering/RenderElement.h (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderElement.h	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderElement.h	2017-03-28 00:06:28 UTC (rev 214443)
@@ -185,8 +185,16 @@
 
     void registerForVisibleInViewportCallback();
     void unregisterForVisibleInViewportCallback();
-    void visibleInViewportStateChanged(VisibleInViewportState);
 
+    enum VisibleInViewportState {
+        VisibilityUnknown,
+        VisibleInViewport,
+        NotVisibleInViewport,
+    };
+    VisibleInViewportState visibleInViewportState() const { return static_cast<VisibleInViewportState>(m_visibleInViewportState); }
+    void setVisibleInViewportState(VisibleInViewportState);
+    virtual void visibleInViewportStateChanged();
+
     bool repaintForPausedImageAnimationsIfNeeded(const IntRect& visibleRect);
     bool hasPausedImageAnimations() const { return m_hasPausedImageAnimations; }
     void setHasPausedImageAnimations(bool b) { m_hasPausedImageAnimations = b; }
@@ -337,6 +345,9 @@
     unsigned m_renderBlockFlowHasMarkupTruncation : 1;
     unsigned m_renderBlockFlowLineLayoutPath : 2;
 
+    unsigned m_isRegisteredForVisibleInViewportCallback : 1;
+    unsigned m_visibleInViewportState : 2;
+
     RenderObject* m_firstChild;
     RenderObject* m_lastChild;
 

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2017-03-28 00:06:28 UTC (rev 214443)
@@ -1985,18 +1985,6 @@
         ensureRareData().setHasOutlineAutoAncestor(hasOutlineAutoAncestor);
 }
 
-void RenderObject::setIsRegisteredForVisibleInViewportCallback(bool registered)
-{
-    if (registered || hasRareData())
-        ensureRareData().setIsRegisteredForVisibleInViewportCallback(registered);
-}
-
-void RenderObject::setVisibleInViewportState(VisibleInViewportState visible)
-{
-    if (visible != VisibilityUnknown || hasRareData())
-        ensureRareData().setVisibleInViewportState(visible);
-}
-
 RenderObject::RareDataMap& RenderObject::rareDataMap()
 {
     static NeverDestroyed<RareDataMap> map;

Modified: trunk/Source/WebCore/rendering/RenderObject.h (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderObject.h	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2017-03-28 00:06:28 UTC (rev 214443)
@@ -446,19 +446,11 @@
     bool hasReflection() const { return m_bitfields.hasRareData() && rareData().hasReflection(); }
     bool isRenderFlowThread() const { return m_bitfields.hasRareData() && rareData().isRenderFlowThread(); }
     bool hasOutlineAutoAncestor() const { return m_bitfields.hasRareData() && rareData().hasOutlineAutoAncestor(); }
-    bool isRegisteredForVisibleInViewportCallback() { return m_bitfields.hasRareData() && rareData().isRegisteredForVisibleInViewportCallback(); }
 
     bool isExcludedFromNormalLayout() const { return m_bitfields.isExcludedFromNormalLayout(); }
     void setIsExcludedFromNormalLayout(bool excluded) { m_bitfields.setIsExcludedFromNormalLayout(excluded); }
     bool isExcludedAndPlacedInBorder() const { return isExcludedFromNormalLayout() && isLegend(); }
 
-    enum VisibleInViewportState {
-        VisibilityUnknown,
-        VisibleInViewport,
-        NotVisibleInViewport,
-    };
-    VisibleInViewportState visibleInViewportState() { return m_bitfields.hasRareData() ? rareData().visibleInViewportState() : VisibilityUnknown; }
-
     bool hasLayer() const { return m_bitfields.hasLayer(); }
 
     enum BoxDecorationState {
@@ -567,8 +559,6 @@
     void setHasReflection(bool = true);
     void setIsRenderFlowThread(bool = true);
     void setHasOutlineAutoAncestor(bool = true);
-    void setIsRegisteredForVisibleInViewportCallback(bool);
-    void setVisibleInViewportState(VisibleInViewportState);
 
     // Hook so that RenderTextControl can return the line height of its inner renderer.
     // For other renderers, the value is the same as lineHeight(false).
@@ -982,8 +972,6 @@
             , m_hasReflection(false)
             , m_isRenderFlowThread(false)
             , m_hasOutlineAutoAncestor(false)
-            , m_isRegisteredForVisibleInViewportCallback(false)
-            , m_visibleInViewportState(VisibilityUnknown)
         {
         }
         ADD_BOOLEAN_BITFIELD(isDragging, IsDragging);
@@ -992,8 +980,6 @@
         ADD_BOOLEAN_BITFIELD(hasOutlineAutoAncestor, HasOutlineAutoAncestor);
 
         // From RenderElement
-        ADD_BOOLEAN_BITFIELD(isRegisteredForVisibleInViewportCallback, IsRegisteredForVisibleInViewportCallback);
-        ADD_ENUM_BITFIELD(visibleInViewportState, VisibleInViewportState, VisibleInViewportState, 2);
         std::unique_ptr<RenderStyle> cachedFirstLineStyle;
     };
     

Modified: trunk/Source/WebCore/rendering/RenderVideo.cpp (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderVideo.cpp	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderVideo.cpp	2017-03-28 00:06:28 UTC (rev 214443)
@@ -67,6 +67,11 @@
     RenderMedia::willBeDestroyed();
 }
 
+void RenderVideo::visibleInViewportStateChanged()
+{
+    videoElement().isVisibleInViewportChanged();
+}
+
 IntSize RenderVideo::defaultSize()
 {
     // These values are specified in the spec.

Modified: trunk/Source/WebCore/rendering/RenderVideo.h (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderVideo.h	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderVideo.h	2017-03-28 00:06:28 UTC (rev 214443)
@@ -71,6 +71,8 @@
 
     void layout() final;
 
+    void visibleInViewportStateChanged() final;
+
     LayoutUnit computeReplacedLogicalWidth(ShouldComputePreferred  = ComputeActual) const final;
     LayoutUnit minimumReplacedHeight() const final;
 

Modified: trunk/Source/WebCore/rendering/RenderView.cpp (214442 => 214443)


--- trunk/Source/WebCore/rendering/RenderView.cpp	2017-03-27 23:37:40 UTC (rev 214442)
+++ trunk/Source/WebCore/rendering/RenderView.cpp	2017-03-28 00:06:28 UTC (rev 214443)
@@ -1389,8 +1389,10 @@
 {
     resumePausedImageAnimationsIfNeeded(visibleRect);
 
-    for (auto* renderer : m_visibleInViewportRenderers)
-        renderer->visibleInViewportStateChanged(visibleRect.intersects(enclosingIntRect(renderer->absoluteClippedOverflowRect())) ? RenderElement::VisibleInViewport : RenderElement::NotVisibleInViewport);
+    for (auto* renderer : m_visibleInViewportRenderers) {
+        auto state = visibleRect.intersects(enclosingIntRect(renderer->absoluteClippedOverflowRect())) ? RenderElement::VisibleInViewport : RenderElement::NotVisibleInViewport;
+        renderer->setVisibleInViewportState(state);
+    }
 }
 
 void RenderView::addRendererWithPausedImageAnimations(RenderElement& renderer)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to