Bug 1322330 - Part 3. Implement EffectProperties::HasInvalidMask.
MozReview-Commit-ID: 7bEheewinTl
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -7270,17 +7270,18 @@ nsDisplayMask::BuildLayer(nsDisplayListB
return nullptr;
}
nsIFrame* firstFrame =
nsLayoutUtils::FirstContinuationOrIBSplitSibling(mFrame);
nsSVGEffects::EffectProperties effectProperties =
nsSVGEffects::GetEffectProperties(firstFrame);
- if (effectProperties.HasInvalidClipPath()) {
+ if (effectProperties.HasInvalidClipPath() ||
+ effectProperties.HasInvalidMask()) {
return nullptr;
}
RefPtr<ContainerLayer> container = aManager->GetLayerBuilder()->
BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList,
aContainerParameters, nullptr);
return container.forget();
--- a/layout/svg/nsSVGEffects.cpp
+++ b/layout/svg/nsSVGEffects.cpp
@@ -664,32 +664,18 @@ nsSVGEffects::EffectProperties::GetMaskF
}
return result;
}
bool
nsSVGEffects::EffectProperties::HasNoOrValidEffects()
{
- if (HasInvalidClipPath()) {
- return false;
- }
-
- if (mMask) {
- bool ok = true;
- const nsTArray<RefPtr<nsSVGPaintingProperty>>& props = mMask->GetProps();
- for (size_t i = 0; i < props.Length(); i++) {
- props[i]->GetReferencedFrame(nsGkAtoms::svgMaskFrame, &ok);
- if (!ok) {
- return false;
- }
- }
- }
-
- return HasNoFilterOrHasValidFilter();
+ return HasNoOrValidClipPath() && HasNoOrValidMask() &&
+ HasNoFilterOrHasValidFilter();
}
bool
nsSVGEffects::EffectProperties::MightHaveNoneSVGMask() const
{
if (!mMask) {
return false;
}
@@ -715,16 +701,33 @@ nsSVGEffects::EffectProperties::HasNoOrV
if (!ok || (frame && !frame->IsValid())) {
return false;
}
}
return true;
}
+bool
+nsSVGEffects::EffectProperties::HasNoOrValidMask()
+{
+ if (mMask) {
+ bool ok = true;
+ const nsTArray<RefPtr<nsSVGPaintingProperty>>& props = mMask->GetProps();
+ for (size_t i = 0; i < props.Length(); i++) {
+ props[i]->GetReferencedFrame(nsGkAtoms::svgMaskFrame, &ok);
+ if (!ok) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
void
nsSVGEffects::UpdateEffects(nsIFrame* aFrame)
{
NS_ASSERTION(aFrame->GetContent()->IsElement(),
"aFrame's content should be an element");
FrameProperties props = aFrame->Properties();
props.Delete(FilterProperty());
--- a/layout/svg/nsSVGEffects.h
+++ b/layout/svg/nsSVGEffects.h
@@ -506,16 +506,29 @@ public:
/*
* @return true if we have an invalid clip-path.
*/
bool HasInvalidClipPath() {
return !HasNoOrValidClipPath();
}
+ /*
+ * @return true if we either do not have mask or all masks we have
+ * are valid.
+ */
+ bool HasNoOrValidMask();
+
+ /*
+ * @return true if we have an invalid mask.
+ */
+ bool HasInvalidMask() {
+ return !HasNoOrValidMask();
+ }
+
bool HasValidFilter() {
return mFilter && mFilter->ReferencesValidResources();
}
bool HasNoFilterOrHasValidFilter() {
return !mFilter || mFilter->ReferencesValidResources();
}
};