| Index: LayoutTests/fast/dynamic/position-change-to-absolute-with-positioned-child-crash.html | 
| diff --git a/LayoutTests/fast/dynamic/position-change-to-absolute-with-positioned-child-crash.html b/LayoutTests/fast/dynamic/position-change-to-absolute-with-positioned-child-crash.html | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..891e8198c4b70d85ce5dad88331228b1f78338b5 | 
| --- /dev/null | 
| +++ b/LayoutTests/fast/dynamic/position-change-to-absolute-with-positioned-child-crash.html | 
| @@ -0,0 +1,129 @@ | 
| +<!DOCTYPE HTML> | 
| +<script src="../../resources/testharness.js"></script> | 
| +<script src="../../resources/testharnessreport.js"></script> | 
| +<div id="log"></div> | 
| +<div id="container"> | 
| +<p id="description"> | 
| +    This tests that changing the container's position from fixed or relative to absolute is safe,<br> | 
| +    when child container with fixed position is present.<br> | 
| +    PASS, if no crash or assert in debug. | 
| +</p> | 
| +</div> | 
| +<script> | 
| +var valueList = ["static", "relative", "absolute", "fixed"] | 
| +for (var outerValue of valueList) { | 
| +    for (var innerValue of valueList) { | 
| +        for (var afterValue of valueList) { | 
| +            var tests = []; | 
| +            var outerElement, innerElement, midElement; | 
| +            if (outerValue !== afterValue) { | 
| +                outerElement = document.createElement("div"); | 
| +                innerElement = document.createElement("div"); | 
| +                outerElement.style.position = outerValue; | 
| +                innerElement.style.position = innerValue; | 
| +                outerElement.appendChild(innerElement); | 
| +                container.appendChild(outerElement); | 
| +                tests.push(["position:" + outerValue + " with a " + innerValue + " child to " + afterValue, function () { | 
| +                    outerElement.style.position = afterValue; | 
| +                }]); | 
| + | 
| +                outerElement = document.createElement("div"); | 
| +                innerElement = document.createElement("div"); | 
| +                outerElement.style.position = outerValue; | 
| +                outerElement.style.transform = "rotate(3deg)"; | 
| +                innerElement.style.position = innerValue; | 
| +                outerElement.appendChild(innerElement); | 
| +                container.appendChild(outerElement); | 
| +                tests.push(["position:" + outerValue + " with a " + innerValue + " child to " + afterValue, function () { | 
| +                    outerElement.style.position = afterValue; | 
| +                }]); | 
| + | 
| +                outerElement = document.createElement("div"); | 
| +                innerElement = document.createElement("div"); | 
| +                outerElement.style.position = outerValue; | 
| +                outerElement.style.transform = "rotate(3deg)"; | 
| +                innerElement.style.position = innerValue; | 
| +                outerElement.appendChild(innerElement); | 
| +                container.appendChild(outerElement); | 
| +                tests.push(["position:" + outerValue + " and transform with a " + innerValue + " child to " + afterValue + " without transform", function () { | 
| +                    outerElement.style.position = afterValue; | 
| +                    outerElement.style.transform = "none"; | 
| +                    innerElement.style.width = "50%"; | 
| +                }]); | 
| +            } | 
| + | 
| +            outerElement = document.createElement("div"); | 
| +            midElement = document.createElement("div"); | 
| +            innerElement = document.createElement("div"); | 
| +            outerElement.style.position = outerValue; | 
| +            innerElement.style.position = innerValue; | 
| +            outerElement.appendChild(midElement); | 
| +            midElement.appendChild(innerElement); | 
| +            container.appendChild(outerElement); | 
| +            tests.push(["position:static with a " + outerValue + " parent and a " + innerValue + " child to " + afterValue, function () { | 
| +                midElement.style.position = afterValue; | 
| +                innerElement.style.width = "50%"; | 
| +            }]); | 
| +        } | 
| + | 
| +        outerElement = document.createElement("div"); | 
| +        midElement = document.createElement("div"); | 
| +        innerElement = document.createElement("div"); | 
| +        outerElement.style.position = outerValue; | 
| +        innerElement.style.position = innerValue; | 
| +        outerElement.appendChild(midElement); | 
| +        midElement.appendChild(innerElement); | 
| +        container.appendChild(outerElement); | 
| +        tests.push(["position:static with a " + outerValue + " parent and a " + innerValue + " child to transform", function () { | 
| +            midElement.style.transform = "translateX(0)"; | 
| +            innerElement.style.width = "50%"; | 
| +        }]); | 
| + | 
| +        outerElement = document.createElement("div"); | 
| +        midElement = document.createElement("div"); | 
| +        innerElement = document.createElement("div"); | 
| +        outerElement.style.position = outerValue; | 
| +        midElement.style.transform = "translateX(0)"; | 
| +        innerElement.style.position = innerValue; | 
| +        outerElement.appendChild(midElement); | 
| +        midElement.appendChild(innerElement); | 
| +        container.appendChild(outerElement); | 
| +        tests.push(["position:static and transform with a " + outerValue + " parent and a " + innerValue + " child to without transform", function () { | 
| +            midElement.style.transform = "none"; | 
| +            innerElement.style.width = "50%"; | 
| +        }]); | 
| + | 
| +        outerElement = document.createElement("div"); | 
| +        innerElement = document.createElement("div"); | 
| +        outerElement.style.position = outerValue; | 
| +        innerElement.style.position = innerValue; | 
| +        outerElement.appendChild(innerElement); | 
| +        container.appendChild(outerElement); | 
| +        tests.push(["Add transform position:" + outerValue + " with a " + innerValue + " child", function () { | 
| +            outerElement.style.transform = "rotate(3deg)"; | 
| +            innerElement.style.width = "50%"; | 
| +        }]); | 
| + | 
| +        outerElement = document.createElement("div"); | 
| +        innerElement = document.createElement("div"); | 
| +        outerElement.style.position = outerValue; | 
| +        outerElement.style.transform = "rotate(3deg)"; | 
| +        innerElement.style.position = innerValue; | 
| +        outerElement.appendChild(innerElement); | 
| +        container.appendChild(outerElement); | 
| +        tests.push(["Remove transform from position:" + outerValue + " and transform with a " + innerValue + " child", function () { | 
| +            outerElement.style.transform = "none"; | 
| +            innerElement.style.width = "50%"; | 
| +        }]); | 
| + | 
| +        document.body.offsetHeight; | 
| +        for (var t of tests) { | 
| +            test(function () { | 
| +                t[1](); | 
| +                // No assert() are needed, we just check layout hits no ASSERT nor crash. | 
| +                document.body.offsetHeight; | 
| +            }, t[0]); | 
| +        } | 
| +    } | 
| +} | 
| +</script> | 
|  |