Bug 1349477, part 4 - Use AutoReferenceChainGuard in nsSVGMaskFrame. r=longsonr

MozReview-Commit-ID: 5tVLBcTOLQZ
This commit is contained in:
Jonathan Watt 2017-02-21 10:47:22 +00:00
parent 1fdd3184b8
commit 2773e5508d
2 changed files with 7 additions and 28 deletions

View File

@ -7,6 +7,7 @@
#include "nsSVGMaskFrame.h"
// Keep others in (case-insensitive) order:
#include "AutoReferenceChainGuard.h"
#include "gfx2DGlue.h"
#include "gfxContext.h"
#include "mozilla/gfx/2D.h"
@ -204,14 +205,14 @@ NS_IMPL_FRAMEARENA_HELPERS(nsSVGMaskFrame)
mozilla::Pair<DrawResult, RefPtr<SourceSurface>>
nsSVGMaskFrame::GetMaskForMaskedFrame(MaskParams& aParams)
{
// If the flag is set when we get here, it means this mask frame
// has already been used painting the current mask, and the document
// has a mask reference loop.
if (mInUse) {
NS_WARNING("Mask loop detected!");
// Make sure we break reference loops and over long reference chains:
static int16_t sRefChainLengthCounter = AutoReferenceChainGuard::noChain;
AutoReferenceChainGuard refChainGuard(this, &mInUse,
&sRefChainLengthCounter);
if (MOZ_UNLIKELY(!refChainGuard.Reference())) {
// Break reference chain
return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
}
AutoMaskReferencer maskRef(this);
gfxRect maskArea = GetMaskArea(aParams.maskedFrame);
gfxContext* context = aParams.ctx;

View File

@ -111,28 +111,6 @@ private:
*/
gfxMatrix GetMaskTransform(nsIFrame* aMaskedFrame);
// A helper class to allow us to paint masks safely. The helper
// automatically sets and clears the mInUse flag on the mask frame
// (to prevent nasty reference loops). It's easy to mess this up
// and break things, so this helper makes the code far more robust.
class MOZ_RAII AutoMaskReferencer
{
public:
explicit AutoMaskReferencer(nsSVGMaskFrame *aFrame
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: mFrame(aFrame) {
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
NS_ASSERTION(!mFrame->mInUse, "reference loop!");
mFrame->mInUse = true;
}
~AutoMaskReferencer() {
mFrame->mInUse = false;
}
private:
nsSVGMaskFrame *mFrame;
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
gfxMatrix mMatrixForChildren;
// recursion prevention flag
bool mInUse;