Bug 1295094 - Part 4. Implement ValidateSVGFrame r=mstange

MozReview-Commit-ID: GdO647a09Xo

--HG--
extra : rebase_source : cda0319ed0728fb705658055c9386eb108debef8
This commit is contained in:
cku 2016-08-16 00:05:10 +08:00
Родитель 33f7856d09
Коммит 1843b41cce
1 изменённых файлов: 28 добавлений и 13 удалений

Просмотреть файл

@ -623,8 +623,9 @@ ComputeOpacity(const nsSVGIntegrationUtils::PaintFramesParams& aParams)
return opacity; return opacity;
} }
DrawResult static bool
nsSVGIntegrationUtils::PaintFramesWithEffects(const PaintFramesParams& aParams) ValidateSVGFrame(const nsSVGIntegrationUtils::PaintFramesParams& aParams,
bool aHasSVGLayout, DrawResult* aResult)
{ {
#ifdef DEBUG #ifdef DEBUG
NS_ASSERTION(!(aParams.frame->GetStateBits() & NS_FRAME_SVG_LAYOUT) || NS_ASSERTION(!(aParams.frame->GetStateBits() & NS_FRAME_SVG_LAYOUT) ||
@ -633,6 +634,28 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(const PaintFramesParams& aParams)
"Should not use nsSVGIntegrationUtils on this SVG frame"); "Should not use nsSVGIntegrationUtils on this SVG frame");
#endif #endif
nsIFrame* frame = aParams.frame;
const nsIContent* content = frame->GetContent();
if (aHasSVGLayout) {
nsISVGChildFrame *svgChildFrame = do_QueryFrame(frame);
if (!svgChildFrame || !frame->GetContent()->IsSVGElement()) {
NS_ASSERTION(false, "why?");
*aResult = DrawResult::BAD_ARGS;
return false;
}
if (!static_cast<const nsSVGElement*>(content)->HasValidDimensions()) {
// The SVG spec says not to draw _anything_
*aResult = DrawResult::SUCCESS;
return false;
}
}
return true;
}
DrawResult
nsSVGIntegrationUtils::PaintFramesWithEffects(const PaintFramesParams& aParams)
{
/* SVG defines the following rendering model: /* SVG defines the following rendering model:
* *
* 1. Render geometry * 1. Render geometry
@ -647,17 +670,10 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(const PaintFramesParams& aParams)
* + Merge opacity and masking if both used together. * + Merge opacity and masking if both used together.
*/ */
nsIFrame* frame = aParams.frame; nsIFrame* frame = aParams.frame;
const nsIContent* content = frame->GetContent(); DrawResult result = DrawResult::SUCCESS;
bool hasSVGLayout = (frame->GetStateBits() & NS_FRAME_SVG_LAYOUT); bool hasSVGLayout = (frame->GetStateBits() & NS_FRAME_SVG_LAYOUT);
if (hasSVGLayout) { if (!ValidateSVGFrame(aParams, hasSVGLayout, &result)) {
nsISVGChildFrame *svgChildFrame = do_QueryFrame(frame); return result;
if (!svgChildFrame || !frame->GetContent()->IsSVGElement()) {
NS_ASSERTION(false, "why?");
return DrawResult::BAD_ARGS;
}
if (!static_cast<const nsSVGElement*>(content)->HasValidDimensions()) {
return DrawResult::SUCCESS; // The SVG spec says not to draw _anything_
}
} }
float opacity = ComputeOpacity(aParams); float opacity = ComputeOpacity(aParams);
@ -764,7 +780,6 @@ nsSVGIntegrationUtils::PaintFramesWithEffects(const PaintFramesParams& aParams)
targetOffset = drawRect.TopLeft(); targetOffset = drawRect.TopLeft();
} }
DrawResult result = DrawResult::SUCCESS;
bool shouldGenerateMask = (opacity != 1.0f || shouldGenerateClipMaskLayer || bool shouldGenerateMask = (opacity != 1.0f || shouldGenerateClipMaskLayer ||
shouldGenerateMaskLayer); shouldGenerateMaskLayer);