WebKit Bugzilla
Attachment 359131 Details for
Bug 193433
: Avoid redundant repaints during style change
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193433-20190114211638.patch (text/plain), 28.11 KB, created by
Simon Fraser (smfr)
on 2019-01-14 21:16:39 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2019-01-14 21:16:39 PST
Size:
28.11 KB
patch
obsolete
>Subversion Revision: 239903 >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 407a293643adf6cbdcf33f6ad82eb10da3d34743..bd91de3a422c040f1efe7d8733e5ed44eab430e6 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,13 @@ >+2019-01-14 Simon Fraser <simon.fraser@apple.com> >+ >+ Avoid redundant repaints during style change >+ https://bugs.webkit.org/show_bug.cgi?id=193433 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * wtf/StackShot.h: >+ (WTF::StackShot::dump const): >+ > 2019-01-11 David Kilzer <ddkilzer@apple.com> > > Follow-up: WorkQueue::concurrentApply() passes a raw pointer to a temporary String to Thread::create(). >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 3d27a2e6c0dbb7e565f59aa96e0440f80e114b91..68992c87637ec110f1b707d4b8ab12204d86ddee 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,50 @@ >+2019-01-14 Simon Fraser <simon.fraser@apple.com> >+ >+ Avoid redundant repaints during style change >+ https://bugs.webkit.org/show_bug.cgi?id=193433 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * page/FrameView.cpp: >+ (WebCore::FrameView::paintContents): >+ * rendering/RenderBlock.cpp: >+ (WebCore::RenderBlock::styleWillChange): >+ * rendering/RenderBlock.h: >+ * rendering/RenderBlockFlow.cpp: >+ (WebCore::RenderBlockFlow::styleWillChange): >+ * rendering/RenderBlockFlow.h: >+ * rendering/RenderBox.cpp: >+ (WebCore::RenderBox::styleWillChange): >+ (WebCore::RenderBox::repaintLayerRectsForImage): >+ * rendering/RenderBox.h: >+ * rendering/RenderDeprecatedFlexibleBox.cpp: >+ (WebCore::RenderDeprecatedFlexibleBox::styleWillChange): >+ * rendering/RenderDeprecatedFlexibleBox.h: >+ * rendering/RenderElement.cpp: >+ (WebCore::RenderElement::initializeStyle): >+ (WebCore::RenderElement::setStyle): >+ (WebCore::RenderElement::styleWillChange): >+ (WebCore::RenderElement::styleDidChange): >+ * rendering/RenderElement.h: >+ * rendering/RenderFlexibleBox.cpp: >+ (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): >+ * rendering/RenderImage.cpp: >+ (WebCore::RenderImage::styleWillChange): >+ * rendering/RenderImage.h: >+ * rendering/RenderInline.cpp: >+ (WebCore::RenderInline::styleWillChange): >+ * rendering/RenderInline.h: >+ * rendering/RenderLayer.cpp: >+ (WebCore::RenderLayer::updateLayerPositions): >+ * rendering/RenderLayerModelObject.cpp: >+ (WebCore::RenderLayerModelObject::styleWillChange): >+ * rendering/RenderLayerModelObject.h: >+ * rendering/RenderObject.cpp: >+ (WebCore::lastRepaintRect): >+ (WebCore::RenderObject::repaintUsingContainer const): >+ > 2019-01-12 Zalan Bujtas <zalan@apple.com> > > [LFC] Block/InlinFormattingContext should take Block/InlineFormattingState >diff --git a/Source/WTF/wtf/StackShot.h b/Source/WTF/wtf/StackShot.h >index 7b3ad9243b9ade2714ed6064255485025455b134..60523f7f532e3ff9efc2658c209b89b9fd1985ca 100644 >--- a/Source/WTF/wtf/StackShot.h >+++ b/Source/WTF/wtf/StackShot.h >@@ -103,6 +103,11 @@ public: > return !m_size && m_array.get() == deletedValueArray(); > } > >+ void dump() const >+ { >+ WTFPrintBacktrace(m_array.get(), m_size); >+ } >+ > // Make Spectrum<> happy. > bool operator>(const StackShot&) const { return false; } > >diff --git a/Source/WebCore/page/FrameView.cpp b/Source/WebCore/page/FrameView.cpp >index d25a7e61a7ae34cb257e14f0e525c73982282de9..ef1016b01533df5f048cd669a7254331680855cf 100644 >--- a/Source/WebCore/page/FrameView.cpp >+++ b/Source/WebCore/page/FrameView.cpp >@@ -4194,6 +4194,7 @@ void FrameView::didPaintContents(GraphicsContext& context, const IntRect& dirtyR > > void FrameView::paintContents(GraphicsContext& context, const IntRect& dirtyRect, SecurityOriginPaintPolicy securityOriginPaintPolicy) > { >+// WTFLogAlways("FrameView %p paintContents", this); > #ifndef NDEBUG > bool fillWithWarningColor; > if (frame().document()->printing()) >diff --git a/Source/WebCore/rendering/RenderBlock.cpp b/Source/WebCore/rendering/RenderBlock.cpp >index 3909c5a3697eacf289b289800b679f9c07d78f7e..4c8028e0475d003a68c998c24ff0cea21212c351 100644 >--- a/Source/WebCore/rendering/RenderBlock.cpp >+++ b/Source/WebCore/rendering/RenderBlock.cpp >@@ -410,13 +410,13 @@ void RenderBlock::removePositionedObjectsIfNeeded(const RenderStyle& oldStyle, c > } > } > >-void RenderBlock::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderBlock::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > const RenderStyle* oldStyle = hasInitializedStyle() ? &style() : nullptr; > setReplaced(newStyle.isDisplayInlineType()); > if (oldStyle) > removePositionedObjectsIfNeeded(*oldStyle, newStyle); >- RenderBox::styleWillChange(diff, newStyle); >+ RenderBox::styleWillChange(diff, newStyle, didRepaint); > } > > static bool borderOrPaddingLogicalWidthChanged(const RenderStyle& oldStyle, const RenderStyle& newStyle) >diff --git a/Source/WebCore/rendering/RenderBlock.h b/Source/WebCore/rendering/RenderBlock.h >index fd74af17824db3f7f9c240f2ed64a7dd352f7d39..5535abdd7aa20509edf2d19c093b9350d7e4fde8 100644 >--- a/Source/WebCore/rendering/RenderBlock.h >+++ b/Source/WebCore/rendering/RenderBlock.h >@@ -364,7 +364,7 @@ protected: > > void updateScrollInfoAfterLayout(); > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; > > virtual bool hasLineIfEmpty() const; >diff --git a/Source/WebCore/rendering/RenderBlockFlow.cpp b/Source/WebCore/rendering/RenderBlockFlow.cpp >index 0ecf11fa2a62e80af165ea09abfbce021dce501c..6d68a30fff89f44d5d1a38970e74e37f11610e33 100644 >--- a/Source/WebCore/rendering/RenderBlockFlow.cpp >+++ b/Source/WebCore/rendering/RenderBlockFlow.cpp >@@ -2035,7 +2035,7 @@ void RenderBlockFlow::updateStylesForColumnChildren() > child->setStyle(RenderStyle::createAnonymousStyleWithDisplay(style(), DisplayType::Block)); > } > >-void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > const RenderStyle* oldStyle = hasInitializedStyle() ? &style() : nullptr; > s_canPropagateFloatIntoSibling = oldStyle ? !isFloatingOrOutOfFlowPositioned() && !avoidsFloats() : false; >@@ -2050,7 +2050,7 @@ void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& n > } > } > >- RenderBlock::styleWillChange(diff, newStyle); >+ RenderBlock::styleWillChange(diff, newStyle, didRepaint); > } > > void RenderBlockFlow::deleteLines() >diff --git a/Source/WebCore/rendering/RenderBlockFlow.h b/Source/WebCore/rendering/RenderBlockFlow.h >index bdbbe3ceb5f7fb6450a16819ced5669ce13c7410..1c11b7731f84e9aeb7caaf099ffc4866a787ba28 100644 >--- a/Source/WebCore/rendering/RenderBlockFlow.h >+++ b/Source/WebCore/rendering/RenderBlockFlow.h >@@ -433,7 +433,7 @@ protected: > bool mustSeparateMarginBeforeForChild(const RenderBox&) const; > bool mustSeparateMarginAfterForChild(const RenderBox&) const; > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; > > void createFloatingObjects(); >diff --git a/Source/WebCore/rendering/RenderBox.cpp b/Source/WebCore/rendering/RenderBox.cpp >index 06aebaf65d5df19b7b02df2aef6124e6a64f442c..1972bf71f108c73fdca1428212b019b52c5ebfc0 100644 >--- a/Source/WebCore/rendering/RenderBox.cpp >+++ b/Source/WebCore/rendering/RenderBox.cpp >@@ -251,7 +251,7 @@ void RenderBox::removeFloatingOrPositionedChildFromBlockLists() > RenderBlock::removePositionedObject(*this); > } > >-void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > s_hadOverflowClip = hasOverflowClip(); > >@@ -269,9 +269,13 @@ void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyl > // to dirty the render tree using the old position value now. > if (diff == StyleDifference::Layout && parent() && oldStyle->position() != newStyle.position()) { > markContainingBlocksForLayout(); >- if (oldStyle->position() == PositionType::Static) >- repaint(); >- else if (newStyle.hasOutOfFlowPosition()) >+ if (oldStyle->position() == PositionType::Static) { >+ if (!didRepaint) { >+ repaint(); >+ didRepaint = true; >+ } else >+ WTFLogAlways("RenderBox %p styleWillChange would have done redundant repaint", this); >+ } else if (newStyle.hasOutOfFlowPosition()) > parent()->setChildNeedsLayout(); > if (isFloating() && !isOutOfFlowPositioned() && newStyle.hasOutOfFlowPosition()) > removeFloatingOrPositionedChildFromBlockLists(); >@@ -289,7 +293,7 @@ void RenderBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyl > } > #endif > >- RenderBoxModelObject::styleWillChange(diff, newStyle); >+ RenderBoxModelObject::styleWillChange(diff, newStyle, didRepaint); > } > > void RenderBox::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) >@@ -1716,6 +1720,8 @@ void RenderBox::imageChanged(WrappedImagePtr image, const IntRect*) > > bool RenderBox::repaintLayerRectsForImage(WrappedImagePtr image, const FillLayer& layers, bool drawingBackground) > { >+// WTFLogAlways("RenderBox %p repaintLayerRectsForImage %p", this, image); >+ > LayoutRect rendererRect; > RenderBox* layerRenderer = nullptr; > >diff --git a/Source/WebCore/rendering/RenderBox.h b/Source/WebCore/rendering/RenderBox.h >index 5510685294294abf8f5d6eb2a0cac2106f6a6c12..3d940621f55bff4c785621842e13b663c37fbeea 100644 >--- a/Source/WebCore/rendering/RenderBox.h >+++ b/Source/WebCore/rendering/RenderBox.h >@@ -636,7 +636,7 @@ protected: > RenderBox(Element&, RenderStyle&&, BaseTypeFlags); > RenderBox(Document&, RenderStyle&&, BaseTypeFlags); > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; > void updateFromStyle() override; > >diff --git a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp >index b315e09459dc218e57dcce65f322ac8799839efb..b2f13ac6cbd0b1b1d4e65a6c85f5af9e6ce87495 100644 >--- a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp >+++ b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp >@@ -164,13 +164,13 @@ static LayoutUnit contentHeightForChild(RenderBox* child) > return child->logicalHeight() - child->borderAndPaddingLogicalHeight(); > } > >-void RenderDeprecatedFlexibleBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderDeprecatedFlexibleBox::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > auto* oldStyle = hasInitializedStyle() ? &style() : nullptr; > if (oldStyle && !oldStyle->lineClamp().isNone() && newStyle.lineClamp().isNone()) > clearLineClamp(); > >- RenderBlock::styleWillChange(diff, newStyle); >+ RenderBlock::styleWillChange(diff, newStyle, didRepaint); > } > > void RenderDeprecatedFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const >diff --git a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h >index 9013a46cdd289466ce78bc1cd1d5af94c08f9208..aa305fe2d722f7fc9de4c4ccafcf12de4cfdcb99 100644 >--- a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h >+++ b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h >@@ -38,7 +38,7 @@ public: > > const char* renderName() const override; > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > > void layoutBlock(bool relayoutChildren, LayoutUnit pageHeight = 0_lu) override; > void layoutHorizontalBox(bool relayoutChildren); >diff --git a/Source/WebCore/rendering/RenderElement.cpp b/Source/WebCore/rendering/RenderElement.cpp >index c9b95d82389907d6913bd3c53a5f6f0c70ed55da..59583f76efa42ab1c86ca5a45079bbe37145f5f4 100644 >--- a/Source/WebCore/rendering/RenderElement.cpp >+++ b/Source/WebCore/rendering/RenderElement.cpp >@@ -78,6 +78,7 @@ > #include <wtf/IsoMallocInlines.h> > #include <wtf/MathExtras.h> > #include <wtf/StackStats.h> >+#include <wtf/TimingScope.h> > > #include "RenderGrid.h" > >@@ -379,7 +380,8 @@ void RenderElement::initializeStyle() > { > Style::loadPendingResources(m_style, document(), element()); > >- styleWillChange(StyleDifference::NewStyle, style()); >+ bool didRepaint = false; >+ styleWillChange(StyleDifference::NewStyle, style(), didRepaint); > m_hasInitializedStyle = true; > styleDidChange(StyleDifference::NewStyle, nullptr); > >@@ -408,7 +410,8 @@ void RenderElement::setStyle(RenderStyle&& style, StyleDifference minimalStyleDi > > Style::loadPendingResources(style, document(), element()); > >- styleWillChange(diff, style); >+ bool didRepaint = false; >+ styleWillChange(diff, style, didRepaint); > auto oldStyle = m_style.replace(WTFMove(style)); > bool detachedFromParent = !parent(); > >@@ -449,7 +452,11 @@ void RenderElement::setStyle(RenderStyle&& style, StyleDifference minimalStyleDi > if (updatedDiff == StyleDifference::RepaintLayer || shouldRepaintForStyleDifference(updatedDiff)) { > // Do a repaint with the new style now, e.g., for example if we go from > // not having an outline to having an outline. >- repaint(); >+ if (didRepaint) { >+ TimingScope scope("RenderElement::setStyle - redundant repaint", 1); >+ repaint(); >+ } else >+ repaint(); > } > } > >@@ -698,7 +705,7 @@ void RenderElement::invalidateCachedFirstLineStyle() > descendant.m_hasValidCachedFirstLineStyle = false; > } > >-void RenderElement::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderElement::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > ASSERT(settings().shouldAllowUserInstalledFonts() || newStyle.fontDescription().shouldAllowUserInstalledFonts() == AllowUserInstalledFonts::No); > >@@ -729,14 +736,25 @@ void RenderElement::styleWillChange(StyleDifference diff, const RenderStyle& new > layer->setHasVisibleContent(); > else if (layer->hasVisibleContent() && (this == &layer->renderer() || layer->renderer().style().visibility() != Visibility::Visible)) { > layer->dirtyVisibleContentStatus(); >- if (diff > StyleDifference::RepaintLayer) >- repaint(); >+ if (diff > StyleDifference::RepaintLayer) { >+ if (!didRepaint) { >+ repaint(); >+ didRepaint = true; >+ } else >+ WTFLogAlways("RenderElement %p styleWillChange would have done redundant repaint", this); >+ } > } > } > } > >- if (m_parent && (newStyle.outlineSize() < m_style.outlineSize() || shouldRepaintForStyleDifference(diff))) >- repaint(); >+ if (m_parent && (newStyle.outlineSize() < m_style.outlineSize() || shouldRepaintForStyleDifference(diff))) { >+ if (!didRepaint) { >+ repaint(); >+ didRepaint = true; >+ } else >+ WTFLogAlways("RenderElement %p styleWillChange 2 would have done redundant repaint", this); >+ } >+ > if (isFloating() && m_style.floating() != newStyle.floating()) { > // For changes in float styles, we need to conceivably remove ourselves > // from the floating objects list. >@@ -795,12 +813,16 @@ static inline bool areCursorsEqual(const RenderStyle* a, const RenderStyle* b) > > void RenderElement::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) > { >+// WTFLogAlways("RenderElement %p styleDidChange (diff %d) - updating images", this, (int)diff); >+ > updateFillImages(oldStyle ? &oldStyle->backgroundLayers() : nullptr, m_style.backgroundLayers()); > updateFillImages(oldStyle ? &oldStyle->maskLayers() : nullptr, m_style.maskLayers()); > updateImage(oldStyle ? oldStyle->borderImage().image() : nullptr, m_style.borderImage().image()); > updateImage(oldStyle ? oldStyle->maskBoxImage().image() : nullptr, m_style.maskBoxImage().image()); > updateShapeImage(oldStyle ? oldStyle->shapeOutside() : nullptr, m_style.shapeOutside()); > >+// WTFLogAlways("RenderElement %p styleDidChange (diff %d) - done updating images", this, (int)diff); >+ > SVGRenderSupport::styleChanged(*this, oldStyle); > > if (!m_parent) >diff --git a/Source/WebCore/rendering/RenderElement.h b/Source/WebCore/rendering/RenderElement.h >index d46dd33004f40fb7332776e5460b94ec47fe2f8f..1a87b667e903a2a7f80a8c6d633c272287f3116a 100644 >--- a/Source/WebCore/rendering/RenderElement.h >+++ b/Source/WebCore/rendering/RenderElement.h >@@ -247,7 +247,7 @@ protected: > void setFirstChild(RenderObject* child) { m_firstChild = child; } > void setLastChild(RenderObject* child) { m_lastChild = child; } > >- virtual void styleWillChange(StyleDifference, const RenderStyle& newStyle); >+ virtual void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint); > virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); > > void insertedIntoTree() override; >diff --git a/Source/WebCore/rendering/RenderFlexibleBox.cpp b/Source/WebCore/rendering/RenderFlexibleBox.cpp >index b30fc7f92f786e9943a9a9709e1deaa25309473a..d4a2f399cb9db77621bdd9d88da1ac84a556bcea 100644 >--- a/Source/WebCore/rendering/RenderFlexibleBox.cpp >+++ b/Source/WebCore/rendering/RenderFlexibleBox.cpp >@@ -1584,7 +1584,7 @@ void RenderFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, Vect > child.markForPaginationRelayoutIfNeeded(); > if (child.needsLayout()) > m_relaidOutChildren.add(&child); >- child.layoutIfNeeded(); >+ child.layoutIfNeeded(); // this may have repainted? > if (!childHadLayout && child.checkForRepaintDuringLayout()) { > child.repaint(); > child.repaintOverhangingFloats(true); >diff --git a/Source/WebCore/rendering/RenderImage.cpp b/Source/WebCore/rendering/RenderImage.cpp >index 85a101dc86c563b51c5e3150d3868561914baa91..3810d0272c998a9bba560111bff6b5d9ab7d7ee8 100644 >--- a/Source/WebCore/rendering/RenderImage.cpp >+++ b/Source/WebCore/rendering/RenderImage.cpp >@@ -230,11 +230,11 @@ bool RenderImage::requiresLayer() const > return false; > } > >-void RenderImage::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderImage::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > if (!hasInitializedStyle()) > imageResource().initialize(*this); >- RenderReplaced::styleWillChange(diff, newStyle); >+ RenderReplaced::styleWillChange(diff, newStyle, didRepaint); > } > > void RenderImage::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) >diff --git a/Source/WebCore/rendering/RenderImage.h b/Source/WebCore/rendering/RenderImage.h >index 82cc7419fe3747578fab6b252d90aee8b23d705d..1c01aea741a603c60c9bb657ad6b2da740a7c9e9 100644 >--- a/Source/WebCore/rendering/RenderImage.h >+++ b/Source/WebCore/rendering/RenderImage.h >@@ -86,7 +86,7 @@ protected: > void computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const final; > bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect, unsigned maxDepthToTest) const override; > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > void styleDidChange(StyleDifference, const RenderStyle*) override; > > void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override; >diff --git a/Source/WebCore/rendering/RenderInline.cpp b/Source/WebCore/rendering/RenderInline.cpp >index f041afce354f7e8954aa7b852389ae7741fda825..bf26307260735d3ee43cf943cae6cdcaaf1162a6 100644 >--- a/Source/WebCore/rendering/RenderInline.cpp >+++ b/Source/WebCore/rendering/RenderInline.cpp >@@ -155,9 +155,9 @@ static void updateStyleOfAnonymousBlockContinuations(const RenderBlock& block, c > } > } > >-void RenderInline::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderInline::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { >- RenderBoxModelObject::styleWillChange(diff, newStyle); >+ RenderBoxModelObject::styleWillChange(diff, newStyle, didRepaint); > // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block. > // Check if this non-anonymous containing block can hold the absolute positioned elements when the inline is no longer positioned. > if (canContainAbsolutelyPositionedObjects() && newStyle.position() == PositionType::Static) { >diff --git a/Source/WebCore/rendering/RenderInline.h b/Source/WebCore/rendering/RenderInline.h >index 549733860098f1014812229a14335796b8eafaca..e50ee9d193174bfe294360e9e5fac311342fe337 100644 >--- a/Source/WebCore/rendering/RenderInline.h >+++ b/Source/WebCore/rendering/RenderInline.h >@@ -95,7 +95,7 @@ public: > protected: > void willBeDestroyed() override; > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; > > void updateFromStyle() override; >diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp >index 8ad503e465da8d2273a3a3699e407ec81ce38d4c..6c04c9dbdef8b7c60b22f27a29dd027179736d17 100644 >--- a/Source/WebCore/rendering/RenderLayer.cpp >+++ b/Source/WebCore/rendering/RenderLayer.cpp >@@ -893,7 +893,7 @@ void RenderLayer::updateLayerPositions(RenderGeometryMap* geometryMap, OptionSet > RepaintLayoutRects oldRects = hadRepaintLayoutRects ? renderer().repaintLayoutRects() : RepaintLayoutRects(); > computeRepaintRects(repaintContainer, geometryMap); > >- auto hasRepaintLayoutRects = renderer().hasRepaintLayoutRects(); >+ auto hasRepaintLayoutRects = renderer().hasRepaintLayoutRects(); // layout may have done this repaint. > RepaintLayoutRects newRects = hasRepaintLayoutRects ? renderer().repaintLayoutRects() : RepaintLayoutRects(); > // FIXME: Should ASSERT that value calculated for m_outlineBox using the cached offset is the same > // as the value not using the cached offset, but we can't due to https://bugs.webkit.org/show_bug.cgi?id=37048 >diff --git a/Source/WebCore/rendering/RenderLayerModelObject.cpp b/Source/WebCore/rendering/RenderLayerModelObject.cpp >index 06fccde877916f96203765ba8e69cf8dc20b76da..fbb63e9c54e65c88a5bc34030526c6836b859ab4 100644 >--- a/Source/WebCore/rendering/RenderLayerModelObject.cpp >+++ b/Source/WebCore/rendering/RenderLayerModelObject.cpp >@@ -104,7 +104,7 @@ bool RenderLayerModelObject::hasSelfPaintingLayer() const > return m_layer && m_layer->isSelfPaintingLayer(); > } > >-void RenderLayerModelObject::styleWillChange(StyleDifference diff, const RenderStyle& newStyle) >+void RenderLayerModelObject::styleWillChange(StyleDifference diff, const RenderStyle& newStyle, bool& didRepaint) > { > s_wasFloating = isFloating(); > s_hadLayer = hasLayer(); >@@ -123,8 +123,13 @@ void RenderLayerModelObject::styleWillChange(StyleDifference diff, const RenderS > layer()->repaintIncludingDescendants(); > if (!(oldStyle->clip() == newStyle.clip())) > layer()->clearClipRectsIncludingDescendants(); >- } else if (diff == StyleDifference::Repaint || newStyle.outlineSize() < oldStyle->outlineSize()) >- repaint(); >+ } else if (diff == StyleDifference::Repaint || newStyle.outlineSize() < oldStyle->outlineSize()) { >+ if (!didRepaint) { >+ repaint(); >+ didRepaint = true; >+ } else >+ WTFLogAlways("RenderLayerModelObject %p styleWillChange would have done redundant repaint", this); >+ } > } > > if (diff == StyleDifference::Layout || diff == StyleDifference::SimplifiedLayout) { >@@ -143,12 +148,16 @@ void RenderLayerModelObject::styleWillChange(StyleDifference diff, const RenderS > } else if (newStyle.hasTransform() || newStyle.opacity() < 1 || newStyle.hasFilter() || newStyle.hasBackdropFilter()) { > // If we don't have a layer yet, but we are going to get one because of transform or opacity, > // then we need to repaint the old position of the object. >- repaint(); >+ if (!didRepaint) { >+ repaint(); >+ didRepaint = true; >+ } else >+ WTFLogAlways("RenderLayerModelObject %p styleWillChange 2 would have done redundant repaint", this); > } > } > } > >- RenderElement::styleWillChange(diff, newStyle); >+ RenderElement::styleWillChange(diff, newStyle, didRepaint); > } > > #if ENABLE(CSS_SCROLL_SNAP) >diff --git a/Source/WebCore/rendering/RenderLayerModelObject.h b/Source/WebCore/rendering/RenderLayerModelObject.h >index e605a48ba5516ff84c99f9fa66e7c2306886cdfc..5ffae5e7ab53c0b6304bfd5771a97a5f09e7802b 100644 >--- a/Source/WebCore/rendering/RenderLayerModelObject.h >+++ b/Source/WebCore/rendering/RenderLayerModelObject.h >@@ -46,7 +46,7 @@ public: > bool hasSelfPaintingLayer() const; > RenderLayer* layer() const { return m_layer.get(); } > >- void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; >+ void styleWillChange(StyleDifference, const RenderStyle& newStyle, bool& didRepaint) override; > void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; > virtual void updateFromStyle() { } > >diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp >index 676017c4c6c77a07b22739f0d567315f276be064..531da7b850d431be487ff9877a74f2e1746fa063 100644 >--- a/Source/WebCore/rendering/RenderObject.cpp >+++ b/Source/WebCore/rendering/RenderObject.cpp >@@ -73,6 +73,7 @@ > #include <stdio.h> > #include <wtf/IsoMallocInlines.h> > #include <wtf/RefCountedLeakCounter.h> >+#include <wtf/StackShot.h> > #include <wtf/text/TextStream.h> > > #if PLATFORM(IOS_FAMILY) >@@ -847,11 +848,41 @@ void RenderObject::propagateRepaintToParentWithOutlineAutoIfNeeded(const RenderL > ASSERT_NOT_REACHED(); > } > >+#define TRACK_REDUNDANT_REPAINTS 0 >+ >+#if TRACK_REDUNDANT_REPAINTS >+static const RenderObject* lastRepaintObject; >+static WTF::StackShot* lastRepaintStack; >+ >+static LayoutRect& lastRepaintRect() >+{ >+ static NeverDestroyed<LayoutRect> r; >+ return r; >+} >+#endif >+ > void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintContainer, const LayoutRect& r, bool shouldClipToLayer) const > { > if (r.isEmpty()) > return; > >+#if TRACK_REDUNDANT_REPAINTS >+ WTFLogAlways("RenderObject %p repaintUsingContainer %.2f, %.2f, %.2fx%.2f", this, >+ r.x().toFloat(), r.y().toFloat(), r.width().toFloat(), r.height().toFloat()); >+ >+ if (lastRepaintObject == this && lastRepaintRect() == r) { >+ WTFLogAlways("Duplicate repaint on %p", this); >+ lastRepaintStack->dump(); >+ WTFLogAlways("\n"); >+ } >+ >+ lastRepaintObject = this; >+ lastRepaintRect() = r; >+ >+ delete lastRepaintStack; >+ lastRepaintStack = new WTF::StackShot(15); >+#endif >+ > if (!repaintContainer) > repaintContainer = &view(); >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193433
: 359131