Issue #1382 - Part 1: Remove assertion that GetPreEffectsVisualOverflowRect is called only by frames whose parent is an anonymous block

This is always hit if an SVG effect is applied on other frame types.

Based on https://bugzilla.mozilla.org/show_bug.cgi?id=1340257
This commit is contained in:
FranklinDM 2023-02-25 02:02:59 +08:00 • committed by roytam1
commit 691afc8c8b

View file

@ -79,42 +79,20 @@ private:
if (r) { if (r) {
return *r; return *r;
} }
// Despite the fact that we're invoked for frames with SVG effects applied, #ifdef DEBUG
// we can actually get here. All continuations and IB split siblings of a // Having PreTransformOverflowAreasProperty cached means
// frame with SVG effects applied will have the PreEffectsBBoxProperty // GetVisualOverflowRect() will return post-effect rect, which is not what
// property set on them. Therefore, the frames that are passed to us will // we want. This function intentional reports pre-effect rect. But it does
// always have that property set...well, with one exception. If the frames // not matter if there is no SVG effect on this frame, since no effect
// for an element with SVG effects applied have been subject to an "IB // means post-effect rect matches pre-effect rect.
// split", then the block frame(s) that caused the split will have been if (nsSVGIntegrationUtils::UsingEffectsForFrame(aFrame)) {
// wrapped in anonymous, inline-block, nsBlockFrames of pseudo-type nsOverflowAreas* preTransformOverflows =
// nsCSSAnonBoxes::mozAnonymousBlock. These "IB split sibling" anonymous aFrame->GetProperty(aFrame->PreTransformOverflowAreasProperty());
// blocks will have the PreEffectsBBoxProperty property set on them, but
// they will never be passed to us. Instead, we'll be passed the block NS_ASSERTION(!preTransformOverflows,
// children that they wrap, which don't have the PreEffectsBBoxProperty "GetVisualOverflowRect() won't return the pre-effects rect!");
// property set on them. This is actually okay. What we care about is }
// collecting the _pre_ effects visual overflow rects of the frames to #endif
// which the SVG effects have been applied. Since the IB split results in
// any overflow rect adjustments for transforms, effects, etc. taking
// place on the anonymous block wrappers, the wrapped children are left
// with their overflow rects unaffected. In other words, calling
// GetVisualOverflowRect() on the children will return their pre-effects
// visual overflow rects, just as we need.
//
// A couple of tests that demonstrate the IB split and cause us to get here
// are:
//
// * reftests/svg/svg-integration/clipPath-html-06.xhtml
// * reftests/svg/svg-integration/clipPath-html-06-extref.xhtml
//
// If we ever got passed a frame with the PreTransformOverflowAreasProperty
// property set, that would be bad, since then our GetVisualOverflowRect()
// call would give us the post-effects, and post-transform, overflow rect.
//
NS_ASSERTION(aFrame->GetParent()->StyleContext()->GetPseudo() ==
nsCSSAnonBoxes::mozAnonymousBlock,
"How did we getting here, then?");
NS_ASSERTION(!aFrame->GetProperty(aFrame->PreTransformOverflowAreasProperty()),
"GetVisualOverflowRect() won't return the pre-effects rect!");
return aFrame->GetVisualOverflowRect(); return aFrame->GetVisualOverflowRect();
} }