Bug 1030604 - Use nsChangeHint_UpdateOverflow for clip-path and mask changes so we update the PreEffectsBBoxProperty and run the effect on the correct area. r=roc

The testcase is a slight simplification of dholbert's testcase 2
(attachment 8456312) in the bug.  It fails in the reftest harness
without the patch, and passes in the reftest harness with the patch.
This commit is contained in:
L. David Baron 2014-07-15 22:27:12 -07:00
parent cbcf674ada
commit cfb436efb1
5 changed files with 121 additions and 7 deletions

View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html>
<head>
<style>
#container {
border: 3px dotted black;
background: yellow;
overflow: hidden;
width: 400px;
max-height: 25px;
}
#container.masked {
mask: url('#fade_mask_bottom');
}
.item {
font-size: 30px;
}
</style>
</head>
<body>
<div id='container' class="masked"><div class="item">PASS</div></div>
<!-- BEGIN SVG MASK: -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<mask id="fade_mask_bottom"
maskUnits="objectBoundingBox" maskContentUnits="objectBoundingBox">
<linearGradient id="fade_gradient_bottom"
gradientUnits="objectBoundingBox" x2="0" y2="1">
<stop stop-color="white" stop-opacity="1" offset="0.7"></stop>
<stop stop-color="white" stop-opacity="0" offset="1"></stop>
</linearGradient>
<rect x="0" y="0" width="1" height="1"
fill="url(#fade_gradient_bottom)"></rect>
</mask>
</svg>
<!-- END SVG MASK -->
</body>
</html>

View File

@ -0,0 +1,71 @@
<!DOCTYPE html>
<html class="reftest-wait">
<head>
<style>
#container {
border: 3px dotted black;
background: yellow;
overflow: hidden;
width: 400px;
max-height: 25px;
}
#container.masked {
mask: url('#fade_mask_bottom');
}
.item {
font-size: 30px;
}
</style>
<script>
function go() {
clear();
insert();
}
function clear() {
// Force reflow:
container.offsetHeight;
// Remove mask:
container.classList.remove('masked');
}
function insert() {
// Add new child:
var notificationNode = document.createElement('div');
notificationNode.classList.add('item');
notificationNode.appendChild(document.createTextNode("PASS"));
var container = document.getElementById('container');
container.appendChild(notificationNode);
// Force reflow:
container.offsetHeight;
// Add back mask:
container.classList.add('masked');
document.documentElement.classList.remove('reftest-wait');
}
</script>
</head>
<body onload="go();">
<div id='container' class="masked"></div>
<!-- BEGIN SVG MASK: -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<mask id="fade_mask_bottom"
maskUnits="objectBoundingBox" maskContentUnits="objectBoundingBox">
<linearGradient id="fade_gradient_bottom"
gradientUnits="objectBoundingBox" x2="0" y2="1">
<stop stop-color="white" stop-opacity="1" offset="0.7"></stop>
<stop stop-color="white" stop-opacity="0" offset="1"></stop>
</linearGradient>
<rect x="0" y="0" width="1" height="1"
fill="url(#fade_gradient_bottom)"></rect>
</mask>
</svg>
<!-- END SVG MASK -->
</body>
</html>

View File

@ -89,6 +89,7 @@ skip-if(B2G) == dynamic-marker-02.svg dynamic-marker-02-ref.svg
skip-if(B2G) == dynamic-marker-03.svg pass.svg
== dynamic-mask-01.svg pass.svg
skip-if(B2G) == dynamic-mask-contents-01.svg pass.svg
== dynamic-mask-pre-effects-bbox.html dynamic-mask-pre-effects-bbox-ref.html
== dynamic-opacity-property-01.svg pass.svg
skip-if(B2G) == dynamic-pattern-01.svg pass.svg
skip-if(B2G) == dynamic-pattern-02.svg pass.svg

View File

@ -1154,17 +1154,16 @@ nsChangeHint nsStyleSVGReset::CalcDifference(const nsStyleSVGReset& aOther) cons
{
nsChangeHint hint = nsChangeHint(0);
bool equalFilters = (mFilters == aOther.mFilters);
if (!equalFilters) {
NS_UpdateHint(hint, nsChangeHint_UpdateOverflow);
}
if (!EqualURIs(mClipPath, aOther.mClipPath) ||
!EqualURIs(mMask, aOther.mMask) ||
!equalFilters) {
mFilters != aOther.mFilters) {
NS_UpdateHint(hint, nsChangeHint_UpdateEffects);
NS_UpdateHint(hint, nsChangeHint_RepaintFrame);
// We only actually need to update the overflow area for filter
// changes. However, mask and clip-path changes require that we
// update the PreEffectsBBoxProperty, which is done during overflow
// computation.
NS_UpdateHint(hint, nsChangeHint_UpdateOverflow);
}
if (mDominantBaseline != aOther.mDominantBaseline) {

View File

@ -2720,6 +2720,9 @@ struct nsStyleFilter {
nsStyleFilter& operator=(const nsStyleFilter& aOther);
bool operator==(const nsStyleFilter& aOther) const;
bool operator!=(const nsStyleFilter& aOther) const {
return !(*this == aOther);
}
int32_t GetType() const {
return mType;