Bug 1473376: Ensure hit test regions never grow excessively complex. r=kats
MozReview-Commit-ID: JpkdVSPbeAI
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -9466,16 +9466,26 @@ nsLayoutUtils::TransformToAncestorAndCom
if (aClip->GetRoundedRectCount() > 0) {
isPrecise = false;
}
}
transformedRegion.OrWith(transformed);
}
nsRegion* dest = isPrecise ? aPreciseTargetDest : aImpreciseTargetDest;
dest->OrWith(transformedRegion.ToRegion());
+ // If the region becomes too complex this has a large performance impact.
+ // We limit its complexity here.
+ if (dest->GetNumRects() > 12) {
+ dest->SimplifyOutward(6);
+ if (isPrecise) {
+ aPreciseTargetDest->OrWith(*aImpreciseTargetDest);
+ *aImpreciseTargetDest = std::move(*aPreciseTargetDest);
+ *aPreciseTargetDest = nsRegion();
+ }
+ }
}
/* static */ bool
nsLayoutUtils::ShouldUseNoScriptSheet(nsIDocument* aDocument)
{
// also handle the case where print is done from print preview
// see bug #342439 for more details
if (aDocument->IsStaticDocument()) {