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)