Bug 1467688 - Make sure we invalidate for perspective changes even if the frame isn't otherwise transformed. r?dbaron
MozReview-Commit-ID: JQGb41kp76P
new file mode 100644
--- /dev/null
+++ b/layout/base/crashtests/1467688.html
@@ -0,0 +1,16 @@
+<html class="reftest-wait">
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+</head>
+<body style="transform:translate(4px)">
+<div id="invalid" style="width:100px; height:100px; background-color:red;"></div>
+<script>
+ function doTest() {
+ document.documentElement.style.perspective = '100px';
+ document.getElementById("invalid").style.backgroundColor = "green";
+ document.documentElement.removeAttribute("class");
+ }
+ window.addEventListener("MozReftestInvalidate", doTest);
+</script>
+</body>
+</html>
--- a/layout/base/crashtests/crashtests.list
+++ b/layout/base/crashtests/crashtests.list
@@ -539,10 +539,11 @@ load 1453196.html
load 1453342.html
load 1453702.html
pref(dom.webcomponents.shadowdom.enabled,true) load 1461749.html
load 1461812.html
load 1462412.html
load 1463940.html
pref(dom.webcomponents.shadowdom.enabled,true) HTTP load 1464641.html
load 1464737.html
+load 1467688.html
load 1467964.html
load 1469354.html
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3858,23 +3858,17 @@ nsStyleDisplay::CalcDifference(const nsS
for (uint8_t index = 0; index < 2; ++index) {
if (mPerspectiveOrigin[index] != aNewData.mPerspectiveOrigin[index]) {
transformHint |= kUpdateOverflowAndRepaintHint;
break;
}
}
- if (HasPerspectiveStyle() != aNewData.HasPerspectiveStyle()) {
- // A change from/to being a containing block for position:fixed.
- hint |= nsChangeHint_UpdateContainingBlock;
- }
-
- if (mChildPerspective != aNewData.mChildPerspective ||
- mTransformStyle != aNewData.mTransformStyle ||
+ if (mTransformStyle != aNewData.mTransformStyle ||
mTransformBox != aNewData.mTransformBox) {
transformHint |= kUpdateOverflowAndRepaintHint;
}
if (mBackfaceVisibility != aNewData.mBackfaceVisibility) {
transformHint |= nsChangeHint_RepaintFrame;
}
@@ -3882,16 +3876,26 @@ nsStyleDisplay::CalcDifference(const nsS
if (HasTransformStyle()) {
hint |= transformHint;
} else {
hint |= nsChangeHint_NeutralChange;
}
}
}
+ if (HasPerspectiveStyle() != aNewData.HasPerspectiveStyle()) {
+ // A change from/to being a containing block for position:fixed.
+ hint |= nsChangeHint_UpdateContainingBlock |
+ nsChangeHint_UpdateOverflow |
+ nsChangeHint_RepaintFrame;
+ } else if (mChildPerspective != aNewData.mChildPerspective) {
+ hint |= nsChangeHint_UpdateOverflow |
+ nsChangeHint_RepaintFrame;
+ }
+
// Note that the HasTransformStyle() != aNewData.HasTransformStyle()
// test above handles relevant changes in the
// NS_STYLE_WILL_CHANGE_TRANSFORM bit, which in turn handles frame
// reconstruction for changes in the containing block of
// fixed-positioned elements.
uint8_t willChangeBitsChanged =
mWillChangeBitField ^ aNewData.mWillChangeBitField;
if (willChangeBitsChanged & (NS_STYLE_WILL_CHANGE_STACKING_CONTEXT |