| Index: LayoutTests/compositing/overflow/automatically-opt-into-composited-scrolling-after-style-change.html
|
| diff --git a/LayoutTests/compositing/overflow/automatically-opt-into-composited-scrolling-after-style-change.html b/LayoutTests/compositing/overflow/automatically-opt-into-composited-scrolling-after-style-change.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3f23bf33f4e6d70582e51619645618f14b9e0011
|
| --- /dev/null
|
| +++ b/LayoutTests/compositing/overflow/automatically-opt-into-composited-scrolling-after-style-change.html
|
| @@ -0,0 +1,221 @@
|
| +<!DOCTYPE html>
|
| +<html>
|
| +<head>
|
| + <style>
|
| + #predecessor {
|
| + width: 70px;
|
| + height: 70px;
|
| + left: 25px;
|
| + top: 25px;
|
| + z-index: 2;
|
| + background-color: red;
|
| + position: absolute;
|
| + display: none;
|
| + }
|
| +
|
| + #container {
|
| + width: 500px;
|
| + height: 500px;
|
| + position: absolute;
|
| + }
|
| +
|
| + #content {
|
| + width: 1px;
|
| + height: 1px;
|
| + background-color: yellow;
|
| + position: relative;
|
| + }
|
| +
|
| + #contentPredecessor {
|
| + z-index: 3;
|
| + width: 50px;
|
| + height: 50px;
|
| + background-color: blue;
|
| + position: relative;
|
| + display: none;
|
| + }
|
| +
|
| + #contentSuccessor {
|
| + width: 1000px;
|
| + height: 1000px;
|
| + background-color: green;
|
| + position: relative;
|
| + display: none;
|
| + }
|
| + </style>
|
| +
|
| + <script>
|
| + var debug = false;
|
| +
|
| + if (window.testRunner)
|
| + testRunner.dumpAsText(false);
|
| +
|
| + if (window.internals)
|
| + window.internals.settings.setAcceleratedCompositingForOverflowScrollEnabled(true);
|
| +
|
| + function writeResult(iteration, expectedResult)
|
| + {
|
| + document.body.offsetTop;
|
| +
|
| + if (!window.internals)
|
| + return;
|
| +
|
| + if (debug)
|
| + writeDebug(iteration);
|
| +
|
| + var result = document.getElementById('result');
|
| + result.innerText += "iteration " + iteration + ": ";
|
| +
|
| + var hasLayerTree = !!window.internals.layerTreeAsText(document);
|
| + if (hasLayerTree === expectedResult)
|
| + result.innerText += "PASS, ";
|
| + else
|
| + result.innerText += "FAIL, ";
|
| +
|
| + if (hasLayerTree)
|
| + result.innerText += "has layer tree.\n";
|
| + else
|
| + result.innerText += "does not have layer tree.\n";
|
| + }
|
| +
|
| + function writeDebug(iteration)
|
| + {
|
| + var result = document.getElementById('result');
|
| + var content = document.getElementById('content');
|
| + var container = document.getElementById('container');
|
| + var contentPredecessor = document.getElementById('contentPredecessor');
|
| + var contentSuccessor = document.getElementById('contentSuccessor');
|
| +
|
| + var elements = [container, contentPredecessor, content, contentSuccessor];
|
| +
|
| + for (var i = 0; i < elements.length; i++) {
|
| + var element = elements[i];
|
| + var computedStyle = getComputedStyle(element);
|
| +
|
| + result.innerText += "iteration " + iteration + ":\n";
|
| + result.innerText += "\telement: " + element.id + "\n";
|
| + result.innerText += "\theight: " + computedStyle.height + "\n";
|
| + result.innerText += "\twidth: " + computedStyle.width + "\n";
|
| + result.innerText += "\toverflowX: " + computedStyle.overflowX + "\n";
|
| + result.innerText += "\toverflowY: " + computedStyle.overflowY + "\n";
|
| + result.innerText += "\tdisplay: " + computedStyle.display + "\n";
|
| + result.innerText += "\tzIndex: " + computedStyle.zIndex + "\n";
|
| + }
|
| + }
|
| +
|
| + function doSuccessorTest(test, testIndex)
|
| + {
|
| + container = document.getElementById('container');
|
| + contentSuccessor = document.getElementById('contentSuccessor');
|
| +
|
| + content.style.width = test['width'];
|
| + content.style.height = test['height'];
|
| + container.style.overflowX = test['overflowX'];
|
| + container.style.overflowY = test['overflowY'];
|
| + contentSuccessor.style.display = test['display'];
|
| +
|
| + var descendantCausesOverflow = test['width'] === '1000px' || test['height'] === '1000px' || test['display'] === 'block';
|
| + var containerScrolls = test['overflowX'] === 'scroll' || test['overflowY'] === 'scroll';
|
| +
|
| + var shouldOptIn = descendantCausesOverflow && containerScrolls;
|
| +
|
| + writeResult(testIndex, shouldOptIn);
|
| + }
|
| +
|
| + function doPredecessorTest(test, testIndex)
|
| + {
|
| + container = document.getElementById('container');
|
| + contentPredecessor = document.getElementById('contentPredecessor');
|
| +
|
| + contentPredecessor.style.display = test['display'];
|
| + container.style.zIndex = test['zIndex'];
|
| +
|
| + var containerIsAStackingContext = test['zIndex'] === '1';
|
| + var predecessorIsInvisible = test['display'] === 'none';
|
| +
|
| + // If the contentPredecessor is visible and the container is not a stacking
|
| + // context, then a non-descendant appears between our descendants; we
|
| + // fail the contiguity check and we should not opt in. If we are a
|
| + // stacking context or the predecessor is gone, we can opt in.
|
| + var shouldOptIn = containerIsAStackingContext || predecessorIsInvisible;
|
| +
|
| + writeResult(testIndex, shouldOptIn);
|
| + }
|
| +
|
| + function runTests()
|
| + {
|
| + var successorTests = [
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'visible', 'overflowY': 'scroll', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'visible', 'display': 'block' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'none' },
|
| + { 'width': '1000px', 'height': '1000px', 'overflowX': 'scroll', 'overflowY': 'scroll', 'display': 'block' }
|
| + ];
|
| +
|
| + var predecessorTests = [
|
| + { 'display': 'block', 'zIndex': '1' },
|
| + { 'display': 'block', 'zIndex': 'auto' },
|
| + { 'display': 'none', 'zIndex': '1' },
|
| + { 'display': 'none', 'zIndex': 'auto' },
|
| + ];
|
| +
|
| + var testIndex = 0;
|
| + writeResult(testIndex++, false);
|
| +
|
| + for (var i = 0; i < successorTests.length; i++)
|
| + doSuccessorTest(successorTests[i], testIndex++);
|
| +
|
| + content.style.height = '1000px';
|
| + content.style.width = '1000px';
|
| + container.style.overflowX = 'scroll';
|
| + container.style.overflowY = 'scroll';
|
| + contentSuccessor.style.display = 'none';
|
| + predecessor.style.display = 'block';
|
| +
|
| + writeResult(testIndex++, true);
|
| +
|
| + for (var i = 0; i < predecessorTests.length; i++)
|
| + doPredecessorTest(predecessorTests[i], testIndex++);
|
| + }
|
| +
|
| + window.addEventListener('load', runTests, false);
|
| + </script>
|
| +</head>
|
| +
|
| +<body>
|
| + <div id="predecessor"></div>
|
| + <div id="container">
|
| + <div id="contentPredecessor"></div>
|
| + <div id="content"></div>
|
| + <div id="contentSuccessor"></div>
|
| + </div>
|
| + <pre id="result"></pre>
|
| +</body>
|
| +</html>
|
|
|